hermet pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=02fb416a852924d617443e5f52e749a2f46ec0b4

commit 02fb416a852924d617443e5f52e749a2f46ec0b4
Author: Jaehyun Cho <[email protected]>
Date:   Mon Nov 3 12:19:33 2014 +0900

    ctxpopup: Fix T1753 (ctxpopup is not closed when esc is pressed)
    
    Summary:
    Fix to dismiss ctxpopup when esc is pressed or menu is opened
    @fix
    
    Reviewers: Hermet
    
    Differential Revision: https://phab.enlightenment.org/D1631
---
 src/bin/main.c             | 33 ++++++++++++++++++++++++++++++++
 src/bin/menu.c             | 32 -------------------------------
 src/include/menu.h         |  2 --
 src/lib/edc_editor.c       | 47 ++++++++++++++++++++++++++++++++--------------
 src/lib/enventor_object.eo | 15 +++++++++++++++
 src/lib/enventor_private.h |  2 ++
 src/lib/enventor_smart.c   | 14 ++++++++++++++
 7 files changed, 97 insertions(+), 48 deletions(-)

diff --git a/src/bin/main.c b/src/bin/main.c
index 5072944..580311e 100644
--- a/src/bin/main.c
+++ b/src/bin/main.c
@@ -15,6 +15,7 @@ typedef struct app_s
    Eina_Bool ctrl_pressed : 1;
    Eina_Bool shift_pressed : 1;
    Eina_Bool template_new : 1;
+   Eina_Bool menu_opened : 1;
 } app_data;
 
 int main(int argc, char **argv);
@@ -414,6 +415,15 @@ enventor_ctxpopup_selected_cb(void *data EINA_UNUSED, 
Evas_Object *obj,
 }
 
 static void
+enventor_ctxpopup_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                               void *event_info EINA_UNUSED)
+{
+   app_data *ad = data;
+   if (ad->menu_opened)
+     enventor_object_focus_set(obj, EINA_FALSE);
+}
+
+static void
 enventor_focused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
                     void *event_info EINA_UNUSED)
 {
@@ -438,6 +448,8 @@ enventor_setup(app_data *ad)
                                   enventor_program_run_cb, ad);
    evas_object_smart_callback_add(enventor, "ctxpopup,selected",
                                   enventor_ctxpopup_selected_cb, ad);
+   evas_object_smart_callback_add(enventor, "ctxpopup,dismissed",
+                                  enventor_ctxpopup_dismissed_cb, ad);
    evas_object_smart_callback_add(enventor, "focused",
                                   enventor_focused_cb, ad);
 
@@ -664,7 +676,13 @@ main_key_down_cb(void *data, int type EINA_UNUSED, void 
*ev)
              file_mgr_warning_close();
              return ECORE_CALLBACK_DONE;
           }
+        if (enventor_object_ctxpopup_visible_get(ad->enventor))
+          {
+             enventor_object_ctxpopup_dismiss(ad->enventor);
+             return ECORE_CALLBACK_DONE;
+          }
 
+        ad->menu_opened = EINA_FALSE;
         menu_toggle();
         return ECORE_CALLBACK_DONE;
      }
@@ -695,6 +713,9 @@ main_key_down_cb(void *data, int type EINA_UNUSED, void *ev)
    //README
    if (!strcmp(event->key, "F1"))
      {
+        if (enventor_object_ctxpopup_visible_get(ad->enventor))
+          enventor_object_ctxpopup_dismiss(ad->enventor);
+        ad->menu_opened = EINA_TRUE;
         menu_about();
         return ECORE_CALLBACK_DONE;
      }
@@ -702,18 +723,27 @@ main_key_down_cb(void *data, int type EINA_UNUSED, void 
*ev)
    //New
    if (!strcmp(event->key, "F2"))
      {
+        if (enventor_object_ctxpopup_visible_get(ad->enventor))
+          enventor_object_ctxpopup_dismiss(ad->enventor);
+        ad->menu_opened = EINA_TRUE;
         menu_edc_new(EINA_FALSE);
         return ECORE_CALLBACK_DONE;
      }
    //Save
    if (!strcmp(event->key, "F3"))
      {
+        if (enventor_object_ctxpopup_visible_get(ad->enventor))
+          enventor_object_ctxpopup_dismiss(ad->enventor);
+        ad->menu_opened = EINA_TRUE;
         menu_edc_save();
         return ECORE_CALLBACK_DONE;
      }
    //Load
    if (!strcmp(event->key, "F4"))
      {
+        if (enventor_object_ctxpopup_visible_get(ad->enventor))
+          enventor_object_ctxpopup_dismiss(ad->enventor);
+        ad->menu_opened = EINA_TRUE;
         menu_edc_load();
         return ECORE_CALLBACK_DONE;
      }
@@ -747,6 +777,9 @@ main_key_down_cb(void *data, int type EINA_UNUSED, void *ev)
    //Setting
    if (!strcmp(event->key, "F12"))
      {
+        if (enventor_object_ctxpopup_visible_get(ad->enventor))
+          enventor_object_ctxpopup_dismiss(ad->enventor);
+        ad->menu_opened = EINA_TRUE;
         menu_setting();
         return ECORE_CALLBACK_DONE;
      }
