LINUX.ORG.RU

функция winstr библиотеки ncurses

 


0

1

Здравствуйте! Пытаюсь сохранить вывод окна (Windows) в строку и затем отобразить ее. Делал это с помощью функций winstr, winnstr. Проблема в том, что некоторые символы окна типа '-' (горизонтальная линия в рамке) при сохранении в строку заменяются на 'q', '|' (вертикальная линия в рамке) - на 'x' и т.д. Мне же нужно получить текстовое представление окна именно в том виде, в котором ncurses выводит его на терминал (с рамкой). Кто-нибудь может помочь разобраться?

Перемещено maxcom из linux-org-ru

может с локалью проблемы?

попробуй самой первой командой в main() вызвать setlocale(LC_ALL, "");

dikiy ★★☆☆☆
()
Ответ на: комментарий от Ilya-Novikov

Пардон, не внимательно вопрос с телефона прочёл. В данном случае рамки — это спецсимволы (ESC) терминала (vt220/xterm/etc.), а не ANSI символы. (Как раз те самые `q' и `x'). Попробуй выставить терминал в ansi.

Альтернативно, если есть доступ к src, border/wborder/box можно передать символы для рамки, которые но должен использовать.

beastie ★★★★★
()
Ответ на: комментарий от beastie

выставил терминал в ansi. Тоже не помогло. ncurses начал рисовать в терминал: �q� �Диалог � � � � � � � � � � � � � � � �q�

вместо ожидаемого: ┌──────────────────────────────────────┐ │Диалог │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └──────────────────────────────────────┘

а после преобразование окна в строку получается вот это: lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk xДиалог x x x x x x x x x x x x x x x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

Ilya-Novikov
() автор топика
Ответ на: комментарий от Ilya-Novikov

Можно пожалуста пример твоего кода? Мне кажится, мы «разминулись». Не совсем понятно, что ты пытаешся добиться.

beastie ★★★★★
()
Ответ на: комментарий от Ilya-Novikov

В общем, хотел нарисовать прямоугольник с текстом внутри «Диалог».

#include <ncurses.h>

int
main()
{
        WINDOW *win;

        initscr();
        cbreak();
        refresh();

        win = newwin(10, 40, 0, 0);
        box(win, 0, 0);
        mvwprintw(win, 2, 15, "Dialog");
        wrefresh(win);
        getch();

        endwin();
        return 0;
}

Это то, что ты хотел?

beastie ★★★★★
()
Ответ на: комментарий от beastie

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

Ilya-Novikov
() автор топика
Ответ на: комментарий от Ilya-Novikov

Здесь видно, что в строке не совсем то что нужно:

WINDOW *win;

initscr();
cbreak();
refresh();

win = newwin(10, 40, 0, 0);
box(win, 0, 0);
mvwprintw(win, 2, 15, "Dialog");
wrefresh(win);
getch();

endwin();

char winData[40];
std::string windowData;
for ( unsigned int i = 0; i < 10; ++i)
{
	wmove( win, i, 0);

	if ( winnstr( win, winData, 40) != ERR)
		windowData.append( winData).append( "\n");
}
std::cout << windowData << std::endl;

Ilya-Novikov
() автор топика
Ответ на: комментарий от Ilya-Novikov

А там точно char? Мне кажется там символ минимум два байта, надо ведь еще цвета хранить, а еще может быть утф8

OxiD ★★★★
()
Ответ на: комментарий от Ilya-Novikov

Тут imho сам подход уже неверный.

Из того же man winstr: “Attributes are stripped from the characters.”! Т.е. ты теряешь всю дополнитерльную инфу: цвета, выделения, рамки.

Дабы у тебя было более наглядное представление, что на самом деле происходит на экране, убери в моём примере getch() и перенаправь выход в hexdump. Увидешь много интерессного:

./a.out | hexdump -C | less
beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.