как выйти из блокировки XNextEvent xlib

Под windowsми stream GUI обычно вызывает GetMessage в ожидании сообщения, когда другой stream использует PoseMessage, помещая сообщение в очередь, тогда stream GUI вернет GetMessage (блокирование блокировки).

Кто-нибудь может сказать мне, когда я использую XNextEvent под XWindows для ожидания события, как я могу «разбудить» stream GUI в другом streamе. Есть ли какой-нибудь API, такой как PoseMessage, который я могу использовать?

Нет. Поэтому большинство интерфейсов пользовательского интерфейса (Gtk, KDE и т. Д.) Используют настраиваемые основные контуры, чтобы слушать больше источников событий.

Внутри XNextEvent использует сокет, поэтому он вызывает select() чтобы знать, когда вход доступен. Итак, вы можете: вызвать ConnectionNumber(display) чтобы получить дескриптор файла, который вам нужно передать select()

Это позволяет прослушивать несколько файловых дескрипторов.

Пример кода из http://www.linuxquestions.org/questions/showthread.php?p=2431345#post2431345

 #include  #include  #include  #include  Display *dis; Window win; int x11_fd; fd_set in_fds; struct timeval tv; XEvent ev; int main() { dis = XOpenDisplay(NULL); win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 1, 1, 256, 256, \ 0, BlackPixel (dis, 0), BlackPixel(dis, 0)); // You don't need all of these. Make the mask as you normally would. XSelectInput(dis, win, ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | StructureNotifyMask ); XMapWindow(dis, win); XFlush(dis); // This returns the FD of the X11 display (or something like that) x11_fd = ConnectionNumber(dis); // Main loop while(1) { // Create a File Description Set containing x11_fd FD_ZERO(&in_fds); FD_SET(x11_fd, &in_fds); // Set our timer. One second sounds good. tv.tv_usec = 0; tv.tv_sec = 1; // Wait for X Event or a Timer int num_ready_fds = select(x11_fd + 1, &in_fds, NULL, NULL, &tv); if (num_ready_fds > 0) printf("Event Received!\n"); else if (num_ready_fds == 0) // Handle timer here printf("Timer Fired!\n"); else printf("An error occured!\n"); // Handle XEvents and flush the input while(XPending(dis)) XNextEvent(dis, &ev); } return(0); } в #include  #include  #include  #include  Display *dis; Window win; int x11_fd; fd_set in_fds; struct timeval tv; XEvent ev; int main() { dis = XOpenDisplay(NULL); win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 1, 1, 256, 256, \ 0, BlackPixel (dis, 0), BlackPixel(dis, 0)); // You don't need all of these. Make the mask as you normally would. XSelectInput(dis, win, ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | StructureNotifyMask ); XMapWindow(dis, win); XFlush(dis); // This returns the FD of the X11 display (or something like that) x11_fd = ConnectionNumber(dis); // Main loop while(1) { // Create a File Description Set containing x11_fd FD_ZERO(&in_fds); FD_SET(x11_fd, &in_fds); // Set our timer. One second sounds good. tv.tv_usec = 0; tv.tv_sec = 1; // Wait for X Event or a Timer int num_ready_fds = select(x11_fd + 1, &in_fds, NULL, NULL, &tv); if (num_ready_fds > 0) printf("Event Received!\n"); else if (num_ready_fds == 0) // Handle timer here printf("Timer Fired!\n"); else printf("An error occured!\n"); // Handle XEvents and flush the input while(XPending(dis)) XNextEvent(dis, &ev); } return(0); } 

Вы можете выйти из блокирующего XNextEvent, отправив себе фиктивное событие.

 Window interClientCommunicationWindow; Bool x11EventLoopActive = True; // create a dummy window, that we can use to end the blocking XNextEvent call interClientCommunicationWindow = XCreateSimpleWindow(dpy, root, 10, 10, 10, 10, 0, 0, 0); XSelectInput(dpy, interClientCommunicationWindow, StructureNotifyMask); XEvent event; while(x11EventLoopActive) { XNextEvent(dpy, &event); ... } 

В другом streamе вы можете сделать это, чтобы закончить цикл:

 x11EventLoopActive = False; // push a dummy event into the queue so that the event loop has a chance to stop XClientMessageEvent dummyEvent; memset(&dummyEvent, 0, sizeof(XClientMessageEvent)); dummyEvent.type = ClientMessage; dummyEvent.window = interClientCommunicationWindow; dummyEvent.format = 32; XSendEvent(dpy, interClientCommunicationWindow, 0, 0, (XEvent*)&dummyEvent); XFlush(dpy); 

Вы должны использовать: Bool XCheckMaskEvent (Display *, long, XEvent)

Функция XCheckMaskEvent сначала выполняет поиск в очереди событий, а затем любые события, доступные на сервере, для первого события, которое соответствует указанной маске.

Если он находит совпадение, XCheckMaskEvent удаляет это событие, копирует его в указанную структуру XEvent и возвращает True . Другие события, хранящиеся в очереди, не отбрасываются.

Если запрошенное событие недоступно, XCheckMaskEvent возвращает False , и выходной буфер будет очищен.

  • Есть ли представление для ввода целых чисел в Android?
  • Создать редактор гитарных аккордов в WPF (из RichTextBox?)
  • Как отобразить текущее значение предпочтения Android в сводке предпочтений?
  • Размер шрифта Bind в JavaFX?
  • Blackberry - Загрузка / Ожидание экрана с анимацией
  • Как я могу получить высоту и ширину панели навигации Android программно?
  • Почему этот код Parallel.ForEach заморозит программу?
  • Сетка изображений внутри ScrollView
  • Отключить ключ ускорителя ярлыков WPF (текст подчеркивания отсутствует)
  • Java swing JComponent "размер"
  • Как установить размер изображения с помощью RescaleOp
  • Interesting Posts

    Получение ошибки при использовании ng-controllerа в angularjs ver 1.3.0

    Как отправить Ctrl + Alt + End на удаленный рабочий стол?

    При запуске `rm -rf` можно ли исключить определенные подкаталоги?

    Невозможно просмотреть фильмы Quicktime через HTTPS в Safari или UIWebView

    Как работают операторы смены в Java?

    Можете ли вы написать объектно-ориентированный код в C?

    Как найти k-й наибольший элемент в несортированном массиве длины n в O (n)?

    Как использовать .htaccess в WAMP Server?

    Что происходит, когда запускается компьютерная программа?

    Heroku НЕ компилирует файлы под конвейерами ресурсов в Rails 4

    Как сделать виджет Qt невидимым без изменения позиции других виджетов Qt?

    Как передать аргументы командной строки программе Perl?

    Asp.net 4.0 не зарегистрирован

    Определите, добавляет ли пользователь или удаляет строки

    Создайте символическую ссылку на объединенное содержимое из трех папок

    Давайте будем гением компьютера.