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

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

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

Имя ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚ΠΎΠΌΠΎΠΌ XA_WM_ICONNAME ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ "TEXT". Π”Π°Π½Π½Ρ‹Π΅ свойства - структура TXTextProperty. Для задания свойства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° XSetIconName() (XSetWMIconName()). ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XGetIconName() (XGetWMIconName()).

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ (hints) ΠΎ Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ ΠΎΠΊΠ½Π°. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚ΠΎΠΌΠΎΠΌ XA_WM_NORMAL_HINTS ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ XA_WM_SIZE_HINTS. Π”Π°Π½Π½Ρ‹Π΅ свойства - структура Ρ‚ΠΈΠΏΠ° TXSizeHints. Для задания свойства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° XSetNormalHints().

Π’ рядС случаСв стоит ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠΊΠΎΠ½Π½ΠΎΠΌΡƒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, ΠΈ Π² ΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹. НапримСр, для Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ xterm), Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΊΠ½ΠΎ всСгда содСрТало ΠΏΠΎΠ»Π½ΠΎΠ΅ количСство строк ΠΈ столбцов. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠ½Π°Ρ…). Π­Ρ‚ΠΈ поТСлания ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠΊΠΎΠ½Π½ΠΎΠΌΡƒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ, хотя Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π΅ΠΌΡƒ ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ структуру Π΄Π°Π½Π½Ρ‹Ρ…, Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ XSetWMNormalHints():

(* ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ…. *)

var

 win_size_hints: PXSizeHints;

 win_size_hints:= XAllocSizeHints();


 if (win_size_hints=nil) then begin

  writeln('XAllocSizeHints - Π½Π΅Ρ‚ памяти');

  halt(1);

 end;


 (* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ структуры *)

 (* Π’Π½Π°Ρ‡Π°Π»Π΅ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ поТСлания ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ…: ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹. *)

 win_size_hints^.flags:= PSize OR PMinSize;

 (* Π—Π°Ρ‚Π΅ΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹. Π’ нашСм случаС - создаСм ΠΎΠΊΠ½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 300x200 ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ ΠΈ устанавливаСм Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² 400x250. *)

 win_size_hints^.min_width:= 300;

 win_size_hints^.min_height:= 200;

 win_size_hints^.base_width:= 400;

 win_size_hints^.base_height:= 250;


 (* ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ поТСлания ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ… ΠΎΠΊΠΎΠ½Π½ΠΎΠΌΡƒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ. *)

 XSetWMNormalHints(display, win, win_size_hints);


 (* Π’ ΠΊΠΎΠ½Ρ†Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ·-ΠΏΠΎΠ΄ структуры. *)

 XFree(win_size_hints);

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΠΊΠ½Π°: способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ, Π²ΠΈΠ΄ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚ΠΎΠΌΠΎΠΌ XA_WM_HINTS ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ XA_WM_HINTS. Π”Π°Π½Π½Ρ‹Π΅ свойства - структура Ρ‚ΠΈΠΏΠ° TXWMHints. Для задания свойства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° XSetWMHints(). Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Ρ‚ΠΈΠΏΠ° XWMHints, пСрСдаваСмая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ XSetWMHints(), Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XAllocWMHints():

var

 win_hints: PXWMHints;

 icon_pixmap: TPixmap;


const

 icon_bitmap_width=20;

 icon_bitmap_height=20;

(* ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π₯ - ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создано ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ xpaint *)

 icon_bitmap_bits: array [0…59] of byte = (

  $60, $00, $01, $b0, $00, $07, $0c, $03, $00, $04, $04, $00,

  $c2, $18, $00, $03, $30, $00, $01, $60, $00, $f1, $df, $00,

  $c1, $f0, $01, $82, $01, $00, $02, $03, $00, $02, $0c, $00,

  $02, $38, $00, $04, $60, $00, $04, $e0, $00, $04, $38, $00,

  $84, $06, $00, $14, $14, $00, $0c, $34, $00, $00, $00, $00

 );


 win_hints:= XAllocWMHints();

 if (win_hints=nil) then begin

  writeln('XAllocWMHints - Π½Π΅Ρ‚ памяти');

  halt(1);

 end;


 (* установим поТСлания ΠΎ состоянии ΠΎΠΊΠ½Π°, ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π΅Π³ΠΎ ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΈ Π΅Π΅ Π²ΠΈΠ΄Π΅ *)

 win_hints^.flags:= StateHint OR IconPositionHint OR IconPixmapHint;


 (* Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ создадим ΠΈΠ· Π½Π΅Π³ΠΎ ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρƒ Π₯. *)

 icon_pixmap:= XCreateBitmapFromData(display, win, PChar(icon_bitmap_bits), icon_bitmap_width, icon_bitmap_height);

 if (icon_pixmap=nil) then begin

  writeln('XCreateBitmapFromData: ошибка создания пиксмапа');

  halt(1);

 end;


 (* Π—Π°Ρ‚Π΅ΠΌ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹Π΅ измСнСния. *)

