При инициализации curses на экране автоматически появляется stdscr. Вы можете управлять этим окном с помощью библиотеки функций curses или создать собственные пользовательские окна. В этом разделе описаны следующие возможности управления данными в окне:
С помощью функции
newwin вы можете создать собственное окно.
newwin | Создает новую структуру данных, описывающую окно. |
При каждом вызове функции newwin библиотека curses выделяет память для размещения новой структуры, описывающей окно. Эта структура содержит всю информацию, связанную с новым окном. В библиотеке Curses число создаваемых окон не ограничено. Число вложенных окон ограничено объемом доступной памяти и задается значением SHRT_MAX в файле /usr/include/limits.h.
Вы можете изменять параметры окон вне зависимости от порядка их создания. Обновление дисплея терминала выполняется с помощью функции wrefresh.
subwin | Создает окно, вложенное в существующее окно. |
Для вложенного окна необходимо задать координаты относительно дисплея. Если координаты вложенного окна окажутся за границами родительского окна, то будет возвращено нулевое значение.
newpad | Создает новую структуру данных, описывающую панель. |
subpad | Создает и возвращает указатель на вложенную панель. |
Координаты новой вложенной панели задаются относительно родительской панели.
Для удаления окна, панели или вложенного окна вызовите функцию delwin. Для удаления окна или панели необходимо предварительно удалить все дочерние элементы, в противном случае функция delwin вернет сообщение об ошибке.
При изменении содержимого окна с помощью функций Curses обновляется только внутреннее представление окна. Для изменения изображения необходимо вызвать функцию wrefresh. Для обновления изображения на экране функция wrefresh использует информацию из структуры с описанием окна.
После записи вывода в структуру с описанием окна или панели необходимо обновить дисплей для отображения внесенных изменений. При обновлении выполняются следующие операции:
refresh или wrefresh | Обновляет дисплей и curscr для отображения внесенных изменений. |
wnoutrefresh и doupdate | Обновляет указанные окна и выводит их на дисплей. Эти функции применяются, когда требуется отобразить изменения в нескольких окнах. |
Функции refresh и wrefresh сначала вызывают функцию wnoutrefresh для копирования обновляемого окна на текущий экран. После этого вызывается функция doupdate для обновления дисплея.
Кроме того, вы можете обновить одновременно несколько окон, воспользовавшись одним из следующих способов. Можно выполнить серию вызовов функции wrefresh, в результате чего будут попеременно вызываться функции wnoutrefresh и doupdate. Можно также вызвать функцию wnoutrefresh для каждого окна, а потом один раз вызвать doupdate. Во втором способе вывод на экран передается только один раз.
Функции prefresh и
pnoutrefresh работают аналогично функциям wrefresh и
wnoutrefresh.
prefresh и pnoutrefresh | Обновляет дисплей терминал и curscr для отображения изменений, внесенных в содержимое панели. |
Функция prefresh обновляет текущее окно и физический дисплей, а функция pnoutrefresh обновляет curscr для отображения изменений в пользовательской панели. Так как в данном обрабатываются не окна, а панели, необходимо указать дополнительные параметры, задающие измененные части панели и окна.
Во время обновления на дисплее перерисовываются только измененные области. Участки, остающиеся неизменными, можно обновить с помощью функций touchwin и touchline.
touchline | Выполняет принудительное обновление группы строк при следующем вызове функции wrefresh . |
touchwin | Выполняет принудительное обновление всех символов в окне при следующем вызове функции wrefresh. Функция touchwin не сохраняет информацию об оптимизации. Эта функция полезна при работе с перекрывающимися окнами. |
При работе с вложенными и пересекающимися окнами применяется сочетание функций touchwin и wrefresh. Для того чтобы разместить окно поверх остальных, вызовите функцию touchwin, а потом wrefresh.
Если текст передается на дисплей терминала функцией, не входящей в библиотеку curses, например, echo или printf, то данные в окне могут быть показаны неправильно. В этом случае содержимое дисплея изменится, но в текущем окне эти изменения отражены не будут. При обновлении такого окна могут возникнуть ошибки. В результате этого фрагменты экрана, в которых находился неправильно показанный текст, обновлены не будут.
Аналогичная ошибка может возникнуть при перемещении окна. Изменения расположения символов, переданных на дисплей функциями не из библиотеки curses, не отражаются во внутренней структуре.
Если данные в окне показаны неправильно, вызовите функцию wrefresh для curscr, что позволить восстановить соответствие между физическим дисплеем и внутренним представлением данных.
Программы могут управлять
созданными окнами.
box | Рисует рамку внутри или вокруг окна. |
copywin | Обеспечивает более точное управление функциями overlay и overwrite. |
garbagedlines | Указывает curses, что в строке экрана записаны посторонние данные, которые необходимо уничтожить перед записью информации в эту строку. |
mvwin | Перемещает обычное или вложенное окно. |
overlay и overwrite | Копирует одно окно поверх другого. |
ripoffline | Удаляет строку из экрана по умолчанию. |
Функция mvwin перемещает обычное или вложенное окно. Функция box рисует рамку вокруг обычного или вложенного окна.
Функции overlay и overwrite применяются в случае перекрытия окон. При этом функция overwrite уничтожает данные в отличие от функции overlay. Это значит, что при копировании текста из одного окна в другое с помощью функции overwrite пустые фрагменты целевого окна заменяются соответствующими фрагментами копируемого окна. Функция overlay не копирует пустые фрагменты.
Так же, как функции overlay и overwrite, функция copywin позволяет скопировать часть окна в другое окно. Отличие заключается в том, что для вызова функции copywin не требуется, чтобы окна перекрывались.
С помощью функции ripoffline вы можете удалять строки из stdscr. Если вы передадите этой функции положительное значение в параметре строка, то указанное число строк в начале stdscr будет удалено. Если же вы укажете в аргументе строка отрицательное значение, то будут удалены строки в нижней части окна.
Перед записью в окно новой информации вы можете вызвать функцию garbagedlines, которая уничтожает строки в указанном диапазоне.
Для работы с
приложениями-фильтрами curses используется функция filter.
filter | Задает размер окна терминала равным 1 строке. |
Эта функция преобразует окно stdscr, после чего функции curses могут работать с ним, как с одной строкой. После вызова filter функции curses не применяют средства работы с терминалом, в которых требуется указывать, обработка какой строки выполняется в данный момент.