Выбрать главу

Сообщение консоли того, что она должна отображать — далеко не все; вы также обязаны распознавать последовательности нажатия клавиш и знать, к каким клавишам они привязаны. Некоторые из этих последовательностей определены в базе данных terminfo, некоторые — нет. Кроме этого, клавиатура является модальной для увеличения разнообразия возможностей. В режиме приложения клавиши курсора порождают другие коды. Как показано в табл. 21.9, к ним добавляется префикс ^[О вместо ^[[. Это необходимо для поддержки унаследованных приложений, в которых предполагается, что они обращаются к терминалам DEC.

Последовательности нажатия клавиш описаны в табл. 21.11. Обратите внимание на то, что в нумерации функциональных клавиш имеются пропуски. Это спланировано для того, чтобы пользователи клавиатур, у которых нет клавиш <F11> и <F12>, не были ущемлены.

Таблица 21.11. Кодирование функциональных клавиш

Последовательности нажатия клавиш Клавиша (клавиши)
^[[[А <F1>
^[[[В <F2>
^[[[С <F3>
^[[[D <F4>
^[[[Е <F5>
^[[17~ <F6>
^[[18~ <F7>
^[[19~ <F8>
^[[20~ <F9>
^[[21~ <F10>
^[[23~ <F11>, <Shift+F1>, <Shift+F11>
^[[24~ <F12>, <Shift+F2>, <Shift+F11>
^[[25~ <Shift+F3>
^[[26~ <Shift+F4>
^[[28~ <Shift+F5>
^[[29~ <Shift+F6>
^[[31~ <Shift+F7>
^[[32~ <Shift+F8>
^[[33~ <Shift+F9>
^[[34~ <Shift+F10>
^[[А <Стрелка вверх>
^[[D <Стрелка влево>
^[[В <Стрелка вниз>
^[[С <Стрелка вправо>
^[[1~ <Home>
^[[2~ <Insert>
^[[3~ <Delete>
^[[4~ <End>
^[[5~ <Page Up>
^[[6~ <Page Down>

21.4. Прямой вывод на экран

В некоторых случаях наличие одной только способности выводить символы на экран не является достаточным. Частично это связано с невозможностью определить текущее состояние экрана. В системе Unix принята стандартная практика — состояние экрана игнорируется. Если нужно, вы можете задать настройки экрана, при появлении необходимости внести в них изменения, после чего полностью перерисовывать экран всякий раз, когда этого требует пользователь (как правило, нажатием комбинации ^L). Можно планировать и другие применения.

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

Простейший текстовый механизм носит название vcs, что, вероятно, означает virtual console screen (экран виртуальной консоли)[155]. Чтение устройства /dev/vcs0 дает содержимое текущей виртуальной консоли, как оно выглядит на момент чтения. Если экран в настоящий момент прокручен (по умолчанию для прокрутки экрана назначаются клавиатурные последовательности <Control+PageUp> и <Control+PageDown>), устройство /dev/vcs0 содержит прокрученное содержимое, видимое на экране. Остальные устройства vcs, /dev/vcsn, представляют текущее состояние виртуальной консоли n и обычно доступны через /dev/ttyn.

При чтении файла /dev/vcs* не дается никаких указаний относительно новых строк или размера консоли, кроме метки EOF в конце экрана. Если вы прочитали 2000 байт и затем получили EOF, вы не сможете определить размеры экрана: может быть, он содержит 80 столбцов и 25 строк, а, может быть, 40 столбцов и 50 строк. Для отметки конца строк не выводятся символы новой строки, к тому же каждая пустая символьная ячейка (независимо от того, записывалась ли в нее когда-либо информация) обозначается символом пробела. Существует несколько популярных конфигураций экрана, и нет никакой гарантии, что каждая из них имеет однозначное количество строк и столбцов. Механизм vcs предлагает легкий способ для находчивых системных администраторов или разработчиков увидеть содержимое любой виртуальной консоли. Однако он не особенно полезен с точки зрения программистов, по крайней мере, без посторонней помощи.

вернуться

155

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