(* Π² нашСм случаС - сворачиваСм ΠΎΠΊΠ½ΠΎ, опрСдСляСм Π΅Π³ΠΎ ΠΈΠΊΠΎΠ½ΠΊΡƒ ΠΈ устанавливаСм ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΈΠΊΠΎΠ½ΠΊΠΈ Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ экрана. *)

 win_hints^.initial_state:= IconicState;

 win_hints^.icon_pixmap:= icon_pixmap;

 win_hints^.icon_x:= 0;

 win_hints^.icon_y:= 0;


 (* ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ поТСлания ΠΎΠΊΠΎΠ½Π½ΠΎΠΌΡƒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ. *)

 XSetWMHints(display, win, win_hints);


 (* Π’ ΠΊΠΎΠ½Ρ†Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ·-ΠΏΠΎΠ΄ структуры. *)

 XFree(win_hints);

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ свойства ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XGetWMHints().

Атрибут, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ "Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅" ΠΎΠΊΠ½ΠΎ. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚ΠΎΠΌΠΎΠΌ XA_WM_TRANSIENT_FOR ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ XA_STRING. Бвойство задаСтся для ΠΎΠΊΠΎΠ½, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° экранС для выполнСния Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Π΄ΠΈΠ°Π»ΠΎΠ³ΠΈ, мСню). Π’Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ ΠΏΠΎ особому. НапримСр, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊ ΠΎΠΊΠ½Ρƒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ Ρ€Π°ΠΌΠΊΡƒ. Π”Π°Π½Π½Ρ‹Π΅ свойства - ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠΊΠ½Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ. ЗадаСтся свойство с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ XSetTransientForHint().

ИмСна ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π΅Π΅ класса, идСнтифицируСтся Π°Ρ‚ΠΎΠΌΠΎΠΌ XA_WM_CLASS ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ XA_STRING. Π”Π°Π½Π½Ρ‹Π΅ свойства - структура Ρ‚ΠΈΠΏΠ° TXClassHints. ЗадаСтся свойство с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ XSetClassHint() ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XGetClassHint().

Если ΠΎΠΊΠ½ΠΎ (ΠΎΠΊΠ½Π°) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΡƒΡŽ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π·Π°Π΄Π°Ρ‚ΡŒ для Π½Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ colormap. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° заносит ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠΊΠ½Π° (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠΊΠΎΠ½) Π² список, ассоциированный со свойством, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ WM_COLORMAP_WINDOWS. ДСлаСтся это ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ XSetWMColormapWindows(). ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список, ΡƒΠΆΠ΅ находящийся Π² свойствС, ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊ XGetWMColormapWindows().

Когда ΠΎΠΊΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ посрСдством ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π½Π°Π΄ Π½ΠΈΠΌ Ρ€Π°Π·Π½Ρ‹Π΅ дСйствия. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ…. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли ΠΎΠΊΠ½ΠΎ прСдставляСт собой Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ тСкста, ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пытаСтся Π΅Π³ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ, Ρ‚ΠΎ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Ρƒ сидящСго Π·Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, Π° Π½Π΅ ΠΆΠ΅Π»Π°Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π΅Π΄Π°ΠΊΡ†ΠΈΠΈ. Начиная с X11R4 систСмой прСдусматриваСтся свойство с ΠΈΠΌΠ΅Π½Π΅ΠΌ WM_PROTOCOLS. Оно содСрТит список Π°Ρ‚ΠΎΠΌΠΎΠ², ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ свойство, связанноС с дСйствиями, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°Π΄ΠΎ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π­Ρ‚ΠΈ свойства ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

