Почти каждый учебник, который я нахожу, подсказывает мне сделать это для цикла событий:
XEvent event;
while (true)
{
XNextEvent(display, &event);
switch (event.type)
{
case Expose:
printf("Expose\n");
break;
default:
break;
}
}
Однако нажатие клавиши X для закрытия программы приводит к этому сообщению.
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 10 requests (10 known processed) with 0 events remaining.
Мне действительно странно, что в примерах предлагается использовать бесконечный цикл. Это не кажется естественным, и мои другие программы X11 этого не делают. Поэтому я обыскал. Я узнал, как захватить событие закрытия окна.
Atom wmDeleteMessage = XInternAtom(mDisplay, "WM_DELETE_WINDOW", False);
XSetWMProtocols(display, window, &wmDeleteMessage, 1);
XEvent event;
bool running = true;
while (running)
{
XNextEvent(display, &event);
switch (event.type)
{
case Expose:
printf("Expose\n");
break;
case ClientMessage:
if (event.xclient.data.l[0] == wmDeleteMessage)
running = false;
break;
default:
break;
}
}
Это работает. Он выходит без ошибок.... Но я отказываюсь верить, что это нормальный способ делать что-то. Я имею в виду, это единственный способ правильно выйти из приложения X11? Кажется, что много работы просто для того, чтобы зафиксировать закрытое событие. Как создать "правильный" цикл событий? Почему близкое событие так глубоко погребено? Что мне не хватает?