Google

Терминалы, клавиатура, национализация

Терминалы
clip-программы способны работать на любом типе терминалов и эмуляторов. Описание "способностей" терминала читается из terminfo, а если есть переменная окружения TERMCAP то из файла, на который указывает TERMCAP. Но, в дополнение к этим описателям, имеются расширенные возможности указать clip-программе специальные возможности терминала. Эти описатели лежат в каталоге $CLIPROOT/term и выглядят примерно так
файл term/linux-stelnet
# работать с описателем терминала linux в terminfo
+TERM=linux
# способен ли терминал выдавать скан-коды вместо ansi- кодов
CLIP_SCANMODE=terminal
# какой последовательностью можно включить режим передачи скан-кодов
CLIP_SCANSTART=\033[S
# какой последовательностью можно выключить режим передачи скан-кодов
CLIP_SCANSTOP=\033[R
# описание раскладки клавиатуры для клавиатурного драйвера clip-программы
CLIP_KEYMAP=rustelnet
# кодировка clip-программы // unicode - file
CLIP_HOSTCS=koi8-r
# кодировка клиентской части // unicode - file
CLIP_CLIENTCS=cp866
# символы одинарной псевдографики
CLIP_LINECHARS=\200\201\204\211\205\206\212\207\202\210\203
# символы двойной псевдографики
CLIP_DLINECHARS=\240\241\253\273\256\261\276\265\245\270\250
# таблица перекодировки цветов
CLIP_COLORMAP=0123456789ABCDEF

Все "продвинутые" названия терминалов надо прописать в ваших terminfo / termcap, а, по сути, просто залинковать подходящий описатель (linux) на новое имя.
Перекодирование выдаваемой информации на терминал производится по стандартным unicode - таблицам из поставки linux, находящиеся в каталоге /usr/share/consoletrans. Необходимые описатели надо распаковать и выложить в каталог $CLIPROOT/charsets. Часть описателей имеется и в дистрибутиве clip.

Клавиатура

clip-программы имеют два драйвера клавиатуры:

ansi+модификаторы - т.е. от терминала принимаются ansi-коды нажатых клавиш, а для расширенных возможностей используются два модификатора - CtrlJ, CtrlK. Модификаторы изменяют для clip-программы код нажатой клавиши. Например: нажать клавишу 1 - получится код 49, если нажать CtrlJ,1 - получится код 376, если нажать CtrlK,1 получиться тоже 376. Модификатор CtrlJ работает как нажатый Alt, а модификатор CtrlK как нажатый Shift, но не на всех клавишах.

Более продвинутый режим клавиатуры - если терминал умеет передавать на хост скан-коды нажатых и отпущенных клавиш. В данном случае подключается драйвер клавиатуры, аналогичный русификатору в DOS. Получает скан-коды, обрабатывает их, помещает в буфер клавиатуры, заполняет и поддерживает статусы управляющих клавиш.
В таком варианте доступны все сочетания клавиш, если правильно сделать keymap-описание. Вплоть до возможности набирать код символа через зажатый "alt+код_набранный_на_цифровой_клавиатуре"!
Описание клавиатуры в данном случае используется такое же, как и описание консольной раскладки - /usr/share/keymaps/* . Для того чтобы clip-программы смогли делать то же самое, надо взять подходящий вам keymaps, направить на него $CLIPROOT/keymaps/genmap.sh, сгенерировать описание клавиатуры для использования в clip-программах, положить это описание в $CLIPROOT/keymaps и прописать CLIP_KEYMAP в файле с описанием терминала (см. чуть выше).

В качестве терминала со скан-кодами может быть использована linux-консоль или наш эмулятор терминала ftp.itk.ru/pub/telnet/stelnet.zip.
Заходить от имени "продвинутого" терминала можно так :
stelnet -s -t linux-stelnet host_name.
Если запускать clip-программы вот в таком виде:
export TERM=linux-stelnet
my_clip_program
export TERM=linux-koi8

Национализация

Национализация состоит из национализации устройства отображения, клавиатуры, локализации строковых констант и встроенных функций.

Устройства отображения информации (console,terminal, emulator). Их национализация производится стандартными для ОС способами - загрузкой шрифтов, русификацией терминалов путем прошивки в ПЗУ или методом загрузки драйверов типа keyrus, kbdrus, rk.

В случае если используется скан-кодовый режим клавиатуры - раскладка и кодировка клавиатуры производится путем создания keymap-файла и генерации, на его основе, файла-описателя для clip-драйвера клавиатуры. В другом случае клавиатура будет такой, какой она будет приниматься от терминала.

Мышь

Мышь поддерживается в следующих случаях:
На консоли в стандартном терминальном режиме посредством демона gpm.
В X-Window при терминалах TERM==xterm или TERM==rxwt
В прочих X-Window терминалах если есть переменная окружения XTERM_MOUSE==on
С эмулятора терминала stelnet если есть переменная окружения XTERM_MOUSE==on
С консоли через ssh на другую машину - ставьте пакет trans_1.2
В операционной системе Windows.

Национализация

Некоторые clipper-функции имеют национальный контекст - upper,lower,isalpha, isdigit, псевдографика, весовые коэфициенты для индексации и сравнения строк и т.п.
Для создания файла-описателя национальных особенностей этих функций имеется утилита $CLIPROOT/charsets/gen_tbl. Ей надо скормить БД с unicode-описателями языков и собственно один из uni-файлов из каталога /usr/share/consoletrans. На основании этих данных будет сгенерирован файл .tbl с таблицами перекодировки и других национальных особенностей вышеописанных функций. Указать в описании терминала под именем CLIP_HOSTCS, какой надо использовать файл tbl.
Чтобы данные из DBF можно было использовать одновременно разными обработчиками в разных кодировках, в clip предусмотрена специальная установка:
set("DBF_CHARSET","cp866")
или командой
set dbf charset to cp866
cp866 и есть имя tbl-файла с описанием национальных особенностей.
При этом может оказаться так, что данные в DBF хранятся в одной кодировке, сама программа совсем в другой, а отображение на экране еще и в третьей (см. описание терминала).

Также имеется возможность указывать кодировку принтера: set("PRINTER_CHARSET","cp866") или командой
set printer charset to cp866

Локализация строковых констант заключается в том, что все строковые константы, описанные в исходных текстах как [строковые_данные], складируются компилятором в $CLIPROOT/locale. Таким образом, имеется возможность сделать для этих констант соответствующие транскрипции для других языков.
Clip-программы во время запуска считывают переменную окружения LANG, и, по указанному имени языка, достают из $CLIPROOT/locale.po соответствующие указанному языку значения констант.

© Ю.Хныкин, uri@itk.ru, 2000