diff --git a/src/bin/menu.c b/src/bin/menu.c
index 5da4693..846be92 100644
--- a/src/bin/menu.c
+++ b/src/bin/menu.c
@@ -15,7 +15,6 @@ struct menu_s
    Evas_Object *fileselector_layout;
    Evas_Object *about_layout;
 
-   Evas_Object *ctxpopup;
    Evas_Object *enventor;
 
    const char *last_accessed_path;
@@ -663,14 +662,6 @@ menu_open(menu_data *md)
    md->active_request++;
 }
 
-static void
-ctxpopup_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
-                void *event_info EINA_UNUSED)
-{
-   menu_data *md = data;
-   md->ctxpopup = NULL;
-}
-
 void
 menu_init(Evas_Object *enventor)
 {
@@ -763,11 +754,6 @@ menu_toggle(void)
         about_close(md);
         return;
      }
-   if (md->ctxpopup)
-     {
-        elm_ctxpopup_dismiss(md->ctxpopup);
-        return;
-     }
 
    //Main Menu 
    if (md->active_request) menu_close(md);
@@ -777,24 +763,6 @@ menu_toggle(void)
      }
 }
 
-void
-menu_ctxpopup_unregister(Evas_Object *ctxpopup)
-{
-   menu_data *md = g_md;
-   evas_object_event_callback_del(ctxpopup, EVAS_CALLBACK_DEL, 
ctxpopup_del_cb);
-   if (ctxpopup == md->ctxpopup) md->ctxpopup = NULL;
-}
-
-void
-menu_ctxpopup_register(Evas_Object *ctxpopup)
-{
-   menu_data *md = g_md;
-   md->ctxpopup = ctxpopup;
-   if (!ctxpopup) return;
-   evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, ctxpopup_del_cb,
-                                  md);
-}
-
 int
 menu_activated_get(void)
 {
diff --git a/src/include/menu.h b/src/include/menu.h
index 42ced45..3bc99f7 100644
--- a/src/include/menu.h
+++ b/src/include/menu.h
@@ -1,8 +1,6 @@
 void menu_init(Evas_Object *enventor);
 void menu_term(void);
 void menu_toggle(void);
-void menu_ctxpopup_register(Evas_Object *ctxpopup);
-void menu_ctxpopup_unregister(Evas_Object *ctxpopup);
 void menu_edc_new(Eina_Bool template_new);
 void menu_edc_save(void);
 void menu_edc_load(void);
diff --git a/src/lib/edc_editor.c b/src/lib/edc_editor.c
index a5b8330..6b1793c 100644
--- a/src/lib/edc_editor.c
+++ b/src/lib/edc_editor.c
@@ -27,6 +27,7 @@ struct editor_s
    Evas_Object *en_line;
    Evas_Object *scroller;
    Evas_Object *layout;
+   Evas_Object *ctxpopup;
    Evas_Object *enventor;
 
    syntax_helper *sh;
@@ -53,7 +54,7 @@ struct editor_s
    Eina_Bool on_select_recover : 1;
    Eina_Bool auto_indent : 1;
    Eina_Bool part_highlight : 1;
-   Eina_Bool ctxpopup: 1;
+   Eina_Bool ctxpopup_enabled : 1;
    Eina_Bool on_save : 1;
 };
 
@@ -295,6 +296,15 @@ ctxpopup_preview_dismiss_cb(void *data, Evas_Object *obj,
    if (skip_focus) return;
    elm_object_disabled_set(ed->layout, EINA_FALSE);
    elm_object_focus_set(ed->en_edit, EINA_TRUE);
+   evas_object_smart_callback_call(ed->enventor, SIG_CTXPOPUP_DISMISSED, NULL);
+}
+
+static void
+ctxpopup_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   ed->ctxpopup = NULL;
 }
 
 //This function is called when user press up/down key or mouse wheel up/down
@@ -349,9 +359,8 @@ preview_img_relay_show(edit_data *ed, Evas_Object 
*ctxpopup, Eina_Bool next)
                                     cursor_pos);
      }
 end:
-#if 0
-   menu_ctxpopup_unregister(ctxpopup);
-#endif
+   evas_object_event_callback_del(ctxpopup, EVAS_CALLBACK_DEL, 
ctxpopup_del_cb);
+   ed->ctxpopup = NULL;
    elm_ctxpopup_dismiss(ctxpopup);
 }
 
@@ -410,9 +419,8 @@ image_preview_show(edit_data *ed, char *cur, Evas_Coord x, 
Evas_Coord y)
 
         evas_object_move(ctxpopup, x, y);
         evas_object_show(ctxpopup);
-#if 0
-        menu_ctxpopup_register(ctxpopup);
-#endif
+        evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, 
ctxpopup_del_cb, ed);
+        ed->ctxpopup = ctxpopup;
         elm_object_disabled_set(ed->layout, EINA_TRUE);
         succeed = EINA_TRUE;
      }
