hermet pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=502a8265992b18687b81a6ff8505e6b5d91836de

commit 502a8265992b18687b81a6ff8505e6b5d91836de
Author: ChunEon Park <her...@hermet.pe.kr>
Date:   Thu Aug 27 03:49:33 2015 +0900

    fix malfunction of key input on Windows system.
    
    re-implement main key input by using key grab mechanism.
    
    @fix
---
 src/bin/main.c      | 163 ++++++++++++++++++++++++++++++++++------------------
 src/lib/auto_comp.c |  11 ++--
 2 files changed, 111 insertions(+), 63 deletions(-)

diff --git a/src/bin/main.c b/src/bin/main.c
index 6ffb73f..74ba7bb 100644
--- a/src/bin/main.c
+++ b/src/bin/main.c
@@ -9,6 +9,7 @@
 typedef struct app_s
 {
    Evas_Object *enventor;
+   Evas_Object *keygrabber;
    Eina_Bool on_saving : 1;
    Eina_Bool lazy_save : 1;
 } app_data;
@@ -575,10 +576,11 @@ default_template_insert(app_data *ad)
 }
 
 static Eina_Bool
-alt_func(Ecore_Event_Key *event)
+alt_func(app_data *ad, Evas_Event_Key_Down *event)
 {
-   if (!EVENT_KEY_MODIFIER_CHECK(ALT, event->modifiers))
-       return EINA_FALSE;
+   if (evas_key_modifier_is_set(event->modifiers, "Shift") ||
+       evas_key_modifier_is_set(event->modifiers, "Ctrl"))
+     return EINA_FALSE;
 
    //Full Edit View
    if (!strcmp(event->key, "Left"))
@@ -609,10 +611,12 @@ alt_func(Ecore_Event_Key *event)
 }
 
 static Eina_Bool
