Код:
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
extern int errno;
int main(void) {
Display *d;
Window w;
XEvent e;
char *msg = "Hello, World!";
int s;
/* Соединиться с X сервером, если X сервер на удаленной машине
* следует разрешить на машине, где запущен X Server
* удаленные соединения командой xhost+ (см. man xhost)
*/
if ((d = XOpenDisplay(getenv("DISPLAY"))) == NULL) {
printf("Can't connect X server: %s\n", strerror(errno));
exit(1);
}
s = DefaultScreen(d);
/* Создать окно */
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 200, 200, 1,
BlackPixel(d, s), WhitePixel(d, s));
/* На какие события будем реагировать */
XSelectInput(d, w, ExposureMask | KeyPressMask);
/* Вывести окно на экран */
XMapWindow(d, w);
/* Бесконечный цикл обработки событий */
while (1) {
XNextEvent(d, &e);
/* Перерисовать окно */
if (e.type == Expose) {
XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);
XDrawString(d, w, DefaultGC(d, s), 50, 50, msg, strlen(msg));
}
/* При нажатии кнопки-выход */
if (e.type == KeyPress)
break;
}
/* Закрыть соединение с X сервером */
XCloseDisplay(d);
return 0;
}
Консоль (если закрыть окно «крестиком»):
~/Prog/C/Xlib$ ./test
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 13 requests (11 known processed) with 0 events remaining.
Дополнение: Пробую ставить маску StructureNotifyMask, чтобы ловить событие DestroyNotify. Фиг там - по ресайзу\муву событие появляется, по крестику - нет.