У меня есть цикл обработки событий, который регулярно вызывает 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?