E_Text_Input *input;
E_Input_Method *input_method;
-
-#if ENABLE_GRAB_KEYBOARD
- struct
- {
- struct wl_resource *resource;
- Eina_List *handlers;
- Eina_Bool grabbed;
- struct xkb_keymap *keymap;
- struct xkb_state *state;
- xkb_mod_mask_t mod_depressed, mod_latched, mod_locked;
- xkb_layout_index_t mod_group;
- int mod_changed;
- } kbd;
-#endif
};
struct _E_Mod_Text_Input_Shutdown_Cb
}
}
-
-#if ENABLE_GRAB_KEYBOARD
-static void
-_e_text_input_method_context_keyboard_grab_keyboard_state_update(E_Input_Method_Context *context, uint32_t keycode, Eina_Bool pressed)
-{
- enum xkb_key_direction dir;
-
- if (!context->kbd.state) return;
-
- if (pressed) dir = XKB_KEY_DOWN;
- else dir = XKB_KEY_UP;
-
- context->kbd.mod_changed =
- xkb_state_update_key(context->kbd.state, keycode + 8, dir);
-}
-
-static void
-_e_text_input_method_context_keyboard_grab_keyboard_modifiers_update(E_Input_Method_Context *context, struct wl_resource *keyboard)
-{
- uint32_t serial;
-
- if (!context->input) return;
- if (!context->kbd.state) return;
-
- context->kbd.mod_depressed =
- xkb_state_serialize_mods(context->kbd.state, XKB_STATE_DEPRESSED);
- context->kbd.mod_latched =
- xkb_state_serialize_mods(context->kbd.state, XKB_STATE_MODS_LATCHED);
- context->kbd.mod_locked =
- xkb_state_serialize_mods(context->kbd.state, XKB_STATE_MODS_LOCKED);
- context->kbd.mod_group =
- xkb_state_serialize_layout(context->kbd.state, XKB_STATE_LAYOUT_EFFECTIVE);
-
- serial = wl_display_next_serial(e_comp_wl_display_get());
- wl_keyboard_send_modifiers(keyboard, serial,
- context->kbd.mod_depressed,
- context->kbd.mod_latched,
- context->kbd.mod_locked,
- context->kbd.mod_group);
-}
-
-static void
-_e_text_input_method_context_key_send(E_Input_Method_Context *context, unsigned int keycode, unsigned int timestamp, enum wl_keyboard_key_state state)
-{
- uint32_t serial, nk;
-
- if (!context->input) return;
- nk = keycode - 8;
-
- /* update modifier state */
- _e_text_input_method_context_keyboard_grab_keyboard_state_update(context, nk, state == WL_KEYBOARD_KEY_STATE_PRESSED);
-
- serial = wl_display_next_serial(e_comp_wl_display_get());
-
- wl_keyboard_send_key(context->kbd.resource, serial, timestamp, nk, state);
- if (context->kbd.mod_changed)
- {
- _e_text_input_method_context_keyboard_grab_keyboard_modifiers_update(context, context->kbd.resource);
- context->kbd.mod_changed = 0;
- }
-}
-
-static Eina_Bool
-_e_text_input_method_context_ecore_cb_key_down(void *data, int ev_type EINA_UNUSED, Ecore_Event_Key *ev)
-{
- E_Input_Method_Context *context = data;
-
- _e_text_input_method_context_key_send(context, ev->keycode, ev->timestamp,
- WL_KEYBOARD_KEY_STATE_PRESSED);
-
- return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_e_text_input_method_context_ecore_cb_key_up(void *data, int ev_type EINA_UNUSED, Ecore_Event_Key *ev)
-{
- E_Input_Method_Context *context = data;
-
- _e_text_input_method_context_key_send(context, ev->keycode, ev->timestamp,
- WL_KEYBOARD_KEY_STATE_RELEASED);
-
- return ECORE_CALLBACK_RENEW;
-}
-
-static void
-_e_text_input_method_context_grab_set(E_Input_Method_Context *context, Eina_Bool set)
-{
- if (set == context->kbd.grabbed)
- return;
-
- if (!context->input)
- return;
-
- context->kbd.grabbed = set;
-
- if (set)
- {
- g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
- g_mutex_lock(&e_comp_wl->xkb.state_mutex);
- if (context->kbd.keymap) xkb_map_unref(context->kbd.keymap);
- if (context->kbd.state) xkb_state_unref(context->kbd.state);
-
- context->kbd.keymap = xkb_map_ref(e_comp_wl->xkb.keymap);
- context->kbd.state = xkb_state_new(e_comp_wl->xkb.keymap);
- g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
- g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
-
- if (!e_input_thread_mode_get())
- {
- E_LIST_HANDLER_APPEND(context->kbd.handlers, ECORE_EVENT_KEY_DOWN,
- _e_text_input_method_context_ecore_cb_key_down,
- context);
- E_LIST_HANDLER_APPEND(context->kbd.handlers, ECORE_EVENT_KEY_UP,
- _e_text_input_method_context_ecore_cb_key_up,
- context);
- }
- else
- {
- E_Input_Event_Source *input_event_source = e_input_event_source_get();
- if (input_event_source)
- {
- _key_down_handler = e_input_event_handler_add(input_event_source, ECORE_EVENT_KEY_DOWN, _e_text_input_method_context_ecore_cb_key_down, context);
- _key_up_handler = e_input_event_handler_add(input_event_source, ECORE_EVENT_KEY_UP, _e_text_input_method_context_ecore_cb_key_up, context);
- }
- }
-
- e_comp_grab_input(0, 1);
- }
- else
- {
- E_FREE_LIST(context->kbd.handlers, ecore_event_handler_del);
-
- if (e_input_thread_mode_get())
- {
- E_Input_Event_Source *input_event_source = e_input_event_source_get();
- if (input_event_source)
- {
- if (_key_down_handler)
- e_input_event_handler_del(input_event_source, _key_down_handler);
-
- if (_key_up_handler)
- e_input_event_handler_del(input_event_source, _key_up_handler);
-
- _key_down_handler = NULL;
- _key_up_handler = NULL;
- }
- }
-
- e_comp_ungrab_input(0, 1);
-
- if (context->kbd.keymap)
- {
- xkb_map_unref(context->kbd.keymap);
- context->kbd.keymap = NULL;
- }
-
- if (context->kbd.state)
- {
- xkb_state_unref(context->kbd.state);
- context->kbd.state = NULL;
- }
- }
-}
-#endif
-
static void
_e_mod_text_input_shutdown_cb_add(void (*func)(void *data), void *data)
{
}
}
-#if ENABLE_GRAB_KEYBOARD
-static void
-_e_text_input_method_context_keyboard_grab_cb_resource_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
-{
- wl_resource_destroy(resource);
-}
-
-static const struct wl_keyboard_interface _e_keyboard_grab_interface =
-{
- _e_text_input_method_context_keyboard_grab_cb_resource_destroy
-};
-
-static void
-_e_text_input_method_context_keyboard_grab_cb_keyboard_unbind(struct wl_resource *resource)
-{
- E_Input_Method_Context *context = wl_resource_get_user_data(resource);
- EINA_SAFETY_ON_NULL_RETURN(context);
-
- _e_text_input_method_context_grab_set(context, EINA_FALSE);
-
- context->kbd.resource = NULL;
-}
-#endif
-
static void
_e_text_input_method_context_cb_keyboard_grab(struct wl_client *client, struct wl_resource *resource, uint32_t id)
{
DBG("Input Method Context - grab keyboard %d", wl_resource_get_id(resource));
-#if ENABLE_GRAB_KEYBOARD
- E_Input_Method_Context *context = wl_resource_get_user_data(resource);
- struct wl_resource *keyboard = NULL;
-
- EINA_SAFETY_ON_NULL_RETURN(context);
-
- keyboard = wl_resource_create(client, &wl_keyboard_interface, 1, id);
- if (!keyboard)
- {
- wl_client_post_no_memory(client);
- return;
- }
-
- wl_resource_set_implementation(keyboard, &_e_keyboard_grab_interface, context, _e_text_input_method_context_keyboard_grab_cb_keyboard_unbind);
-
- /* send current keymap */
- wl_keyboard_send_keymap(keyboard, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
- e_comp_wl->xkb.fd, e_comp_wl->xkb.size);
-
- context->kbd.resource = keyboard;
-
- _e_text_input_method_context_grab_set(context, EINA_TRUE);
-#endif
}
static void
E_Input_Method_Context *context = wl_resource_get_user_data(resource);
EINA_SAFETY_ON_NULL_RETURN(context);
-#if ENABLE_GRAB_KEYBOARD
- if (context->kbd.resource)
- {
- wl_resource_destroy(context->kbd.resource);
- context->kbd.resource = NULL;
- }
-#endif
-
LOGI("resource(%p), context(%p)", resource, context);
if ((context->input_method) &&
{
if ((input_method->context) && (input_method->resource))
{
-#if ENABLE_GRAB_KEYBOARD
- _e_text_input_method_context_grab_set(input_method->context,
- EINA_FALSE);
-#endif
if (input_method->resource == destroyed_resource)
{
LOGI("deactivate skipped : %p %p", input_method->resource,