Support backspace key in case of no focus 77/118077/1
authorJihoon Kim <jihoon48.kim@samsung.com>
Wed, 8 Mar 2017 12:50:03 +0000 (21:50 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Wed, 8 Mar 2017 12:50:06 +0000 (21:50 +0900)
In multibutton entry widget in EFL, this feature is necessary.

Change-Id: I3320aec5847ffa92dff22b8573a82a8de4cb2680
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/e_mod_main.c

index 6f4cd8ae3e12b90c4de459491da647fb16599b61..c34401baa80e56c14ca341618647c4f319bf62fb 100644 (file)
@@ -241,7 +241,7 @@ _input_panel_hide(struct wl_client *client, struct wl_resource *resource, Eina_B
       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);
 
@@ -624,6 +624,26 @@ _e_text_input_method_context_cb_modifiers_map(struct wl_client *client EINA_UNUS
      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)
 {
@@ -638,8 +658,46 @@ _e_text_input_method_context_cb_keysym(struct wl_client *client EINA_UNUSED, str
      }
 
    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