Because input_panel_hide event can be called after focus_out(deactivate) by application.
And Input Method(IME) should know the state of their own input_panel to manage their resource when the input_panel is hidden.
*/
- if (input_method &&
+ if (input_method &&
((!input_method->context) || (!input_method->context->resource)))
_context_created = _e_text_input_method_create_context(client, input_method, text_input, EINA_FALSE);
wl_text_input_send_modifiers_map(context->input->resource, map);
}
+static void
+_e_keyevent_free(void *data EINA_UNUSED, void *ev)
+{
+ Ecore_Event_Key *e = ev;
+
+ if (e->keyname)
+ eina_stringshare_del(e->keyname);
+
+ if (e->key)
+ eina_stringshare_del(e->key);
+
+ if (e->compose)
+ eina_stringshare_del(e->compose);
+
+ if (e->string)
+ eina_stringshare_del(e->string);
+
+ E_FREE(e);
+}
+
static void
_e_text_input_method_context_cb_keysym(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, uint32_t serial, uint32_t time, uint32_t sym, uint32_t state, uint32_t modifiers)
{
}
if ((context->input) && (context->input->resource))
- wl_text_input_send_keysym(context->input->resource,
- serial, time, sym, state, modifiers);
+ {
+ wl_text_input_send_keysym(context->input->resource,
+ serial, time, sym, state, modifiers);
+ }
+ else
+ {
+ char string[32], key[32], keyname[32];
+ Ecore_Event_Key *e = NULL;
+
+ memset(key, 0, sizeof(key));
+ xkb_keysym_get_name(sym, key, sizeof(key));
+
+ memset(keyname, 0, sizeof(keyname));
+ xkb_keysym_get_name(sym, keyname, sizeof(keyname));
+ if (keyname[0] == '\0')
+ snprintf(keyname, sizeof(keyname), "Keysym-%u", sym);
+
+ if (strcmp(keyname, "BackSpace") == 0)
+ {
+ memset(string, 0, sizeof(string));
+ xkb_keysym_to_utf8(sym, string, 32);
+
+ e = E_NEW(Ecore_Event_Key, 1);
+ if (!e) return;
+
+ e->keyname = (char *)eina_stringshare_add(keyname);
+ e->key = (char *)eina_stringshare_add(key);
+ e->string = (char *)eina_stringshare_add(string);
+ e->compose = (char *)eina_stringshare_add(e->string);
+
+ e->timestamp = 0; /* For distinguishing S/W keyboard event */
+ e->same_screen = 1;
+ e->keycode = 22; /* Backspace keycode */
+
+ if (state)
+ ecore_event_add(ECORE_EVENT_KEY_DOWN, e, _e_keyevent_free, NULL);
+ else
+ ecore_event_add(ECORE_EVENT_KEY_UP, e, _e_keyevent_free, NULL);
+ }
+ }
}
#if ENABLE_GRAB_KEYBOARD