-ctrl_func(app_data *ad, Ecore_Event_Key *event)
+ctrl_func(app_data *ad, Evas_Event_Key_Down *event)
 {
-   if (!EVENT_KEY_MODIFIER_CHECK(CTRL, event->modifiers))
-         return EINA_FALSE;
+   if (evas_key_modifier_is_set(event->modifiers, "Shift") ||
+       evas_key_modifier_is_set(event->modifiers, "Alt"))
+     return EINA_FALSE;
+
    //Save
    if (!strcmp(event->key, "s") || !strcmp(event->key, "S"))
      {
@@ -685,138 +689,125 @@ ctrl_func(app_data *ad, Ecore_Event_Key *event)
    return EINA_FALSE;
 }
 
-static Eina_Bool
-main_key_down_cb(void *data, int type EINA_UNUSED, void *ev)
+static void
+keygrabber_key_down_cb(void *data, Evas *e EINA_UNUSED,
+                       Evas_Object *obj EINA_UNUSED, void *event_info)
 {
-   Ecore_Event_Key *event = ev;
    app_data *ad = data;
+   Evas_Event_Key_Down *ev = event_info;
 
    //Main Menu
-   if (!strcmp(event->key, "Escape"))
+   if (!strcmp(ev->key, "Escape"))
      {
         if (goto_is_opened())
           {
              goto_close();
              enventor_object_focus_set(ad->enventor, EINA_TRUE);
-             return ECORE_CALLBACK_DONE;
+             return;
           }
         if (search_is_opened())
           {
              search_close();
              enventor_object_focus_set(ad->enventor, EINA_TRUE);
-             return ECORE_CALLBACK_DONE;
+             return;
           }
         if (live_edit_get())
           {
              live_edit_cancel();
              enventor_object_focus_set(ad->enventor, EINA_TRUE);
-             return ECORE_CALLBACK_DONE;
+             return;
           }
         if (file_mgr_warning_is_opened())
           {
              file_mgr_warning_close();
-             return ECORE_CALLBACK_DONE;
+             return;
           }
         if (enventor_object_ctxpopup_visible_get(ad->enventor))
           {
              enventor_object_ctxpopup_dismiss(ad->enventor);
-             return ECORE_CALLBACK_DONE;
+             return;
           }
 
         menu_toggle();
-        return ECORE_CALLBACK_DONE;
+        return;
      }
 
-   if (menu_activated_get() > 0) return ECORE_CALLBACK_PASS_ON;
-   if (file_mgr_warning_is_opened()) return ECORE_CALLBACK_PASS_ON;
+   if (menu_activated_get() > 0) return;
+   if (file_mgr_warning_is_opened()) return;
 
-   if (ctrl_func(ad, event)) return ECORE_CALLBACK_DONE;
-   if (alt_func(event)) return ECORE_CALLBACK_DONE;
+   enventor_object_ctxpopup_dismiss(ad->enventor);
 
-   //Control Key
-   if (!strcmp("Control_L", event->key))
-     {
-        enventor_object_ctxpopup_dismiss(ad->enventor);
-        return ECORE_CALLBACK_PASS_ON;
-     }
-
-   //Alt Key
-   if (!strcmp("Alt_L", event->key))
-     {
-        enventor_object_ctxpopup_dismiss(ad->enventor);
-        return ECORE_CALLBACK_PASS_ON;
-     }
+   if (ctrl_func(ad, ev)) return;
+   if (alt_func(ad, ev)) return;
 
    //README
-   if (!strcmp(event->key, "F1"))
+   if (!strcmp(ev->key, "F1"))
      {
         enventor_object_ctxpopup_dismiss(ad->enventor);
         live_edit_cancel();
         menu_about();
-        return ECORE_CALLBACK_DONE;
+        return;
      }
    //New
-   if (!strcmp(event->key, "F2"))
+   if (!strcmp(ev->key, "F2"))
      {
         enventor_object_ctxpopup_dismiss(ad->enventor);
         live_edit_cancel();
         menu_edc_new(EINA_FALSE);
-        return ECORE_CALLBACK_DONE;
+        return;
      }
    //Save
-   if (!strcmp(event->key, "F3"))
+   if (!strcmp(ev->key, "F3"))
      {
         enventor_object_ctxpopup_dismiss(ad->enventor);
         live_edit_cancel();
         menu_edc_save();
-        return ECORE_CALLBACK_DONE;
+        return;
      }
    //Load
-   if (!strcmp(event->key, "F4"))
+   if (!strcmp(ev->key, "F4"))
      {
         enventor_object_ctxpopup_dismiss(ad->enventor);
         live_edit_cancel();
         menu_edc_load();
-        return ECORE_CALLBACK_DONE;
+        return;
      }
    //Line Number
-   if (!strcmp(event->key, "F5"))
+   if (!strcmp(ev->key, "F5"))
      {
         enventor_object_ctxpopup_dismiss(ad->enventor);
         tools_lines_update(ad->enventor, EINA_TRUE);
-        return ECORE_CALLBACK_DONE;
+        return;
      }
    //Tools
-   if (!strcmp(event->key, "F9"))
+   if (!strcmp(ev->key, "F9"))
      {
         enventor_object_ctxpopup_dismiss(ad->enventor);
         base_tools_toggle(EINA_TRUE);
-        return ECORE_CALLBACK_DONE;
+        return;
      }
    //Console
-   if (!strcmp(event->key, "F10"))
+   if (!strcmp(ev->key, "F10"))
      {
         enventor_object_ctxpopup_dismiss(ad->enventor);
         base_console_toggle();
-        return ECORE_CALLBACK_DONE;
+        return;
      }
    //Statusbar
-   if (!strcmp(event->key, "F11"))
+   if (!strcmp(ev->key, "F11"))
      {
         enventor_object_ctxpopup_dismiss(ad->enventor);
         tools_status_update(NULL, EINA_TRUE);
-        return ECORE_CALLBACK_DONE;
+        return;
      }
    //Setting
-   if (!strcmp(event->key, "F12"))
+   if (!strcmp(ev->key, "F12"))
      {
         live_edit_cancel();
         enventor_object_ctxpopup_dismiss(ad->enventor);
         menu_setting();
-        return ECORE_CALLBACK_DONE;
+        return;
      }
-
-   return ECORE_CALLBACK_PASS_ON;
 }
 
 static void
@@ -834,12 +825,68 @@ live_edit_set(Evas_Object *enventor, Evas_Object *tools)
    live_edit_init(enventor, trigger);
 }
 
