Книга: Основы программирования в Linux
Терминология библиотеки curses и общие представления
Терминология библиотеки curses и общие представления
Подпрограммы curses действуют на экранах, в окнах и вложенных окнах или подокнах. Экран — это устройство (обычно экран терминала, но может быть и экран эмулятора терминала xterm), на который вы записываете информацию. Он занимает все доступное пространство дисплея этого устройства, Если экран — окно терминала в графическом окне, то он представляет собой совокупность всех доступных символьных позиций в окне терминала. Всегда существует, по крайней мере, одно окно curses с именем stdscr
, совпадающее по размеру с физическим экраном. Вы можете создавать дополнительные окна с размером, меньшим, чем размер экрана. Окна могут накладываться друг на друга и иметь много вложенных окон, но каждое из них всегда должно находиться внутри родительского окна.
Библиотека curses поддерживает две структуры данных, действующие как отображение экрана терминала: stdscr
и curscr
. Структура stdscr
, наиболее важная из двух, обновляется, когда функции curses формируют вывод. Структура данных stdscr
— "стандартный экран". Она действует во многом так же, как стандартный вывод stdout из библиотеки stdio. Эта структура — стандартное окно вывода в программах, использующих библиотеку curses. Структура curscr
похожа на stdscr
, но хранит внешний вид отображаемого в текущий момент экрана. Вывод, записанный в структуру stdscr
, не появляется на экране до тех пор, пока программа не вызовет функцию refresh
, в которой библиотека curses сравнивает содержимое stdscr
(как должен выглядеть экран) со второй структурой curscr
(как выглядит экран в данный момент). Затем curses
использует различия между этими двумя структурами для обновления экрана.
Некоторым программам с использованием curses нужно знать, что библиотека поддерживает структуру stdscr
, которая применяется в нескольких функциях curses как параметр. Однако действительная структура stdscr
реализуется по-разному, и к ней никогда не следует обращаться напрямую. У программ с использованием curses практически нет нужды в применении структуры curscr
.
Таким образом, процесс вывода символов в программе с применением curses выглядит следующим образом:
1. Используется функция библиотеки curses для обновления логического экрана.
2. Запрашивается у библиотеки curses обновление физического экрана с помощью функции refresh
.
Преимущество двухшагового подхода помимо большей легкости при программировании — очень эффективный вариант обновления экрана curses. Это может быть не столь важно для экрана консоли, но становится существенным показателем, если программа выполняется через медленное сетевое соединение.
Программа с использованием curses выполнит множество вызовов функций вывода на логический экран, возможно, перемещая курсор по всему экрану для того, чтобы достичь нужной позиции вывода текста или рисования линий и рамок. На каком-то этапе пользователю потребуется увидеть весь этот вывод. Когда это произойдет (обычно во время вызова функции refresh
), библиотека curses найдет оптимальный способ формирования физического экрана, соответствующего логическому. Применяя нужные характеристики терминала и оптимизируя перемещения курсора, curses часто обновляет экран, выводя гораздо меньше символов по сравнению со всеми операциями записи на экран, если бы они выполнялись немедленно.
Макет логического экрана — это символьный массив, упорядоченный по строкам и столбцам, с начальной позицией экрана (0, 0) в левом верхнем углу (рис. 6.1).
Рис. 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).
Рис. 6.2
Как это работает
Эта программа инициализирует библиотеку curses, перемещает курсор в заданную точку экрана и отображает некоторый текст. После короткой паузы она закрывает библиотеку и завершается.
- Глава 6 Управление текстовыми экранами с помощью библиотеки curses
- Общие рекомендации по безопасности
- Профессиональная терминология не всегда уместна
- 1. Требования к табличной форме представления отношений
- Общие принципы моделирования
- Использование представления в виде таблицы данных
- Добавление и изменение представления списка
- Настройка библиотеки
- Создание представления
- Обеспечение безопасности библиотеки
- Удаление библиотеки
- Общие сведения