LINUX.ORG.RU

X-Window


0

0

Изучаю программирование под X-венду. Написал простейшую программу:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>

#define X 0
#define Y 0
#define WIDTH 200
#define HEIGHT 200
#define WIDTH_MIN 50
#define HEIGHT_MIN 50
#define BORDER_WIDTH 4

char* szHello = "Hello, World!";

int main(int argc, char* argv[])
{
Display* disp;
int scr;
GC gc;
XEvent event;
Window wnd;
Atom wmdestroy;
Atom wmprotocols;
// connect to X server
disp = XOpenDisplay(NULL);
if (disp==NULL) {
fprintf(stderr, "Unable to connect to X server.\n");
exit(1);
}
// create window
scr = DefaultScreen(disp);
wnd = XCreateSimpleWindow(disp, RootWindow(disp, scr),
X, Y, WIDTH, HEIGHT, BORDER_WIDTH,
BlackPixel(disp, scr), WhitePixel(disp, scr));
XSelectInput(disp, wnd, ExposureMask|KeyPressMask);
// set WM_PROTOCOLS property
wmdestroy = XInternAtom(disp, "WM_DESTROY", 1);
wmprotocols = XInternAtom(disp, "WM_PROTOCOLS", 1);
XSetWMProtocols(disp, wnd, &wmdestroy, 1);
// show window
XMapWindow(disp, wnd);
// main loop
while (1) {
XNextEvent(disp, &event);
switch(event.type) {
case ClientMessage:
if (event.xclient.message_type==wmprotocols) {
if (event.xclient.data.l[0]==wmdestroy) {
fprintf(stderr, "Close button pressed!\n");
XCloseDisplay(disp);
exit(0);
}
}
break;
case Expose:
if (event.xexpose.count!=0) break;
gc = XCreateGC(disp, wnd, 0, NULL);
XSetForeground(disp, gc, BlackPixel(disp, 0));
XDrawString(disp, wnd, gc, 20, 20, szHello, strlen(szHello));
XFreeGC(disp, gc);
XFlush(disp);
break;
case KeyPress:
XCloseDisplay(disp);
exit(0);
}
}
return 0;
}

Запускаю прогу из консоли, появляется окошко с текстом... При нажатии ESCAPE успешно завершается, но когда нажимаю кнопку закрытия окна, выдается такая ошибка:
X connection to :0.0 broken (explicit kill or server shutdown).
Похоже, не обрабатывается сообщение ClientMessage (текст "Close button pressed!\n" не выводится).
Что нужно сделать, чтобы корректно обрабатывалось закрытие окна?

Ответ на: комментарий от mv

> wmdestroy = XInternAtom(disp, "WM_DELETE_WINDOW", 1);
Спасибо, товарищ. Теперь все работает.

Den_Zurin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.