int Kernel::run() { XEvent event; LOGDEBUG("main event loop launched"); ostringstream oss; while (runlevel_ == Kernel::RUN) { XCORE->nextEvent(&event); switch (event.type) { case ButtonPress: LOGDEBUG("button press event"); handleButtonPress(&event.xbutton); break; case ButtonRelease: LOGDEBUG("button release event"); handleButtonRelease(&event.xbutton); break; case ClientMessage: LOGDEBUG("client message event"); handleClientMessage(&event.xclient); break; case ConfigureRequest: LOGDEBUG("configure request event"); handleConfigureRequest(&event.xconfigurerequest); break; case DestroyNotify: LOGDEBUG("destroy window event"); handleDestroyNotify(&event.xdestroywindow); break; case Expose: LOGDEBUG("expose event"); handleExpose(&event.xexpose); break; case KeyPress: LOGDEBUG("keypress event"); handleKeyPress(&event.xkey); break; case MapRequest: LOGDEBUG("map request event"); handleMapRequest(&event.xmaprequest); break; case MotionNotify: LOGDEBUG("motion event"); handleMotionNotify(&event.xmotion); break; case PropertyNotify: LOGDEBUG("property event"); handlePropertyNotify(&event.xproperty); break; case UnmapNotify: LOGDEBUG("unmap event"); handleUnmapNotify(&event.xunmap); break; } } return 0; }
void XWaylandManager::wmEvents() { // Uncomment if you want to be flooded by messages //qCDebug(XWAYLAND_TRACE) << "WM event"; xcb_generic_event_t *event; while ((event = xcb_poll_for_event(Xcb::connection()))) { //handle selection event //handle dnd event int type = event->response_type & ~0x80; switch (type) { case XCB_BUTTON_PRESS: case XCB_BUTTON_RELEASE: handleButton((xcb_button_press_event_t *)event); break; case XCB_ENTER_NOTIFY: handleEnter((xcb_enter_notify_event_t *)event); break; case XCB_LEAVE_NOTIFY: handleLeave((xcb_leave_notify_event_t *)event); break; case XCB_MOTION_NOTIFY: handleMotion((xcb_motion_notify_event_t *)event); break; case XCB_CREATE_NOTIFY: handleCreateNotify((xcb_create_notify_event_t *)event); break; case XCB_MAP_REQUEST: handleMapRequest((xcb_map_request_event_t *)event); break; case XCB_MAP_NOTIFY: handleMapNotify((xcb_map_notify_event_t *)event); break; case XCB_UNMAP_NOTIFY: handleUnmapNotify((xcb_unmap_notify_event_t *)event); break; case XCB_REPARENT_NOTIFY: handleReparentNotify((xcb_reparent_notify_event_t *)event); break; case XCB_CONFIGURE_REQUEST: handleConfigureRequest((xcb_configure_request_event_t *)event); break; case XCB_CONFIGURE_NOTIFY: handleConfigureNotify((xcb_configure_notify_event_t *)event); break; case XCB_DESTROY_NOTIFY: handleDestroyNotify((xcb_destroy_notify_event_t *)event); break; case XCB_MAPPING_NOTIFY: break; case XCB_PROPERTY_NOTIFY: handlePropertyNotify((xcb_property_notify_event_t *)event); break; case XCB_CLIENT_MESSAGE: handleClientMessage((xcb_client_message_event_t *)event); break; default: break; } free(event); } xcb_flush(Xcb::connection()); }
void X11WindowedBackend::handleEvent(xcb_generic_event_t *e) { const uint8_t eventType = e->response_type & ~0x80; switch (eventType) { case XCB_BUTTON_PRESS: case XCB_BUTTON_RELEASE: handleButtonPress(reinterpret_cast<xcb_button_press_event_t*>(e)); break; case XCB_MOTION_NOTIFY: { auto event = reinterpret_cast<xcb_motion_notify_event_t*>(e); auto it = std::find_if(m_windows.constBegin(), m_windows.constEnd(), [event] (const Output &o) { return o.window == event->event; }); if (it == m_windows.constEnd()) { break; } pointerMotion(QPointF(event->root_x - (*it).xPosition.x() + (*it).internalPosition.x(), event->root_y - (*it).xPosition.y() + (*it).internalPosition.y()), event->time); } break; case XCB_KEY_PRESS: case XCB_KEY_RELEASE: { auto event = reinterpret_cast<xcb_key_press_event_t*>(e); if (eventType == XCB_KEY_PRESS) { if (!m_keySymbols) { m_keySymbols = xcb_key_symbols_alloc(m_connection); } const xcb_keysym_t kc = xcb_key_symbols_get_keysym(m_keySymbols, event->detail, 0); if (kc == XK_Control_R) { grabKeyboard(event->time); } keyboardKeyPressed(event->detail - 8, event->time); } else { keyboardKeyReleased(event->detail - 8, event->time); } } break; case XCB_CONFIGURE_NOTIFY: updateSize(reinterpret_cast<xcb_configure_notify_event_t*>(e)); break; case XCB_ENTER_NOTIFY: { auto event = reinterpret_cast<xcb_enter_notify_event_t*>(e); auto it = std::find_if(m_windows.constBegin(), m_windows.constEnd(), [event] (const Output &o) { return o.window == event->event; }); if (it == m_windows.constEnd()) { break; } pointerMotion(QPointF(event->root_x - (*it).xPosition.x() + (*it).internalPosition.x(), event->root_y - (*it).xPosition.y() + (*it).internalPosition.y()), event->time); } break; case XCB_CLIENT_MESSAGE: handleClientMessage(reinterpret_cast<xcb_client_message_event_t*>(e)); break; case XCB_EXPOSE: handleExpose(reinterpret_cast<xcb_expose_event_t*>(e)); break; case XCB_MAPPING_NOTIFY: if (m_keySymbols) { xcb_refresh_keyboard_mapping(m_keySymbols, reinterpret_cast<xcb_mapping_notify_event_t*>(e)); } break; default: break; } }