From 02fb416a852924d617443e5f52e749a2f46ec0b4 Mon Sep 17 00:00:00 2001 From: Jaehyun Cho Date: Mon, 3 Nov 2014 12:19:33 +0900 Subject: [PATCH] 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); @@ -413,6 +414,15 @@ enventor_ctxpopup_selected_cb(void *data EINA_UNUSED, Evas_Object *obj, enventor_object_save(obj, config_edc_path_get()); } +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 @@ -343,6 +343,20 @@ _enventor_object_ctxpopup_set(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd, edit_ctxpopup_set(pd->ed, ctxpopup); } +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)