Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Некоторым программам с использованием 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, перемещает курсор в заданную точку экрана и отображает некоторый текст. После короткой паузы она закрывает библиотеку и завершается.

Экран

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

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

#include <curses.h>

WINDOW *initscr(void);

int endwin(void);

Функция

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

Функция

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

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

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

#include <curses.h>

int addch(const chtype char_to_add);

int addchstr(chtype *const string_to_add);

int printw(char *format, ...);

int refresh(void);

int box(WINDOW *win_ptr, chtype vertical_char, chtype horizontal_char);

int insch(chtype char_to_insert);

int insertln(void);

int delch(void);

int deleteln(void);

int beep(void);

int flash(void);

У библиотеки curses есть свой символьный тип данных

chtype
, который может содержать больше разрядов, чем стандартный тип
char
. В стандартной версии ncurses для ОС Linux
chtype
на самом деле — синоним стандартного типа
unsigned long
.

Поделиться:
Популярные книги

Травник

Назимов Константин Геннадьевич
1. Травник
Фантастика:
фэнтези
5.00
рейтинг книги
Травник

Сфирот

Прокофьев Роман Юрьевич
8. Стеллар
Фантастика:
боевая фантастика
рпг
6.92
рейтинг книги
Сфирот

Кодекс Охотника. Книга VII

Винокуров Юрий
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Кодекс Охотника. Книга VII

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

Неучтенный элемент. Том 8

NikL
8. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 8

По прозвищу Святой. Книга вторая

Евтушенко Алексей Анатольевич
2. Святой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
По прозвищу Святой. Книга вторая

Я уже царь. Книга XXIX

Дрейк Сириус
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я уже царь. Книга XXIX

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4

Вечный. Книга VII

Рокотов Алексей
7. Вечный
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Вечный. Книга VII

Телохранитель Генсека. Том 4

Алмазный Петр
4. Медведев
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Телохранитель Генсека. Том 4

Кодекс Крови. Книга ХIV

Борзых М.
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Кодекс Крови. Книга ХIV

Собрание сочинений в одной книге

Лондон Джек
Приключения:
морские приключения
прочие приключения
6.25
рейтинг книги
Собрание сочинений в одной книге

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Обрыв

Гончаров Иван Александрович
Проза:
классическая проза
русская классическая проза
8.93
рейтинг книги
Обрыв