Как работает цикл обработки событий с select в случае оконных менеджеров X11? - PullRequest
0 голосов
/ 17 декабря 2018

Я просто беру этот пример с lwm:

https://github.com/jamesfcarter/lwm/blob/9483c2a7d7e2b765b0a329b8f694f8a9110d0918/lwm.c#L195-L205

if (select(max_fd, &readfds, NULL, NULL, NULL) > -1) {
    if (FD_ISSET(dpy_fd, &readfds)) {
        while (XPending(dpy)) {
        XNextEvent(dpy, &ev);
        dispatch(&ev);
        }
    }
}

Может кто-нибудь объяснить, что происходит под капотом в упрощенной форме?

Вот мой дубль:

  1. Вы проверяете, доступна ли клавиатура или мышь для чтения в readfs?

  2. Если да, то выспрашивают, есть ли какие-либо ожидающие события в очереди событий X Server.Но для того, чтобы это имело смысл, X Server, вероятно, будет иметь read те точные те же fd, делать необходимые вызовы функций и создавать затем структуры данных, а затем сообщать, что есть какое-то событиеимеется в наличии?Возможно даже, что он все еще не готов и XPending может сказать, что ничего не доступно (в зависимости от того, блокируется он или нет) и пропустить его во время этого select вызова?

  3. Теперь, если действительно есть ожидающее событие, XNextEvent может обработать его.Но это может даже обработать больше , чем то, что было доступно, когда произошел выбор?Допустим, за это время произошло 3-4 клика, и он может просто обработать его?

Другими словами, когда мы имеем дело с X вызовами, будет select s полностьюнадежны?Это правильный способ сделать это или есть лучшие способы?

Мое понимание select основано на простых сценариях, таких как echo, где select означает, что я готов обрабатывать вещи, но когда дело доходит до сложногоПри такой обработке, имеет ли смысл делать select напрямую?


Редактировать: я понимаю, что это не чтение с клавиатуры или мыши напрямую, а отображение fd https://github.com/jamesfcarter/lwm/blob/9483c2a7d7e2b765b0a329b8f694f8a9110d0918/lwm.c#L193. Iне знаете, какой дисплей будет иметь fd, но все же, когда дисплей будет готов fd, мы могли бы просто вызвать XPending и XNextEvent API?Может даже быть вероятность, что в течение этой доли секунды могло произойти что-то дополнительное, что также будет обработано?

...