/** Handle keypress event. * \param L Lua stack to push the key pressed. * \param e Received XKeyEvent. * \return True if a key was successfully get, false otherwise. */ bool keygrabber_handlekpress(lua_State *L, xcb_key_press_event_t *e) { /* transfer event (keycode + modifiers) to keysym */ xcb_keysym_t ksym = keyresolv_get_keysym(e->detail, e->state); /* convert keysym to string */ char buf[MAX(MB_LEN_MAX, 32)]; if(!keyresolv_keysym_to_string(ksym, buf, countof(buf))) return false; luaA_pushmodifiers(L, e->state); lua_pushstring(L, buf); switch(e->response_type) { case XCB_KEY_PRESS: lua_pushliteral(L, "press"); break; case XCB_KEY_RELEASE: lua_pushliteral(L, "release"); break; } return true; }
/** Handle keypress event. * \param L Lua stack to push the key pressed. * \param e Received XKeyEvent. * \return True if a key was successfully retrieved, false otherwise. */ bool keygrabber_handlekpress(lua_State *L, xcb_key_press_event_t *e) { /* convert keysym to string */ char buf[MAX(MB_LEN_MAX, 32)]; /* snprintf-like return value could be used here, but that should not be * necessary, as we have buffer big enough */ xkb_state_key_get_utf8(globalconf.xkb_state, e->detail, buf, countof(buf) ); if (is_control(buf)) { /* Use text names for control characters, ignoring all modifiers. */ xcb_keysym_t keysym = xcb_key_symbols_get_keysym(globalconf.keysyms, e->detail, 0); xkb_keysym_get_name(keysym, buf, countof(buf)); } luaA_pushmodifiers(L, e->state); lua_pushstring(L, buf); switch(e->response_type) { case XCB_KEY_PRESS: lua_pushliteral(L, "press"); break; case XCB_KEY_RELEASE: lua_pushliteral(L, "release"); break; } return true; }
/** Emit a button signal. * The top of the lua stack has to be the object on which to emit the event. * \param L The Lua VM state. * \param ev The event to handle. */ static void event_emit_button(lua_State *L, xcb_button_press_event_t *ev) { const char *name; switch(XCB_EVENT_RESPONSE_TYPE(ev)) { case XCB_BUTTON_PRESS: name = "button::press"; break; case XCB_BUTTON_RELEASE: name = "button::release"; break; default: fatal("Invalid event type"); } /* Push the event's info */ lua_pushinteger(L, ev->event_x); lua_pushinteger(L, ev->event_y); lua_pushinteger(L, ev->detail); luaA_pushmodifiers(L, ev->state); /* And emit the signal */ luaA_object_emit_signal(L, -5, name, 4); }