Окна в среде curses

Программы, использующие curses, могут управлять окнами, показанными на дисплее терминала. Размеры окон могут быть различными: окно может занимать весь экран, а может вмещать только один символ.

Прим.: Панель - это окно, которое не ограничено размерами экрана.

В программах, использующих curses, окна рассматриваются как переменные с типом WINDOW. Тип данных WINDOW определен в файле /usr/include/curses.h как структура данных C. При создании окна система выделяет область машинной памяти для этой структуры данных. В этой структуре хранятся все параметры окна. Изменив данные окна во внутренней памяти, программа должна запустить функцию wrefresh (или аналогичную ей) для обновления физического экрана. Только после этого внутренние изменения отразятся на внешнем дисплее.

Структура стандартного окна

В библиотеке curses предусмотрена структура стандартного виртуального окна, которая называется stdscr. В структуре stdscr хранится все содержимое дисплея. Структура окна stdscr, описывающая дисплей, создается автоматически при инициализации библиотеки curses. При этом значения высоты и ширины устанавливаются равными размерам физического дисплея.

Программы, применяющие stdscr, сначала изменяют внутреннюю структуру. Затем они могут обновить содержимое дисплея с помощью функции refresh.

В дополнение к stdscr, вы можете определить и другие окна. Такие окна называются пользовательскими. Как и stdscr, пользовательские окна представляют собой структуры, хранящиеся в памяти. Вы можете создать любое количество окон, их число ограничено лишь объемом доступной памяти. Программы, использующие curses, могут одновременно управлять стандартным окном и пользовательскими окнами.

Структура текущего окна

Помимо окна stdscr, функции curses поддерживают еще одно виртуальное окно - curscr (текущий экран). Окно curscr служит внутренним представлением изображения, показанного в настоящий момент на дисплее.

Если программе необходимо синхронизовать внутреннее и внешнее представление, она вызывает функцию обновления физического дисплея wrefresh (при работе с stdscr - refresh).

Окно curscr зарезервировано в curses для внутреннего применения. Изменять curscr нельзя.

Вложенные окна

Функции curses позволяют создавать вложенные окна. Вложенные окна - это прямоугольные фрагменты, расположенные внутри других окон. Вложенное окно тоже относится к типу данных WINDOW. Окно, содержащее вложенное окно, называется "родительским", а вложенное окно - "дочерним".

Изменения, вносимые в зоне перекрытия окон, затрагивают как родительское, так и дочернее окно. После изменения вложенного окна необходимо вызвать функцию touchline или touchwin для родительского окна перед его обновлением.

Функция Описание
touchline Выполняет принудительное обновление группы строк при следующем вызове функции wrefresh .
touchwin Выполняет принудительное обновление всех символов в окне при следующем вызове функции wrefresh. Функция touchwin не сохраняет информацию об оптимизации. Эта функция полезна при работе с перекрывающимися окнами.

При обновлении родительского окна автоматически обновляются и все дочерние окна. Вложенное окно также может содержать дочерние окна. Процесс организации многоуровневых окон называется вложением.

Удалить родительское окно можно только после того, как будут удалены все дочерние окна (это можно сделать с помощью функции delwin). При попытке удалить окно, у которого есть дочерние окна, функция curses вернет сообщение об ошибке.

Панели

Панель - это окно, размер которого не ограничен размерами дисплея, а сама панель не связана ни с одной определенной областью дисплея. Как правило, панели бывают больше физического дисплея, поэтому в любой момент времени пользователь видит лишь часть панели.

Панели удобно использовать для представления больших массивов связанных данных, которые желательно хранить в одном окне, но не обязательно показывать все сразу.

Окна в панелях называются вложенными панелями. Вложенные панели находятся внутри родительских. В отличие от вложенных окон, их расположение определяется не экранными координатами, а относительными координатами родительской панели.

В отличие от других окон, содержимое панелей не обновляется автоматически при прокрутке или ввода данных с эхо-отображением на экране. Как и в случае с окнами, после изменения вложенной панели нужно сначала запустить функцию touchline или touchwin для родительской панели и только после этого обновлять ее.

К панелям применимы все функции curses, за исключением newwin, subwin, wrefresh и wnoutrefresh, вместо которых должны применяться функции newpad, subpad, prefresh и pnoutrefresh.