Руководство программиста для Linux

    778b1c86   

Обновление терминала


Как написано в обзоре, окна ncurses есть отображения в памяти. Это означает, что любое изменение окна не отражается на физическом экране до тех пор, пока не будет произведено обновление. Это оптимизирует вывод на экран, поскольку вы получаете возможность совершать множество действий, а затем лишь единожды вызвать обновление, чтобы напечатать его на экране. В противном случае на терминале отражалось бы каждое изменение, что ухудшало бы исполнение ваших программ. * int refresh() int wrefresh(win)

refresh() копирует stdscr на терминал, а wrefresh(win) копирует изображение окна в stdscr и затем делает curscr подобным stdscr. * int wnoutrefresh(win) int dourdate()

wnoutrefresh(win) копирует окно win только в stdscr. Это означает, что вывода на терминал не производится, но виртуальный экран stdscr на самом деле выглядит именно так, как того хочет программист. doupdate() произведет вывод на терминал. Программа может менять различные окна, вызывая wnoutrefresh(win) для каждого окна, а затем достаточно один раз вызвать doupdate(), чтобы обновить физический экран.

Допустим, мы имеем следующую программу с двумя окнами. Мы изменяем оба окна, меняя несколько линий текста. Напишем cgangewin(win) с wrefresh(win).

main() changewin(WINDOW *win) { { WINDOW *win1,*win2; ... /* здесь мы изменяем */ ... ... /* строки */ changewin(win1); wrefresh(win); changewin(win2); return; ... } }

Тогда ncurses обновит терминал дважды, а это замедлит исполнение нашей программы. Благодаря doupdate() мы изменим changewin(win) и нашу основную функцию, добившись этим лучшего исполнения.

main() changewin(WINDOW *win) { { WINDOW *win1,*win2; ... /* здесь мы изменяем */ ... ... /* строки */ changewin(win1); wnoutrefresh(win); changewin(win2); return; doupdate(); } ... } * int redrawwin(win) int wredrawln(win, bline, nlines)

Используйте эти функции, когда перед записью чего-нибудь нового требуется выбросить несколько линий или целый экран (может быть линии попорчены или что-либо вроде этого). * int touchwin(win) int touchline(win, start, count) int wtouchln(win, y, n, changed) int untouchwin(win)




Говорит ncurses-у, что были произведены манипуляции с целым окном или линиями от start до start+count. Например, когда у вас есть несколько окон, перекрывающих друг друга (как в примере type.c), изменение одного из них никак не повлияет на изображение других.

wtouchln(...) захватит n линий, начинающихся в y. Если change соответствует TRUE, то линии захватываются, в противном случае - нет (изменяются или не изменяются).

untouchwin(win) пометит окно win как неизмененное со времени последнего вызова refresh(). * int is_linetouched(win, line) int is_wintouched(win)

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

Таблица 8.4: Ncurses - атрибуты

Определение | Атрибут ----------------|------------------------------------------------ A_ATTRIBUTES | маска для атрибутов (chtype) A_NORMAL | нормальный, переустановка всего остального A_STANDOUT | наиболее яркий режим A_UNDERLINE | подчеркивание A_REVERSE | обратное изображение A_BLINK | мигание A_DIM | тусклый или полуяркий режим A_BOLD | четкий или очень яркий режим A_ALTCHARSET | использование альтернативной символьной таблицы A_INVIS | невидимый режим A_PROTECT | ??? A_CHARTEXT | маска для действующих символов (chtype) A_COLOR | маска для цвета COLOR_PAIR(n) | установка цветовой пары n PAIR_NUMBER(a) | получение цветовой пары, лежащей в атрибуте a


Содержание раздела