Событие завершения XShm не установлено Показать дескриптор файла - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть цикл обработки событий, который регулярно вызывает poll() для набора дескрипторов считываемых файлов и отправляет события, когда они готовы для чтения.Одним из этих файловых дескрипторов является дескриптор файла X-соединения, возвращаемый из XConnectionNumber(), и он будет вызывать следующее, когда дескриптор файла будет готов:

XEvent evt;

if (! XPending (display))
    return false;

XNextEvent (display, &evt);

// do something with evt

Все это прекрасно работает для получения событий отображения.

Перерисовка в моем приложении основывается на расширениях XShm, по сути, она вызывает XShmPutImage() для рисования некоторых пикселей, а затем ждет события завершения до тех пор, пока рисунок не будет снова, событие завершения найдено путем проверки evt.any.type == XShmGetEventBase (display) в приведенном вышекод.

Проблема в том, что событие завершения XShm, по-видимому, не устанавливает файловый дескриптор дисплея как готовый к вводу-выводу, поэтому я получаю события перерисовки только тогда, когда другие события отправляются на дисплей инастройка fd, например, движения мыши, ключевые события и т. д. Это приводит к тому, что приложение реагирует только на другие события.

Не понимаю ли я, как отправляется событие завершения XShm?Разве он не должен устанавливать дисплей fd?

1 Ответ

0 голосов
/ 11 декабря 2018

ОК. Я ответил на свой вопрос.Кажется, мне нужно установить флаг POLLOUT в структуре pollfd для дескриптора файла дисплея.Ранее я устанавливал только POLLIN, так как ожидал входных событий, но события завершения XShm устанавливают fd как готовый для записи.

...