+static void
+keygrabber_init(app_data *ad)
+{
+   Evas *e = evas_object_evas_get(ad->enventor);
+   ad->keygrabber = evas_object_rectangle_add(e);
+   evas_object_event_callback_add(ad->keygrabber, EVAS_CALLBACK_KEY_DOWN,
+                                  keygrabber_key_down_cb, ad);
+#define GRAB_ADD(key, modifier) \
+   if (!evas_object_key_grab(ad->keygrabber, (key), (modifier), 0, EINA_TRUE)) 
\
+     EINA_LOG_ERR("Failed to grab key - %s", (key))
+
+   GRAB_ADD("Escape", 0);
+   GRAB_ADD("F1", 0);
+   GRAB_ADD("F2", 0);
+   GRAB_ADD("F3", 0);
+   GRAB_ADD("F4", 0);
+   GRAB_ADD("F5", 0);
+   GRAB_ADD("F6", 0);
+   GRAB_ADD("F7", 0);
+   GRAB_ADD("F8", 0);
+   GRAB_ADD("F9", 0);
+   GRAB_ADD("F10", 0);
+   GRAB_ADD("F11", 0);
+   GRAB_ADD("F12", 0);
+
+   Evas_Modifier_Mask modifier;
+
+   //Ctrl Modifier Mask
+   modifier = evas_key_modifier_mask_get(e, "Control");
+   GRAB_ADD("s", modifier);
+   GRAB_ADD("S", modifier);
+   GRAB_ADD("d", modifier);
+   GRAB_ADD("D", modifier);
+   GRAB_ADD("f", modifier);
+   GRAB_ADD("F", modifier);
+   GRAB_ADD("l", modifier);
+   GRAB_ADD("L", modifier);
+   GRAB_ADD("h", modifier);
+   GRAB_ADD("H", modifier);
+   GRAB_ADD("w", modifier);
+   GRAB_ADD("W", modifier);
+   GRAB_ADD("t", modifier);
+   GRAB_ADD("T", modifier);
+   GRAB_ADD("i", modifier);
+   GRAB_ADD("I", modifier);
+   GRAB_ADD("o", modifier);
+   GRAB_ADD("O", modifier);
+   GRAB_ADD("e", modifier);
+   GRAB_ADD("E", modifier);
+   GRAB_ADD("space", modifier);
+
+   //Alt
+   modifier = evas_key_modifier_mask_get(e, "Alt");
+   GRAB_ADD("Left", modifier);
+   GRAB_ADD("Right", modifier);
+   GRAB_ADD("Up", modifier);
+   GRAB_ADD("Down", modifier);
+}
+
 static Eina_Bool
 init(app_data *ad, int argc, char **argv)
 {
-   ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, main_key_down_cb, ad);
-   ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, main_mouse_wheel_cb, ad);
-
    elm_setup();
 
    enventor_init(argc, argv);
@@ -868,6 +915,10 @@ init(app_data *ad, int argc, char **argv)
    syntax_color_init(ad->enventor);
    syntax_color_update(ad->enventor);
 
+   keygrabber_init(ad);
+
+   ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, main_mouse_wheel_cb, ad);
+
    return EINA_TRUE;
 }
 
diff --git a/src/lib/auto_comp.c b/src/lib/auto_comp.c
index db8ed4a..6317bd5 100644
--- a/src/lib/auto_comp.c
+++ b/src/lib/auto_comp.c
@@ -375,8 +375,6 @@ anchor_keygrab_set(autocomp_data *ad, Eina_Bool grab)
         if (ad->on_keygrab) return;
         if (!evas_object_key_grab(anchor, "BackSpace", 0, 0, EINA_TRUE))
           EINA_LOG_ERR("Failed to grab key - BackSpace");
-        if (!evas_object_key_grab(anchor, "Escape", 0, 0, EINA_TRUE))
-          EINA_LOG_ERR("Failed to grab key - Escape");
         if (!evas_object_key_grab(anchor, "Return", 0, 0, EINA_TRUE))
           EINA_LOG_ERR("Failed to grab key - Return");
         if (!evas_object_key_grab(anchor, "Tab", 0, 0, EINA_TRUE))
@@ -391,7 +389,6 @@ anchor_keygrab_set(autocomp_data *ad, Eina_Bool grab)
      {
         if (!ad->on_keygrab) return;
         evas_object_key_ungrab(anchor, "BackSpace", 0, 0);
-        evas_object_key_ungrab(anchor, "Escape", 0, 0);
         evas_object_key_ungrab(anchor, "Return", 0, 0);
         evas_object_key_ungrab(anchor, "Tab", 0, 0);
         evas_object_key_ungrab(anchor, "Up", 0, 0);
@@ -768,13 +765,13 @@ anchor_key_down_cb(void *data, Evas *evas EINA_UNUSED,
    Evas_Event_Key_Down *ev = event_info;
 
    //Cancel the auto complete.
-   if (!strcmp(ev->keyname, "BackSpace") || !strcmp(ev->keyname, "Escape"))
+   if (!strcmp(ev->key, "BackSpace"))
      {
         queue_reset(ad);
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
         return;
      }
-   if (!strcmp(ev->keyname, "Return") || !strcmp(ev->keyname, "Tab"))
+   if (!strcmp(ev->key, "Return") || !strcmp(ev->key, "Tab"))
      {
         insert_completed_text(ad);
         queue_reset(ad);
@@ -782,13 +779,13 @@ anchor_key_down_cb(void *data, Evas *evas EINA_UNUSED,
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
         return;
      }
-   if (!strcmp(ev->keyname, "Up"))
+   if (!strcmp(ev->key, "Up"))
      {
         list_item_move(ad, EINA_TRUE);
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
         return;
      }
-   if (!strcmp(ev->keyname, "Down"))
+   if (!strcmp(ev->key, "Down"))
      {
         list_item_move(ad, EINA_FALSE);
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;

-- 


Reply via email to