Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² X Window срСдствами Free PascalΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 11

Автор А. ΠŸΠΎΠ»ΠΈΡ‰ΡƒΠΊ

β€’ XC_arrow - ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ курсор Π² Ρ„ΠΎΡ€ΠΌΠ΅ стрСлки, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ сСрвСром.

β€’ XC_pencil - курсор Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΊΠ°Ρ€Π°Π½Π΄Π°ΡˆΠ°.

β€’ XC_watch - пСсочныС часы.

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ курсор с использованиСм этих ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² нСслоТно. Из Ρ„Π°ΠΉΠ»Π° /usr/include/X11/cursorfont.h ΡƒΠ·Π½Π°Π΅ΠΌ Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ опСрСдСляСм ΠΈΡ…:

const

 XC_watch=150;


var

 (* эта пСрСмСнная содСрТит дСскриптор создаваСмого курсора *)

 watch_cursor: TCursor;


(* создаСм курсор "пСсочныС часы" *)

 watch_cursor:= XCreateFontCursor(display, XC_watch);

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ создания курсора - использованиС ΠΏΠ°Ρ€Ρ‹ ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ°Ρ€Ρ‚ Π³Π»ΡƒΠ±ΠΈΠ½ΠΎΠΉ 1. Одна пиксСльная ΠΊΠ°Ρ€Ρ‚Π° опрСдСляСт Ρ„ΠΎΡ€ΠΌΡƒ курсора, Π° другая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ маска, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ, ΠΊΠ°ΠΊΠΈΠ΅ пиксСли курсора Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ нарисованы. ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ пиксСлСй Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠΉ. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ курсора осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ XCreatePixmapCursor(). Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° создадим курсор, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ "icon.bmp". Π‘ΡƒΠ΄Π΅ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ ΡƒΠΆΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Π² ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρƒ, дСскриптор ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сохранСн Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ bitmap. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π°Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ, Π° Π±Π΅Π»Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ эффСкта, Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΊΠΎΠ½ΠΊΡƒ ΠΈ ΠΊΠ°ΠΊ ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρƒ курсора, ΠΈ ΠΊΠ°ΠΊ маску пиксСльной ΠΊΠ°Ρ€Ρ‚Ρ‹.

var

 (* эта пСрСмСнная содСрТит дСскриптор создаваСмого курсора *)

 icon_cursor: TCursor;


 (* Π²Π½Π°Ρ‡Π°Π»Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ основной ΠΈ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚Π° курсора *)

 cursor_fg, cursor_bg: TXColor;

 screen_colormap: TColormap;

 rc: TStatus;


 (* ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ доступ ΠΊ ΠΏΠ°Π»ΠΈΡ‚Ρ€Π΅ экрана ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ *)

 screen_colormap:= XDefaultColormap(display, XDefaultScreen(display));


 (* выдСляСм Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ΠΈ Π±Π΅Π»Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚Π° *)

 rc:= XAllocNamedColor(display, screen_colormap, 'black', @cursor_fg, @cursor_fg);

 if (rc = 0) then begin

  writeln('XAllocNamedColor - Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ "black"');

  halt(1);

 end;

 rc:= XAllocNamedColor(display, screen_colormap, 'white', @cursor_bg, @cursor_bg);

 if (rc = 0) then begin

  writeln('XAllocNamedColor - Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ "white"');

  halt(1);

 end;


 (* НаконСц, создаСм курсор. Π“ΠΎΡ€ΡΡ‡ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ устанавливаСм Π±Π»ΠΈΠΆΠ΅ ΠΊ  Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ Π»Π΅Π²ΠΎΠΌΡƒ ΡƒΠ³Π»Ρƒ курсора - ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (x=5, y=4). *)

 icon_cursor:= XCreatePixmapCursor(display, bitmap, bitmap, @cursor_fg, @cursor_bg, 5, 4);

Когда ΠΌΡ‹ опрСдСляСм курсор, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ пиксСль курсора являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, доставляСмым ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ события ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΌΡ‹ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ курсора, которая Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ выглядит ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ Π½Π° "Π³ΠΎΡ€ΡΡ‡ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ". НапримСр, Π½Π° курсорС Π² Π²ΠΈΠ΄Π΅ стрСлки ΠΊΠΎΠ½Π΅Ρ† стрСлки Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ горячая Ρ‚ΠΎΡ‡ΠΊΠ°.

Когда курсор большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ XFreeCursor():

XFreeCursor(display, icon_cursor);

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ курсор создан, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ X сСрвСру ΠΎΠ± ΠΎΠΊΠ½Π΅, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½. Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XDefineCursor(), ΠΈ заставляСт сСрвСр X ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ этого курсора всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ пСрСмСщаСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ этого ΠΎΠΊΠ½ΠΎ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ этот курсор ΠΎΡ‚ нашСго ΠΎΠΊΠ½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Xlib XUndefineCursor(), которая заставит ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ встроСнный курсор.

(* ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ курсор ΠΊ ΠΎΠΊΠ½Ρƒ *)

XDefineCursor(display, win, icon_cursor);


(* ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ курсор ΠΎΡ‚ ΠΎΠΊΠ½Π° *)

XUndefineCursor(display, win);

