Операционная система UNIX. Руководство программиста

     

Указание характеристик терминала


После того, как Вы уяснили характеристики терминала, их необходимо указать в его описании. Описание имеет вид последовательности разделенных запятыми полей, каждое из которых содержит принятое в terminfo сокращение названия характеристики и, в некоторых случаях, ее значение для данного терминала. Например, для указания способности терминала подавать звуковой сигнал используется сокращение bel. На большинстве терминалов инструкцией, передаваемой для подачи звукового сигнала, является CTRL+G. Таким образом, характеристика возможности подачи звукового сигнала изображается в описании терминала в виде bel=^G,.

Описание характеристики может занимать несколько строк. В отличие от первой строки, строки продолжения должны начинаться с символа табуляции или пробела. В описание можно включать комментарии, которые выделяются символом # в начале строки.

Полный список характеристик, которые можно указывать в описании терминала см. в terminfo(4). В этом списке приводятся название характеристики, сокращенное название, которое используется в базе данных, двухбуквенный код, соответствующий этой характеристике в устаревшей базе данных termcap, а также краткое описание характеристики. Сокращение, которое необходимо указать в описании терминала см. в колонке "Сокращение".

Примечание

Чтобы curses-программа могла работать с терминалом, его описание в базе данных terminfo должно включать, как минимум, характеристики, касающиеся перемещения курсора во всех четырех направлениях и очистки экрана.

Значение характеристики может задаваться клавишей (например, CTRL+G), числом, или цепочкой символов, определяющей последовательность операций, которые нужно выполнить, чтобы добиться необходимого эффекта. Для указания типа значения после названия характеристики в описании терминала могут использоваться некоторые специальные символы, а именно:

#  Указывает, что далее следует числовое значение характеристики. Например, количество столбцов может определяться в виде cols#80.
 =  Указывает, что значение характеристики является цепочкой символов. Эта цепочка в действительности может быть последовательностью команд, требующих от терминала выполнения определенных действий. В таких цепочках могут использоваться некоторые специальные символы, а именно:



 ^  Обозначает управляющий символ. Например, звуковой сигнал подается передачей CTRL+G, что записывается в виде ^G.
 \e или \E  В сопровождении еще каких-либо символов обозначают escape-последовательности. Например, \EC передается на терминал в виде ESC C.
 \n  Обозначает перевод строки.
 \l  Обозначает переход к новой строке.
 \r  Обозначает возврат каретки.
 \t  Обозначает горизонтальную табуляцию.
 \b  Обозначает возврат на символ назад.
 \f  Обозначает переход к новой странице.
 \s  Обозначает пробел.
 \nnn  Обозначает символ с восьмеричным кодом nnn, где nnn может иметь от одной до трех цифр.
 $< >  Эти символы используются для обозначения задержки в миллисекундах. Длительность задержки заключается в угловые скобки (<>). Она может быть целым или десятичным числом с одной цифрой после точки. После числа может следовать звездочка (*). Звездочка указывает, что длительность задержки пропорциональна количеству вовлеченных в операцию строк. Например, задержка в 20 миллисекунд на строку указывается в виде $<20*>. Более подробную информацию о задержке и символах-заполнителях см. в terminfo(4).
Иногда бывает необходимо отключить некоторую характеристику в описании терминала. Это можно сделать, поместив точку (.) перед сокращенным названием характеристики, тогда она воспринимается как комментарий. Например, чтобы закомментировать характеристику звукового сигнала, необходимо записать ее так:

.bel=^G,

Теперь, когда мы узнали, как описываются характеристики терминала, опишем их для myterm. Мы рассмотрим характеристики экрана, клавиатуры, основные и параметрические характеристики.



4.1.3.1. Основные характеристики

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




  • Автоматический переход в начало следующей строки, когда курсор достигает правой границы (am).


  • Способность подавать звуковой сигнал. Командой подачи сигнала является CTRL+G (bel).


  • Ширина экрана - 80 колонок. (cols).


  • Высота экрана - 30 строк. (lines).


  • Используется протокол xon/xoff (xon).


Объединив последовательность имен (см. раздел Название терминала) и описание упомянутых характеристик, мы получим следующее описание для базы данных terminfo:

mytermmytmminefancyterminalMy FANCY Terminal, am, bel=^G, cols#80, lines#30, xon,



4.1.3.2. Характеристики экрана

