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