Операционная система UNIX. Руководство программиста

       

Подпрограммы initscr( ), refresh( ) и endwin( )


Подпрограммы initscr(), refresh() и endwin() приводят терминал в состояние "работа с curses", обновляют содержимое экрана и восстанавливают терминал в состоянии "вне curses" соответственно. Для уяснения действия каждой из этих подпрограмм воспользуемся еще раз нашим простым примером.

#include <curses.h>

main () { initscr (); /* Инициализируем терминал и переменные и структуры данных из <curses.h> */ move (LINES/2 - 1, COLS/2 - 4); addstr ("Bulls"); refresh (); /* Выводим данные на экран терминала */ addstr ("Eye"); refresh (); /* Выводим еще на экран терминала */ endwin (); /* Восстанавливаем состояние терминала */ }

Curses-программа начинается обычно с вызова initscr(); это достаточно сделать один раз. Подпрограмма initscr() определяет тип терминала, на котором выполняется программа, по значению переменной окружения $TERM, как это описано в разделе Взаимодействие curses и terminfo. Затем подпрограмма инициализирует все переменные и структуры данных, описанные в файле <curses.h>. initscr() присваивает переменным LINES и COLS значения, соответствующие терминалу, на котором выполняется программа. Например, если используется Teletype 5425, она присвоит значение 24 переменной LINES, а значение COLS станет равным 80. Если возникает ошибка, подпрограмма записывает сообщение об этом в stderr

и завершает работу.

Ввод/вывод при выполнении программы производится подпрограммами, подобными использующимся в примере move() и addstr(). Например,

move (LINES/2 - 1, COLS/2 - 4);

требует перемещения курсора в точку, находящуюся несколько левее центра экрана. Затем

addstr ("Bulls");

требует вывести цепочку символов Bulls. Если программа выполняется на терминале Teletype 5425, эта цепочка будет выведена, начиная с позиции (11, 36).

Внимание!

Все подпрограммы curses, перемещающие курсор, отсчитывают его координаты относительно левого верхнего угла экрана. Координаты (LINES, COLS) этого угла принимаются за (0, 0), а не за (1, 1). Заметьте, что первой идет вертикальная координата, а затем горизонтальная, в отличие от обычной записи 'x, y' для экранных (или графических) координат. Для перемещения курсора в среднюю строку экрана в примере появляется -1, чтобы учесть координаты (0, 0) для угловой позиции.

При вызове подпрограмм типа move() и addstr() содержимое физического экрана терминала не меняется. Экран обновляется только при вызове refresh(). До такого вызова изменяется только внутреннее представление экрана, которое называется окном. Эту весьма важную концепцию мы обсудим далее в разделе Еще об окнах и подпрограмме refresh().

В заключение отметим, что программа, работающая с curses, заканчивается вызовом endwin(). Эта подпрограмма восстанавливает прежнее состояние терминала и помещает курсор в левый нижний угол экрана.



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