Литмир - Электронная Библиотека
Содержание  
A
A

Некоторым программам с использованием curses нужно знать, что библиотека поддерживает структуру

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

Таким образом, процесс вывода символов в программе с применением curses выглядит следующим образом:

1. Используется функция библиотеки curses для обновления логического экрана.

2. Запрашивается у библиотеки curses обновление физического экрана с помощью функции

refresh
.

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

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

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

Макет логического экрана — это символьный массив, упорядоченный по строкам и столбцам, с начальной позицией экрана (0, 0) в левом верхнем углу (рис. 6.1).

Основы программирования в Linux - image012.jpg

Рис. 6.1

Во всех функциях библиотеки curses применяются координаты со значением у (строки) перед значением х (столбцы). Каждая позиция хранит не только символ, расположенный в этом месте экрана, но и его атрибуты. Атрибуты, которые можно отобразить, зависят от физических характеристик терминала, но, как правило, они включают жирное начертание и подчеркивание символа. На консолях Linux вам также доступны негативное изображение и цвет, о которых речь пойдет далее в этой главе.

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

initscr
и
endwin
(упражнение 6.1).

Упражнение 6.1. Программа с использованием curses, выводящая приветствие

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

1. Вставьте заголовочный файл curses.h и в функцию

main
, включите вызовы для инициализации и возврата в исходное состояние библиотеки curses:

#include <unistd.h>

#include <stdlib.h>

#include <curses.h>

int main() {

 initscr();

 ...

 endwin();

 exit(EXIT_SUCCESS);

}

2. Внутрь поместите код для перемещения курсора в точку (5, 15) на логическом экране, выведите приветствие "Hello World" и обновите реальный экран. В заключение примените вызов

sleep(2
) для того, чтобы приостановить выполнение программы на две секунды и просмотреть вывод на экран перед ее завершением:

move(5, 15);

printw("%s", "Hello World");

refresh();

sleep(2);

Пока программа выполняется, вы видите фразу "Hello World" в левом верхнем квадранте пустого экрана (рис. 6.2).

Основы программирования в Linux - image013.jpg

Рис. 6.2

Как это работает

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

Экран

Как: вы уже видели, все программы с использованием curses должны начинаться с вызова функции

initscr
и заканчиваться вызовом функции
endwin
. Далее приведены их описания из заголовочного файла.

<b>#include &lt;curses.h&gt;</b>

<b>WINDOW *initscr(void);</b>

<b>int endwin(void);</b>

Функция

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

Функция

endwin
возвращает константу OK в случае успешного завершения и err в случае неудачи. Вы можете вызвать ее для того, чтобы покинуть curses, а позже возобновить функционирование библиотеки curses, вызвав
clearok(stdscr, 1)
и
refresh
. Это позволит библиотеке совершенно забыть, как выглядит физический экран, и заставит ее выполнить полное обновление экрана.

Вывод на экран

Для обновления экрана предоставляется несколько базовых функций.

<b>#include &lt;curses.h&gt;</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>

96
{"b":"285844","o":1}