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

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

Жанры

Программирование в 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';

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

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

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

Бастард Императора. Том 5

Орлов Андрей Юрьевич
5. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 5

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник

Тринадцатый VIII

NikL
8. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VIII

Отверженный III: Вызов

Опсокополос Алексис
3. Отверженный
Фантастика:
фэнтези
альтернативная история
7.73
рейтинг книги
Отверженный III: Вызов

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

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

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

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

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Кодекс Охотника XXXI

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

Кромешник. Том 1

Копьев Демьян
1. У черта на куличках!
Фантастика:
городское фэнтези
мистика
фэнтези
5.00
рейтинг книги
Кромешник. Том 1

Имперец. Том 5

Романов Михаил Яковлевич
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Имперец. Том 5

Ермак

Федоров Евгений Александрович
Проза:
историческая проза
6.25
рейтинг книги
Ермак

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца