• 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;
pnProtococlass="underline" 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
begin
XCloseDisplay (prDisplay);
halt(0);
end;
end;
end;
…
end;
end;
…
Заказывается реакция на два события: получение фокуса ввода (WM_TAKE_FOCUS) и завершение программы (WM_SAVE_YOURSELF). Когда сервер посылает событие первого типа, задача печатает соответствующее сообщение на устройства вывода. При приходе события второго типа, программа закрывает связь с сервером и завершается.
1.5.3 Лабораторная работа #5 "Межклиентское взаимодействие"
1. Составьте программу, которая при получении фокуса ввода перекрашивает свое окно в другой цвет.
2. Составьте программу, порождающую два расположенных рядом дочерних окна, в которых отображаются графики функций sin(x) на отрезке [0; 2?] и exp(x) на отрезке [-2; 2]. Графики масштабировать по размеру окон.
3. Создайте окно, изменяющее свои размеры таким образом, чтобы мышь всегда была в его центре.
4. Создайте окно, "убегающее" от указателя мыши.
5. Создайте программу, которая по нажатию клавиши мыши в основном окне создает новое окно (не более 100 одновременно), а по нажатию клавиши мыши в дочернем окне удаляет его. Если дочернее окно существует более одной минуты, оно должно самоудаляться.
6. Создайте программу моделирования эволюции клеточного автомата "Жизнь", ячейки которого имею два состояния: пусто и заполнено. Если рядом с пустой ячейкой три заполненных, она заполняется. Если рядом с заполненной ячейкой меньше двух или больше трех заполненных, ячейка становится пустой. Размеры модельного поля - 64×64 ячейки, вначале поле пустое. По нажатию любой кнопки мыши состояние ячейки меняется на противоположное, по нажатию пробела осуществляется один шаг эволюции, а по нажатии Escape - выход из программы.
Литература
Полищук А.П., Семериков С.А. Программирование в X Window. - Кривой Рог: Издательский отдел КГПУ, 2003. - 192 с.
Полищук А.П., Семериков С.А. Событийно-ориентированное программирование. - Кривой Рог: КГПУ, 2001. - 336 с.
Робачевский А.М. Операционная система UNIX. - К.: БХВ, 2000. - 518 с.
Adrian Nye. Volume 0: X Protocol Reference Manual, 4rd Edition. - O'Reilly & Associates, 1990. - 446 p.
Adrian Nye. Volume 1: Xlib Programming Manual, 3rd Edition. - O'Reilly & Associates, 1992. - 821 p.
Adrian Nye. Volume 2: Xlib Reference Manual. - O'Reilly & Associates, 1992. - 935 p.
Robert W. Scheifler & James Gettys. X Window System: The Complete Reference to Xlib, X Protocol, ICCCM, XLFD. X Version 11, Release 4. - Digital Press, 1992. - 711 p.