Эти характеристики управляют содержимым экрана. Пусть терминал myterm имеет перечисленные ниже характеристики. Опять-таки, в скобках после описания характеристики дается ее сокращение.


  • Возврату каретки соответствует CTRL+M (cr).
  • Перемещению курсора на одну строку вверх соответствует CTRL+K (cuu1).
  • Перемещению курсора на одну строку вниз соответствует CTRL+J (cud1).
  • Перемещению курсора на одну строку влево соответствует CTRL+H (cub1).
  • Перемещению курсора на одну строку вправо соответствует CTRL+L (cuf1).
  • Переходу к инвертированному отображению соответствует ESC D (smso).
  • Отмене инвертированного отображения соответствует ESC Z

    (rmso).
  • Последовательностью, очищающей до конца строки, является ESC K, и этот процесс должен сопровождаться задержкой в 3 мс. (el).
  • Производится роллирование экрана терминала при получе- нии перевода строки в конце экрана (ind).


Описание терминала myterm, включающее эти характеристики, будет выглядеть так:

mytermmytmminefancyterminalMy FANCY Terminal, am, bel=^G, cols#80, lines#30, xon, cr=^M, cuu1=^K, cud1=^G, cub1=^H, cuf1=^L, smso=\ED, rmso=\EZ, el=\EK$<3>, ind=\n,



4.1.3.3. Характеристики клавиатуры

Эти характеристики представляют собой последовательности симво- лов, генерируемые при нажатии клавиш на клавиатуре терминала. Большинство терминалов имеет ряд специальных клавиш, по меньшей мере, стрелки и клавиши забоя. Пусть наш гипотетический терми- нал имеет несколько таких клавиш, которые генерируют следующие последовательности:




  • Забой - CTRL+H (kbs).


  • Стрелка вверх - ESC [A (kcuu1).


  • Стрелка вниз - ESC [B (kcud1).


  • Стрелка вправо - ESC [C (kcuf1).


  • Стрелка влево - ESC [D (kcub1).


  • Клавиша HOME - ESC [H (khome).


Добавим эту информацию к нашему описанию:

mytermmytmminefancyterminalMy FANCY Terminal, am, bel=^G, cols#80, lines#30, xon, cr=^M, cuu1=^K, cud1=^G, cub1=^H, cuf1=^L, smso=\ED, rmso=\EZ, el=\EK$<3>, ind=\n, kbs=^H, kcuu1=\E[A, kcud1=\E[B, kcuf1=\E[C, kcub1=\E[D, khome=\E[H,



4.1.3.4. Параметризованные цепочки

Характеристики, значения которых задаются параметризованными цепочками, могут иметь параметры. Например, таковы характеристики, описывающие позиционирование курсора на экране, или включение комбинации режимов отображения. Для позиционирования курсора используется характеристика cup, при этом передаются два параметра: номер строки и номер столбца. В случае таких характеристик, как cup или sgr (установка атрибутов), параметры передаются через входящую в terminfo подпрограмму tparm().

Аргументы параметрических характеристик обрабатываются согласно включенным в описания этих характеристик специальным последова- тельностям символов, которые начинаются с %. Эти последовательности похожи на те, которые используются в printf(3S). Кроме того, данные можно записать в стек и производить над ними операции, которые записываются в виде, близком к обратной польской записи. Как мы упомянули, cup имеет два аргумента: номер строки и номер столбца. sgr имеет девять аргументов, по одному на каждый из атрибутов отображения. Список аргументов sgr и порядок их следования, а также примеры см. в terminfo(4).

Пусть на нашем терминале курсор позиционируется последовательностью, состоящей из символов ESC [, за которыми следуют номера строки и столбца, разделенные точкой с запятой, а в конце идет H. Координаты задаются относительно 1, а не нуля. Так, чтобы передвинуть курсор в позицию (5, 18) относительно (0, 0), необ- ходимо передать последовательность \E[6;19H.

Целочисленные аргументы записываются в стек последовательностью %p, за которой следует номер аргумента, например, %p2 для записи в стек второго аргумента. %i - это краткая запись для увеличения первых двух аргументов. Для вывода числа из вершины стека в десятичном виде используется %d, как и в printf. Последовательность cup нашего терминала строится следующим образом:
 cup=   Пояснения 
 \E[   вывести ESC [   %i   увеличить оба аргумента   %p1   записать первый аргумент (номер строки) в стек   %d   вывести номер строки в десятичном виде   ;   вывести точку с запятой   %p2   записать второй аргумент (номер столбца в стек)   %d   вывести номер столбца в десятичном виде   H   вывести завершающий цепочку символ H 
или

cup=\E[%i%p1%d;%p2%dH,

Добавив это к нашему описанию, получим:

mytermmytmminefancyterminalMy FANCY Terminal, am, bel=^G, cols#80, lines#30, xon, cr=^M, cuu1=^K, cud1=^G, cub1=^H, cuf1=^L, smso=\ED, rmso=\EZ, el=\EK$<3>, ind=\n, kbs=^H, kcuu1=\E[A, kcud1=\E[B, kcuf1=\E[C, kcub1=\E[D, khome=\E[H, cup=\E[%i%p1%d;%p2%dH,

Подробнее о параметризованных цепочках см. terminfo(4).




Содержание раздела