Основы программирования в Linux
Некоторым программам с использованием curses нужно знать, что библиотека поддерживает структуру
, которая применяется в нескольких функциях curses как параметр. Однако действительная структураstdscrреализуется по-разному, и к ней никогда не следует обращаться напрямую. У программ с использованием curses практически нет нужды в применении структурыstdscr.curscrТаким образом, процесс вывода символов в программе с применением curses выглядит следующим образом:
1. Используется функция библиотеки curses для обновления логического экрана.
2. Запрашивается у библиотеки curses обновление физического экрана с помощью функции
.refreshПреимущество двухшагового подхода помимо большей легкости при программировании — очень эффективный вариант обновления экрана curses. Это может быть не столь важно для экрана консоли, но становится существенным показателем, если программа выполняется через медленное сетевое соединение.
Программа с использованием curses выполнит множество вызовов функций вывода на логический экран, возможно, перемещая курсор по всему экрану для того, чтобы достичь нужной позиции вывода текста или рисования линий и рамок. На каком-то этапе пользователю потребуется увидеть весь этот вывод. Когда это произойдет (обычно во время вызова функции
), библиотека curses найдет оптимальный способ формирования физического экрана, соответствующего логическому. Применяя нужные характеристики терминала и оптимизируя перемещения курсора, curses часто обновляет экран, выводя гораздо меньше символов по сравнению со всеми операциями записи на экран, если бы они выполнялись немедленно.refreshМакет логического экрана — это символьный массив, упорядоченный по строкам и столбцам, с начальной позицией экрана (0, 0) в левом верхнем углу (рис. 6.1).
Рис. 6.1
Во всех функциях библиотеки curses применяются координаты со значением у (строки) перед значением х (столбцы). Каждая позиция хранит не только символ, расположенный в этом месте экрана, но и его атрибуты. Атрибуты, которые можно отобразить, зависят от физических характеристик терминала, но, как правило, они включают жирное начертание и подчеркивание символа. На консолях Linux вам также доступны негативное изображение и цвет, о которых речь пойдет далее в этой главе.
Поскольку библиотека curses нуждается в создании и удалении некоторых временных структур данных, все программы с использованием curses должны инициализировать библиотеку перед применением и затем разрешить ей восстановить первоначальные установки после ее применения. Делается это с помощью вызовов пары функций:
иinitscr(упражнение 6.1).endwinУпражнение 6.1. Программа с использованием curses, выводящая приветствиеВ этом примере вы напишите очень простую использующую curses программу screen1.c, чтобы показать эти и другие базовые функции в действии. Далее будут описаны их прототипы.
1. Вставьте заголовочный файл curses.h и в функцию
, включите вызовы для инициализации и возврата в исходное состояние библиотеки curses:main#include <unistd.h>#include <stdlib.h>#include <curses.h>int main() {initscr();...endwin();exit(EXIT_SUCCESS);}2. Внутрь поместите код для перемещения курсора в точку (5, 15) на логическом экране, выведите приветствие "Hello World" и обновите реальный экран. В заключение примените вызов
) для того, чтобы приостановить выполнение программы на две секунды и просмотреть вывод на экран перед ее завершением:sleep(2move(5, 15);printw("%s", "Hello World");refresh();sleep(2);Пока программа выполняется, вы видите фразу "Hello World" в левом верхнем квадранте пустого экрана (рис. 6.2).
Рис. 6.2
Как это работает
Эта программа инициализирует библиотеку curses, перемещает курсор в заданную точку экрана и отображает некоторый текст. После короткой паузы она закрывает библиотеку и завершается.
Экран
Как: вы уже видели, все программы с использованием curses должны начинаться с вызова функции
и заканчиваться вызовом функцииinitscr. Далее приведены их описания из заголовочного файла.endwin<b>#include <curses.h></b><b>WINDOW *initscr(void);</b><b>int endwin(void);</b>Функция
должна вызываться только один раз в каждой программе. В случае успешного завершения она возвращает указатель на структуруinitscr. Если функция заканчивается аварийно, она просто выводит диагностическое сообщение об ошибке и вызывает завершение программы.stdscrФункция
возвращает константу OK в случае успешного завершения и err в случае неудачи. Вы можете вызвать ее для того, чтобы покинуть curses, а позже возобновить функционирование библиотеки curses, вызвавendwinиclearok(stdscr, 1). Это позволит библиотеке совершенно забыть, как выглядит физический экран, и заставит ее выполнить полное обновление экрана.refreshВывод на экран
Для обновления экрана предоставляется несколько базовых функций.
<b>#include <curses.h></b><b>int addch(const chtype char_to_add);</b><b>int addchstr(chtype *const string_to_add);</b><b>int printw(char *format, ...);</b><b>int refresh(void);</b><b>int box(WINDOW *win_ptr, chtype vertical_char, chtype horizontal_char);</b><b>int insch(chtype char_to_insert);</b><b>int insertln(void);</b><b>int delch(void);</b><b>int deleteln(void);</b><b>int beep(void);</b><b>int flash(void);</b>

