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

на главную

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

Библиотека

curses
определяет, какие последовательности передавать в терминал, консультируясь с базой данных, которая для каждого терминала ставит в соответствие названия возможностей строкам, которые должны пересылаться.

Linux, как все современные системы Unix, предлагает две базы данных, которые описывают терминалы в смысле их возможностей и соответствующих им управляющих последовательностей. Более старая база данных называется

termcap
(сокращение от terminal capabilities — терминальные возможности) и хранится в одном большом двумерном ASCII-файле по имени
/etc/termcap
. Этот файл постепенно
стал очень громоздким; его размер вырос приблизительно до половины мегабайта. Более новая база данных называется
terminfo
(сокращение от terminal information — терминальная информация) и хранится во множестве бинарных файлов (по одному на терминал), как правило, в подкаталогах каталога
/usr/lib/terminfo
.

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

linux
и в
termcap
, и в
terminfo
. Вы сообщаете программам, какой терминальный вход использовать, путем установки переменной окружения
TERM
. При создании программ, использующих
termcap
и
terminfo
, вам редко придется обращаться к переменной
TERM
; обычно это берут на себя низкоуровневые библиотеки для получения доступа к базам данных
termcap
или
terminfo
.

Если же вы хотите произвести специфическую для Linux оптимизацию, особенно если требуется применение нестандартных возможностей Linux, которые не описаны в базах данных, вы можете извлечь содержимое переменной окружения

TERM
с помощью показанного ниже кода.

if (!strcmp("linux", getenv("TERM"))) {

 /* должна быть консоль Linux */

} else {

 /* обрабатывать как обычный последовательный терминал */

}

Также если вы создаете программы на языках программирования, которые не предоставляют упрощенный доступ к

curses
или другим библиотекам, вы обязательно оцените удобство применения этой документации.

Разумеется, то, что ваш терминал имеет тип

linux
, не является гарантией того, что программа работает на локальном терминале. Это означает только то, что у вас есть доступ к управляющим последовательностям, описанным в данной главе, при этом вы не знаете, можете ли вы использовать устройства
vcs
(о них позже в этой главе) или
ioctl
. Стандарт POSIX определяет функцию
ttyname
, которую вы можете применить для извлечения имени файла устройства для управляющего терминала. В системе Linux виртуальные консоли называются
/dev/ttyn
, где
n
принимает значения от 1 до 63 (
/dev/tty0
— всегда текущая консоль).

Полное описание систем

termcap
и
terminfo
можно найти в [37]. В настоящий момент базы данных
termcap
и
terminfo
поддерживает Эрик Раймонд (Eric Raymond), и они доступны по адресу http://www.ccil.org/~esr/terminfo/.

Исходный код

ncurses
(новая библиотека
curses
— реализация
curses
, используемая в Linux) включает в себя введение в программирование с применением
curses
(файл
misc/ncurses-intro.html
).

21.2. Глифы, символы и отображения

Когда вы выводите символ на любой терминал, могут произойти несколько шагов преобразования. Значение, выводимое на терминал, представляет собой номер символа, или его код. Однако такого кода символа недостаточно для определения того, что нужно изобразить на экране. Форма зависит от используемого шрифта. Символьный код 97 может быть распечатан как

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

21.3. Возможности консоли Linux

Консоль Linux, как и большинство терминалов, является модальной: ее взаимодействие с данными зависит от того, в каком режиме она находится. По умолчанию она выводит на экран передаваемые символы, пока не получает управляющий символ или символ перехода. Управляющий символ просто вызывает некоторое регулирующее действие, а следующий символ уже читается обычным образом. Изменений в режиме обработки не происходит. Символ перехода сигнализирует о начале управляющей последовательности и изменяет режим обработки на режим управления.

Например, рассмотрим следующую строку С:

"this is a line\na \033[1mbold\033[0m word\n"

Консоль обрабатывает эту строку в описанной ниже последовательности.

1. Начиная с текущей позиции курсора, консоль печатает слова

this is a line
.

2. Обнаруживается символ новой строки (

\n
), поэтому (так как Linux и Unix обычно работают в режиме, когда новая строка сигнализирует также о возврате каретки) консоль перемещает курсор в начало следующей строки. При этом если курсор уже был на самой нижней строке, весь экран прокручивается вверх на одну строку.

3. В начале данной линии отображается строка

а
.

4. Консоль сталкивается с символом перехода

\033
и переводится в управляющий режим.

5. Считывается символ

[
, консоль переходит в режим ввода командной последовательности (Command Sequence Introduction — CSI).

6. В режиме CSI считывается последовательность десятичных чисел, закодированных в ASCII и разделенных знаками

;
, которые называются параметрами. Это продолжается до тех пор, пока не встретится первая буква. Буква определяет действие, которое нужно предпринять, с учетом данных в параметрах. В данном случае имеется один параметр
1
, а буква
m
означает, что параметр используется для определения изображения символа. Например, параметр
1
устанавливает атрибут полужирного шрифта.

7. Распечатывается строка

bold
в полужирном представлении.

8. Далее идет другая последовательность изображения символов, которая восстанавливает все стандартные атрибуты, поэтому строка

word
выводится в обычном изображении.

9. В завершение встречается и обрабатывается еще один символ новой строки.

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

this is a line

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

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Измена. Осколки чувств

Верди Алиса
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Осколки чувств

Отборная бабушка

Мягкова Нинель
Фантастика:
фэнтези
юмористическая фантастика
7.74
рейтинг книги
Отборная бабушка

Измена. Ребёнок от бывшего мужа

Стар Дана
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Ребёнок от бывшего мужа

Неверный. Свободный роман

Лакс Айрин
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Неверный. Свободный роман

Бывшие. Война в академии магии

Берг Александра
2. Измены
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Бывшие. Война в академии магии

Ты нас предал

Безрукова Елена
1. Измены. Кантемировы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты нас предал

В теле пацана 6

Павлов Игорь Васильевич
6. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
В теле пацана 6

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Инферно

Кретов Владимир Владимирович
2. Легенда
Фантастика:
фэнтези
8.57
рейтинг книги
Инферно

Золушка вне правил

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.83
рейтинг книги
Золушка вне правил