Как изящно выйти из цикла событий X11?

Почти каждый учебник, который я нахожу, говорит мне сделать это для моего цикла обработки событий:

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? Кажется, что нужно много работать, чтобы запечатлеть близкое событие. Как сделать «правильный» цикл событий? Почему близкое событие так глубоко похоронено? Что мне не хватает?

39
задан TheBuzzSaw 29 May 2012 в 02:43
поделиться