1.2.7 Лабораторная Ρ€Π°Π±ΠΎΡ‚Π° #2 "ВСкст ΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠ°"

1. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹Π²ΠΎΠ΄ΡΡ‰ΡƒΡŽ тСкстовоС сообщСниС Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ (Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠΊΠ½Π°) ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ. Π¦Π²Π΅Ρ‚ ΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π°.


2. Π‘ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ со стандартного Π²Π²ΠΎΠ΄Π° маску ΡˆΡ€ΠΈΡ„Ρ‚Π°, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡƒΡŽ строку, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ…, Ρƒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΡƒΡŽ ΠΎΠΊΠ½ΠΎ с тСкстом согласно Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.


3. НарисуйтС Π² ΠΎΠΊΠ½Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sin(x) Π½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ΅ [-?;?]. Оси ΠΏΠΎΠ΄ΠΏΠΈΡˆΠΈΡ‚Π΅ курсивом, ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠΎ осям - ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ, Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ (0) Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ.


4. НарисуйтС Π² ΠΎΠΊΠ½Π΅ 100 окруТностСй. Π¦Π²Π΅Ρ‚, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ†Π΅Π½Ρ‚Ρ€Π° ΠΈ радиус Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.


5. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ StructureNotifyMask ΠΈ русский ΡˆΡ€ΠΈΡ„Ρ‚, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ задания Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ #1 Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сообщСниС всСгда ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΎΡΡŒ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ ΠΎΠΊΠ½Π°.


6. Π‘ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹Π²ΠΎΠ΄ΡΡ‰ΡƒΡŽ Π² ΠΎΠΊΠ½ΠΎ всС символы стандартного курсорного ΡˆΡ€ΠΈΡ„Ρ‚Π°.

1.3 Π Π°Π±ΠΎΡ‚Π° с внСшними устройствами

1.3.1 ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°

Как ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π·Π°Π΄Π°Ρ‡ΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π² X Window, Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для Π²Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΈΠ»ΠΈ отпускаСт ΠΊΠ»Π°Π²ΠΈΡˆΡƒ, сСрвСр ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСобразуСтся Π² событиС ΠΈ отправляСтся Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ фокус Π²Π²ΠΎΠ΄Π° (input focus).

Поясним, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ фокус Π²Π²ΠΎΠ΄Π°. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° Ρƒ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΎΠ΄Π½Π°, ΠΈ ΠΎΠ½Π° раздСляСтся всСми Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ. Но Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠΉ ΠΎΡ‚ устройства сигнал доступСн лишь ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ…, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‚ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ. Π’ этом случаС говорят, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈ Π΅Π΅ ΠΎΠΊΠ½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ фокус Π²Π²ΠΎΠ΄Π°. ПослСдний ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ ΠΎΠΊΠ½Π° ΠΊ ΠΎΠΊΠ½Ρƒ ΠΈ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Когда ΠΎΠΊΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ фокус, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ посылаСтся событиС FocusIn, ΠΏΡ€ΠΈ ΠΏΠΎΡ‚Π΅Ρ€Π΅ - ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ событиС FocusOut.

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ событиС KeyPress. Π‘Π΅Ρ€Π²Π΅Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ событиС KeyRelease, ΠΊΠΎΠ³Π΄Π° клавиша отпускаСтся, Π½ΠΎ это справСдливо Π½Π΅ для всСх Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ².

Оба этих события ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ структурой Ρ‚ΠΈΠΏΠ° TXKeyEvent. Π•Π΅ ΠΏΠΎΠ»Π΅ keycode содСрТит ΠΊΠΎΠ΄ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши, Π° ΠΏΠΎΠ»Π΅ state - состояниС клавиш-ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΡ‹ΡˆΠΈ. ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ клавиши, ΠΊΠ°ΠΊ Shift, Ctrl, Caps Lock. ΠšΡ€ΠΎΠΌΠ΅ этого, X прСдусматриваСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ Mod1,…, Mod5. КаТдой Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавишС-ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΌΡ‹ΡˆΠΈ соотвСтствуСт Ρ„Π»Π°Π³ Π² ΠΏΠΎΠ»Π΅ state.

ΠšΠΎΠ΄Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»Π΅ keycode структуры TXKeyEvent, ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ клавиши. Π˜Ρ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ значСния зависят ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. Π­Ρ‚ΠΈ ΠΊΠΎΠ΄Ρ‹ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ физичСскими. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, сСрвСр устанавливаСт соотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ физичСскими ΠΊΠΎΠ΄Π°ΠΌΠΈ клавиш, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΊ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ, ΠΈ цСлочислСнными константами - логичСскими ΠΊΠΎΠ΄Π°ΠΌΠΈ (символами). Они ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅ /usr/include/X11/keysymdef.h ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с прСфикса "XK_". Π’Π°ΠΊ, Π±ΡƒΠΊΠ²Π΅ "a" соотвСтствуСт символ XK_a, клавишС β€ΉReturnβ€Ί (β€ΉEnterβ€Ί) - символ XK_Return ΠΈ Ρ‚.Π΄.

Для Ρ€Π°Π·Π½Ρ‹Ρ… Π°Π»Ρ„Π°Π²ΠΈΡ‚ΠΎΠ² 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().