Как вывести на экран рисунок рисования с помощью ящика ncurses? - PullRequest
2 голосов
/ 27 апреля 2020

Я пишу приложение, используя Rust и ncurses.

Я пытаюсь отобразить символ рисования коробки ('┃' (Unicode 9475 / 0x2503)), но это как если бы оно даже не печаталось на экран. Когда я выделяю текст, можно увидеть:

Screenshot

Вот минимальный пример:

use ncurses::*;

fn populate_line_numbers() {
    for i in 0..LINES() {
        mvaddstr(i, 0, &i.to_string());
    }
    mvvline(0, 4, 9475, LINES());
    refresh();
}

fn main() {
    setlocale(LcCategory::all, "");
    initscr();
    start_color();
    keypad(stdscr(), true);
    noecho();
    loop {
        let user_input = get_wch();
        match user_input.unwrap() {
            WchResult::Char(ch) => {
                match ch {
                    27 => break,
                    _ => {
                        addstr(&std::char::from_u32(ch).unwrap().to_string());
                        refresh();
                    }
                }
            },
            WchResult::KeyCode(code) => {
                match code {
                    KEY_F5 => {
                        populate_line_numbers();
                    },
                    _ => {}
                }
            }
        }
    }
    endwin();
}

Нажмите F5 , чтобы сделать программа показывает номера строк.

Как символ может быть похож на обычный текст? Я пытался сделать это вместе с кучей вещей, но ничего не получилось.

Автомобиль go .toml

[dependencies]
ncurses = { version = "5.99.0", features = ["wide"] }

1 Ответ

1 голос
/ 28 апреля 2020

Примечание автора: Ниже приведен анализ с максимальными усилиями, основанный главным образом на анализе ncurses.h в моей системе и сравнении его с исходным кодом ncurses-rs, Я могу ошибаться в некоторых деталях.

В ncurses псевдоним типа chtype (который является третьим аргументом mvvline) представляет однобайтовый символ плюс некоторые метаданные внешнего вида. Он не может хранить многобайтовый символ. Поэтому mvvline просто не может отображать .

(Предположительно, причина, по которой вы получаете невидимую строку, заключается в том, что значение 9475 представляет управляющий символ с некоторой фиктивной информацией о внешнем виде. Я не смог понять о том, как его декодировать. Если вы возитесь с байтовыми значениями, я уверен, что вы можете получить линию, чтобы изменить цвета и содержать любой символ ASCII, который вы хотите.)

Чтобы нарисовать линию, используя "широкий" (многобайтовый) символ, вы должны указать ссылку на версию ncurses с поддержкой широких символов и использовать версию широких символов mvvline, которая называется mvvline_set. Эта функция принимает аргумент const cchar_t * вместо chtype, где cchar_t - это структура, содержащая многобайтовый символ плюс некоторые метаданные.

К сожалению, хотя ящик ncurses ссылается на правильную версию ncurses библиотека, она не предоставляет никакого способа вызова mvvline_set. Существует ряд других функций, которые также отсутствуют в API ncurses-rs, в основном те, которые используют структуру cchar_t. Это означает, что вы не сможете использовать символы рисования линий Unicode в символьно-ориентированных функциях ncurses, если вы сами не напишите привязки.

Вы все равно сможете использовать многобайтовые символы в строках UTF-8 и передать их строковым функциям, таким как mvaddstr.

...