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.
Если окно (окна) программы имеют собственную цветовую палитру, то приложение должно соответствующим образом задать для него атрибут 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;