Кто-нибудь есть какие-либо идеи о том, как я могу получить мой цикл событий основного потока, который выглядит следующим образом:
const int MY_CUST_MSG(877);
xcb_generic_event_t *event;
while (event = xcb_wait_for_event(connection)) {
switch (event->response_type & ~0x80) {
case MY_CUST_MSG:
// do something
break;
default:
// Unknown event type, ignore it
debug_log("Unknown event: ", event->response_type);
}
free(event);
}
Чтобы отреагировать на сообщение из вторичного потока?
xcb_wait_for_event()
ожидает получения события от сервера. Вы должны будете отправить сообщение себе через сервер, но я бы предложил альтернативный подход:
использование xcb_file_descriptor()
чтобы получить базовый файловый дескриптор для X-соединения.
Настройте внутренний канал, который ваше приложение может использовать для отправки сообщений себе между потоками.
использование xcb_poll_for_event()
которая является неблокирующей версией xcb_wait_for_event()
, чтобы реализовать неблокирующую проверку, если есть событие, которое было прочитано, и если так, прочитайте его.
Выполните неблокирующее чтение на вашем внутреннем канале, чтобы проверить наличие любого внутреннего сообщения из другого потока.
Если ни на шаге 3, ни на 4 не появилось сообщение, используйте poll()
ждать того или иного события.
Вам также нужно будет использовать xcb_flush()
сбросить любые события вручную, и xcb_connection_has_error()
проверить наличие фатальной ошибки подключения к X-серверу.
Смотрите учебник для дополнительной информации.
Других решений пока нет …