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

на главную - закладки

Жанры

Программирование в X Window средствами Free Pascal

Семериков С. А.

Шрифт:

Для разных алфавитов X поддерживает разные множества логических кодов. Возможные типы алфавитов перечисляются в файле /usr/include/X11/keysym.h.

Одному коду клавиши может соответствовать несколько символов в зависимости от состояния клавиш-модификаторов. Функция

function XKeycodeToKeysym(prDisplay: PDisplay; nKeycode: TKeyCode; nIndex: longint): TKeySym; cdecl; external;

позволяет по коду nKeyCode получить соответствующий ему символ с номером nIndex. Если nIndex равен 0, то полученный символ соответствует просто нажатой клавише. Если nIndex равен 1, то возвращается символ, соответствующий

ситуации, когда клавиша нажата одновременно с Shift.

Функция XKeysymToKeycode осуществляет обратное преобразование.

Программа может получить карту соответствия кодов и символов, обратившись к процедуре XGetKeyboardMapping.

Изменяется соответствие физических и логических кодов процедурой XChangeKeyboardMapping. Следующая последовательность операторов ставит клавише ‹F2› в соответствие символ XK_F3.

var

 nF2Sym, nF3Sym: TKeysym;

 nF2Keycode: TKeyCode;

 prDisplay: PDisplay;

 nF2Sym:= XStringToKeysym ('F2');

 nF3Sym:= XStringToKeysym ('F3');

 nF2Keycode:= XKeysymToKeycode (prDisplay, nF2Sym);

 XChangeKeyboardMapping (prDisplay, nF2Keycode, 1, @nF3Sym, 1);

Здесь использована процедура XStringToKeysym, которая по строке "str" возвращает соответствующий символ XK_str.

Когда соответствие кодов меняется, всем работающим в настоящее время клиентам посылается событие MappingNotify.

Клавиши-модификаторы также имеют логические коды. Клавишам Shift сопоставлены символы XK_Shift_L и XK_Shift_R; Caps Lock соответствует XK_CapsLock; Control - XK_Control_L; Mod1 - XK_Meta_L и XK_Meta_R. Символы остальных модификаторов (Mod2 - Mod5) не определены. X содержит набор специальных процедур, которые позволяют получить и установить соответствие код-символ для модификаторов. Эти функции следующие: XGetModifierMapping, XInsertModifiermapEntry, XDeleteModifiermapEntry, XSetModifierMapping.

X не останавливается на задании соответствия код клавиши - символы, а идет дальше. Система позволяет программе сопоставить любой комбинации модификаторов и клавиш (например, ‹Shift+Ctrl+A›) ASCII строку (например, "EXIT"). Для некоторых клавиш соответствующие строки задаются сервером по умолчанию. Так, символу XK_A соответствует строка "A".

Макрос XRebindKeysym берет символ, список модификаторов и сопоставляет им строку.

Процедура XLookupString, наоборот, берет событие о нажатии (отпускании) клавиши и возвращает соответствующие ему символ и строку. Последний ее параметр - указатель на структуру типа XComposeStatus. Дело в том, что некоторые клавиатуры имеют специальную клавишу Compose, которая позволяет печатать символы, которым нет соответствия среди клавиш. Специальная таблица указывает, какой символ должен быть создан, если обычная клавиша нажимается одновременно с Compose. Ссылка на эту информацию и возвращается в структуре XComposeStatus.

Ниже приводится фрагмент программы, которая распознает функциональные клавиши ‹F1›-‹F5›, и при их нажатии печатает соответствующую строку. Программа также сопоставляет комбинации ‹Shift+Control+A› строку "EXIT". Эта комбинация используется для завершения программы.

var

 prDisplay: PDisplay;

 nScreenNum: integer;

 prGC: TGC;

 rEvent: TXEvent;

 nWnd: TWindow;

 sKeyStr: array [0…19] of char;

 nKeySym: TKeySym;

 naModList: array [0…1] of TKeySym;

 n: integer;

 r: char;

const

 XK_Control_L=$FFE3; (* Left control *)

 XK_Shift_L=$FFE1; (* Left shift *)

 XK_F1=$FFBE;

 XK_F2=$FFBF;

 XK_F3=$FFC0;

 XK_F4=$FFC1;

 XK_F5=$FFC2;

 XK_F6=$FFC3;

 (*
Устанавливаем связь с сервером, получаем номер экрана… *)

 (* Задаем соответствие символ-строка *)

 naModList[0]:= XK_Control_L;

 naModList[1]:= XK_Shift_L;

 XRebindKeysym (prDisplay, XK_F6, naModList, 2, 'EXIT',
strlen('EXIT'));

 (* Цикл получения и обработки событий *)

 while true do begin

XNextEvent (prDisplay, @rEvent);

case (rEvent.eventtype) of

KeyPress:

begin

(* Очищаем строку *)

for n:=0 to 19 do 
sKeyStr[n]:=#0;

(* Получаем строку, соответствующую событию *)

XLookupString (@rEvent.xkey, sKeyStr, 20, @nKeySym, NIL);

if (strcomp (sKeyStr, 'EXIT')=0) then

begin

XFreeGC (prDisplay, prGC);

XCloseDisplay (prDisplay);

halt (0);

end;

case nKeySym of

XK_F1: r:='1';

XK_F2: r:='2';

XK_F3: r:='3';

XK_F4: r:='4';

XK_F5: r:='5';

else r:='0';

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

Лекарь Империи 9

Карелин Сергей Витальевич
9. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
Лекарь Империи 9

Газлайтер. Том 5

Володин Григорий
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 5

Сапер

Вязовский Алексей
1. Сапер
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.29
рейтинг книги
Сапер

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV

Кодекс Охотника. Книга VII

Винокуров Юрий
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Кодекс Охотника. Книга VII

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Точка Бифуркации XI

Смит Дейлор
11. ТБ
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации XI

Воронцов. Перезагрузка. Книга 2

Тарасов Ник
2. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Воронцов. Перезагрузка. Книга 2

Спасите меня, Кацураги-сан! Том 4

Аржанов Алексей
4. Токийский лекарь
Фантастика:
городское фэнтези
попаданцы
дорама
фэнтези
5.00
рейтинг книги
Спасите меня, Кацураги-сан! Том 4

Газлайтер. Том 26

Володин Григорий Григорьевич
26. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 26

Я уже царь. Книга XXIX

Дрейк Сириус
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я уже царь. Книга XXIX

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Огненный наследник

Тарс Элиан
10. Десять Принцев Российской Империи
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Огненный наследник