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

ЖАНРЫ

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

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

Шрифт:

 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';

end;

if (n<>0) then begin

sKeyStr[0]:='F';

sKeyStr[1]:=r;

sKeyStr[2]:=#0;

strcat(sKeyStr, ' pressed.');

XClearWindow (prDisplay, nWnd);

XDrawString (prDisplay, nWnd, prGC, 10, 50,
sKeyStr, strlen (sKeyStr));

end;

end;

 end;

end;

Сервер имеет ряд атрибутов, воздействующих на обработку сигналов клавиатуры. Получить их можно с помощью функции XGetKeyboardControl. Она возвращает указанные параметры в переменной, имеющей тип TXKeyboardState, определенный следующим

образом:

TXKeyboardControl = record

 key_click_percent: longint;

 bell_percent: longint;

 bell_pitch: longint;

 bell_duration: longint;

 led: longint;

 led_mode: longint;

 key: longint;

 auto_repeat_mode: longint;

 end;

PXKeyboardControl = ^TXKeyboardControl;

Первые четыре поля совпадают с аналогичными полями структуры TXKeyboardState. Поля led и led_mode позволяют сообщить серверу, какие из клавиш-модификаторов должны сопровождаться подсветкой. Если поле led не задано, и led_mode равно LedModeOn, то изменяется состояние всех клавиш, для которых поддерживается световое сопровождение. Если led_mode равно LedModeOff, то состояние клавиш не меняется. Если поле led задано, то это есть комбинация флагов, указывающих, для каких клавиш подсветку включить (led_mode равно LedModeOn) или выключить (led_mode равно LedModeOff).

Поля key и auto_repeat_mode определяют, для какой клавиши (клавиш) включить (auto_repeat_mode равно AutoRepeatModeOn) или выключить (auto_repeat_mode равно AutoRepeatModeOff) режим автоматического повтора. Если поле key задано, то автоматический повтор включается или выключается только для клавиши с кодом key.

1.3.2 Мышь

С точки зрения программы общение с мышью похоже на работу с клавиатурой. X получает сигналы от устройства, преобразует их в события и помещает последние в очередь программы. Однако есть и существенная разница. Если события от клавиатуры передаются лишь программе, окно которой имеет фокус ввода, то события от мыши могут передаваться, в принципе, любой задаче, окно (окна) которой присутствуют на экране.

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

• ButtonPressMask - уведомлять о нажатии любой кнопки в одном из окон программы.

• ButtonReleaseMask - уведомлять об отпускании любой кнопки в одном из окон программы.

В цикле обработки сообщений могут проверяться такие события:

• ButtonPress - нажата кнопка в одном из окон программы.

• ButtonRelease - отпущена кнопка в одном из окон программы.

Структура для этих сообщений получается доступом к полю xbutton объединения TXEvent и содержит, в частности, такие поля:

• window: TWindow - идентификатор окна, которому было послано сообщение (в случае, если оно было зарегистрировано для нескольких окон программы).

• x, y: longint - координаты x и y (в пикселях) мышиного курсора в момент нажатия.

• button: cardinal - номер нажатой кнопки (может принимать значения Button1, Button2, Button3).

• time: TTime - время (в миллисекундах), которое длилось событие. Может использоваться для определения "двойного щелчка".

В качестве примера приведем фрагмент кода, в котором рисуется черный пиксель в позиции мыши всякий раз, когда мы получаем событие "нажатие кнопки" от первой кнопки мыши, и стирается пиксель (то есть рисуется белый), когда нажата вторая кнопка мыши. Предполагается существование двух GC: gc_draw с черным цветом переднего плана и gc_erase с белым цветом переднего плана.

Поделиться с друзьями: