Подпрограммы 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(). Эта подпрограмма восстанавливает прежнее состояние терминала и помещает курсор в левый нижний угол экрана.