β€’ WM_TAKE_FOCUS - задаСтся, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ фокус Π²Π²ΠΎΠ΄Π° ΠΌΠ΅ΠΆΠ΄Ρƒ своими ΠΎΠΊΠ½Π°ΠΌΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ; Π² этом случаС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ фокусом, Π²Π²ΠΎΠ΄Π°, Π° ΠΏΠΎΡˆΠ»Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ событиС ClientMessage, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅ message_type Ρ€Π°Π²Π½ΠΎ Π°Ρ‚ΠΎΠΌΡƒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ свойству WM_PROTOCOLS, Π° ΠΏΠΎΠ»Π΅ data.l[0] Ρ€Π°Π²Π½ΠΎ Π°Ρ‚ΠΎΠΌΡƒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ свойству WM_TAKE_FOCUS; Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° это событиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° сама ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ XSetInputFocus() для задания ΠΎΠΊΠ½Π°, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ фокус Π²Π²ΠΎΠ΄Π°;

β€’ WM_SAVE_YOURSELF amp;mdash задаСтся, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚ своСго Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ; ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΎΠΊΠΎΠ½ посылаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ событиС ClientMessage, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅ message_type Ρ€Π°Π²Π½ΠΎ Π°Ρ‚ΠΎΠΌΡƒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ свойству WM_PROTOCOLS, Π° ΠΏΠΎΠ»Π΅ data.l[0] Ρ€Π°Π²Π½ΠΎ Π°Ρ‚ΠΎΠΌΡƒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ свойству WM_SAVE_YOURSELF; Π² ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ своС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС;

β€’ WM_DELETE_WINDOW - задаСтся, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΎΠΊΠΎΠ½ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Π΅ΠΉ ΠΎΠΊΠ½Π°; ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΎΠΊΠΎΠ½ посылаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ событиС ClientMessage, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅ message_type Ρ€Π°Π²Π½ΠΎ Π°Ρ‚ΠΎΠΌΡƒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ свойству WM_PROTOCOLS, Π° ΠΏΠΎΠ»Π΅ data.l[0] Ρ€Π°Π²Π½ΠΎ Π°Ρ‚ΠΎΠΌΡƒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ свойству WM_DELETE_WINDOW; Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° сама Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ Π½Π° экранС ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XDestroyWindow().

Бвойство WM_PROTOCOLS задаСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ XSetWMProtocols() ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XGetWMProtocols().

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π·Π°Π΄Π°ΡŽΡ‰Π΅ΠΉ свойство WM_PROTOCOLS ΠΈ производящСй ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ событий.

…

var

 prDisplay: PDisplay;

 nScreenNum: integer;

 prGC: TGC;

 rEvent: TXEvent;

 nWnd: TWindow;

 pnProtocol: array [0…1] of TAtom;

 nWMProtocols: TAtom;


 (* УстанавливаСм связь с сСрвСром, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΎΠΌΠ΅Ρ€ экрана, создаСм ΠΎΠΊΠ½ΠΎ, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ события, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ *)

…

 (* Π—Π°Π΄Π°Π΅ΠΌ свойство WM_PROTOCOLS *)

 pnProtocol [0]:= XInternAtom (prDisplay, 'WM_TAKE_FOCUS', True);

 pnProtocol [1]:= XInternAtom (prDisplay, 'WM_SAVE_YOURSELF', True);

 nWMProtocols:= XInternAtom (prDisplay, 'WM_PROTOCOLS', True);

 XSetWMProtocols (prDisplay, nWnd, pnProtocol, 2);


 (* ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ *)

 XMapWindow (prDisplay, nWnd);


 (* Π¦ΠΈΠΊΠ» получСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий *)

 while true do

 begin

  XNextEvent (prDisplay, @rEvent);

  case (rEvent.type) of

…

  ClientMessage:

  begin

   if (rEvent.xclient.message_type = nWMProtocols) then

   begin

    if (rEvent.xclient.data.l[0] = pnProtocol[0]) then

     writeln('Receiving the input focus.')

    else

     if (rEvent.xclient.data.l[0] = pnProtocol[1]) then