/** * 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; }
/** * 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; }