ΠΠΌΡ ΠΏΠΈΠΊΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠΎΠΌ 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