@@ -443,9 +451,8 @@ candidate_list_show(edit_data *ed, char *text, char *cur, 
char *selected)
    evas_pointer_output_xy_get(evas_object_evas_get(ed->en_edit), &x, &y);
    evas_object_move(ctxpopup, x, y);
    evas_object_show(ctxpopup);
-#if 0
-   menu_ctxpopup_register(ctxpopup);
-#endif
+   evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, 
ctxpopup_del_cb, ed);
+   ed->ctxpopup = ctxpopup;
    elm_object_disabled_set(ed->layout, EINA_TRUE);
 }
 
@@ -468,7 +475,7 @@ edit_cursor_double_clicked_cb(void *data, Evas_Object *obj,
    edit_data *ed = data;
 
    if (ed->ctrl_pressed) return;
-   if (!ed->ctxpopup) return;
+   if (!ed->ctxpopup_enabled) return;
 
    char *selected = (char *) elm_entry_selection_get(obj);
    if (!selected) return;
@@ -1036,7 +1043,7 @@ edit_init(Evas_Object *enventor)
    ed->linenumber = EINA_TRUE;
    ed->auto_indent = EINA_TRUE;
    ed->part_highlight = EINA_TRUE;
-   ed->ctxpopup = EINA_TRUE;
+   ed->ctxpopup_enabled = EINA_TRUE;
    ed->cur_line = -1;
    ed->select_pos = -1;
    ed->font_scale = 1;
@@ -1279,12 +1286,24 @@ edit_auto_indent_get(edit_data *ed)
 Eina_Bool
 edit_ctxpopup_get(edit_data *ed)
 {
-   return ed->ctxpopup;
+   return ed->ctxpopup_enabled;
 }
 
 void
 edit_ctxpopup_set(edit_data *ed, Eina_Bool ctxpopup)
 {
    ctxpopup = !!ctxpopup;
-   ed->ctxpopup = ctxpopup;
+   ed->ctxpopup_enabled = ctxpopup;
+}
+
+Eina_Bool
+edit_ctxpopup_visible_get(edit_data *ed)
+{
+   return (ed->ctxpopup ? EINA_TRUE : EINA_FALSE);
+}
+
+void
+edit_ctxpopup_dismiss(edit_data *ed)
+{
+   elm_ctxpopup_dismiss(ed->ctxpopup);
 }
diff --git a/src/lib/enventor_object.eo b/src/lib/enventor_object.eo
index b298e28..ea877cb 100644
--- a/src/lib/enventor_object.eo
+++ b/src/lib/enventor_object.eo
@@ -380,6 +380,21 @@ class Enventor.Object (Elm_Widget, Efl.File) {
             @in size_t n;
          }
       }
+      ctxpopup_visible_get {
+         /*@
+         @brief
+         @warning
+         @see
+         @ingroup Enventor */
+         return: Eina_Bool;
+      }
+      ctxpopup_dismiss {
+         /*@
+         @brief
+         @warning
+         @see
+         @ingroup Enventor */
+      }
    }
    implements {
       class.constructor;
diff --git a/src/lib/enventor_private.h b/src/lib/enventor_private.h
index f60090b..06667c8 100644
--- a/src/lib/enventor_private.h
+++ b/src/lib/enventor_private.h
@@ -223,6 +223,8 @@ void edit_part_highlight_set(edit_data *ed, Eina_Bool 
part_highlight);
 Eina_Bool edit_part_highlight_get(edit_data *ed);
 void edit_ctxpopup_set(edit_data *ed, Eina_Bool ctxpopup);
 Eina_Bool edit_ctxpopup_get(edit_data *ed);
+Eina_Bool edit_ctxpopup_visible_get(edit_data *ed);
+void edit_ctxpopup_dismiss(edit_data *ed);
 Eina_Bool edit_load(edit_data *ed, const char *edc_path);
 void edit_selection_clear(edit_data *ed);
 
diff --git a/src/lib/enventor_smart.c b/src/lib/enventor_smart.c
index e299db0..1f2adbf 100644
--- a/src/lib/enventor_smart.c
+++ b/src/lib/enventor_smart.c
@@ -344,6 +344,20 @@ _enventor_object_ctxpopup_set(Eo *obj EINA_UNUSED, 
Enventor_Object_Data *pd,
 }
 
 EOLIAN static Eina_Bool
+_enventor_object_ctxpopup_visible_get(Eo *obj EINA_UNUSED,
+                                      Enventor_Object_Data *pd)
+{
+   edit_ctxpopup_visible_get(pd->ed);
+}
+
+EOLIAN static void
+_enventor_object_ctxpopup_dismiss(Eo *obj EINA_UNUSED,
+                                  Enventor_Object_Data *pd)
+{
+   edit_ctxpopup_dismiss(pd->ed);
+}
+
+EOLIAN static Eina_Bool
 _enventor_object_dummy_swallow_get(Eo *obj EINA_UNUSED,
                                    Enventor_Object_Data *pd)
 {

-- 


Reply via email to