/** * Process an X11 event, convert into VLC hotkey event if applicable. * * @param ctx key handler created with CreateKeyHandler() * @param ev XCB event to process * @return 0 if the event was handled and free()'d, non-zero otherwise */ int XCB_keyHandler_Process (key_handler_t *ctx, xcb_generic_event_t *ev) { assert (ctx); switch (ev->response_type & 0x7f) { case XCB_KEY_PRESS: { xcb_key_press_event_t *e = (xcb_key_press_event_t *)ev; xcb_keysym_t sym = xcb_key_press_lookup_keysym (ctx->syms, e, 0); uint_fast32_t vk = ConvertKeySym (sym); msg_Dbg (ctx->obj, "key: 0x%08"PRIxFAST32" (X11: 0x%04"PRIx32")", vk, sym); if (vk == KEY_UNSET) break; if (e->state & XCB_MOD_MASK_SHIFT) /* Shift */ vk |= KEY_MODIFIER_SHIFT; /* XCB_MOD_MASK_LOCK */ /* Caps Lock */ if (e->state & XCB_MOD_MASK_CONTROL) /* Control */ vk |= KEY_MODIFIER_CTRL; if (e->state & XCB_MOD_MASK_1) /* Alternate */ vk |= KEY_MODIFIER_ALT; /* XCB_MOD_MASK_2 */ /* Numeric Pad Lock */ if (e->state & XCB_MOD_MASK_3) /* Super */ vk |= KEY_MODIFIER_META; if (e->state & XCB_MOD_MASK_4) /* Meta */ vk |= KEY_MODIFIER_META; if (e->state & XCB_MOD_MASK_5) /* Alternate Graphic */ vk |= KEY_MODIFIER_ALT; var_SetInteger (ctx->obj->obj.libvlc, "key-pressed", vk); break; } case XCB_KEY_RELEASE: break; case XCB_MAPPING_NOTIFY: { xcb_mapping_notify_event_t *e = (xcb_mapping_notify_event_t *)ev; msg_Dbg (ctx->obj, "refreshing keyboard mapping"); xcb_refresh_keyboard_mapping (ctx->syms, e); break; } default: return -1; } free (ev); return 0; }
void mapping_notify(xcb_generic_event_t *evt) { if (!mapping_count) return; xcb_mapping_notify_event_t *e = (xcb_mapping_notify_event_t *) evt; PRINTF("mapping notify %u %u\n", e->request, e->count); if (e->request == XCB_MAPPING_POINTER) return; if (xcb_refresh_keyboard_mapping(symbols, e) == 1) { destroy_chord(escape_chord); get_lock_fields(); reload_cmd(); escape_chord = make_chord(ESCAPE_KEYSYM, XCB_NONE, 0, XCB_KEY_PRESS, false, false); if (mapping_count > 0) mapping_count--; } }
/** * Process an X11 event, convert into VLC hotkey event if applicable. * * @param ctx key handler created with CreateKeyHandler() * @param ev XCB event to process * @return 0 if the event was handled and free()'d, non-zero otherwise */ int ProcessKeyEvent (key_handler_t *ctx, xcb_generic_event_t *ev) { assert (ctx); switch (ev->response_type & 0x7f) { case XCB_KEY_PRESS: { xcb_key_press_event_t *e = (xcb_key_press_event_t *)ev; xcb_keysym_t sym = xcb_key_press_lookup_keysym (ctx->syms, e, 0); uint_fast32_t vk = ConvertKeySym (sym); msg_Dbg (ctx->obj, "key: 0x%08"PRIxFAST32, vk); if (vk == KEY_UNSET) break; if (e->state & XCB_MOD_MASK_SHIFT) vk |= KEY_MODIFIER_SHIFT; if (e->state & XCB_MOD_MASK_CONTROL) vk |= KEY_MODIFIER_CTRL; if (e->state & XCB_MOD_MASK_1) vk |= KEY_MODIFIER_ALT; if (e->state & XCB_MOD_MASK_4) vk |= KEY_MODIFIER_META; var_SetInteger (ctx->obj->p_libvlc, "key-pressed", vk); break; } case XCB_KEY_RELEASE: break; case XCB_MAPPING_NOTIFY: { xcb_mapping_notify_event_t *e = (xcb_mapping_notify_event_t *)ev; msg_Dbg (ctx->obj, "refreshing keyboard mapping"); xcb_refresh_keyboard_mapping (ctx->syms, e); break; } default: return -1; } free (ev); return 0; }
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; } }