From 2e15739b214cbb6c555bee1b24ae36d05d3248c3 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Thu, 20 Dec 2012 09:37:37 +0000 Subject: [PATCH] e17/evry: ensure that there will be only one true popup. - add timer to delay closing with the same binding that triggers evry SVN revision: 81432 --- src/modules/everything/e_mod_main.h | 2 ++ src/modules/everything/evry.c | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/modules/everything/e_mod_main.h b/src/modules/everything/e_mod_main.h index 5b2b2cdfa..cddf7aa8f 100644 --- a/src/modules/everything/e_mod_main.h +++ b/src/modules/everything/e_mod_main.h @@ -53,6 +53,8 @@ struct _Evry_Window /* only to be used by creator of win */ void *data; + + Ecore_Timer *delay_hide_action; }; struct _Evry_Selector diff --git a/src/modules/everything/evry.c b/src/modules/everything/evry.c index 81878296a..c3c9c071b 100644 --- a/src/modules/everything/evry.c +++ b/src/modules/everything/evry.c @@ -68,6 +68,8 @@ static Eina_Bool _evry_cb_key_down(void *data, int type, void *event); static Eina_Bool _evry_cb_selection_notify(void *data, int type, void *event); static Eina_Bool _evry_cb_mouse(void *data, int type, void *event); +static Eina_Bool _evry_delay_hide_timer(void *data); + static Eina_List *windows = NULL; #ifdef CHECK_TIME @@ -161,6 +163,15 @@ evry_show(E_Zone *zone, E_Zone_Edge edge, const char *params, Eina_Bool popup) E_OBJECT_CHECK_RETURN(zone, 0); E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, 0); + if (popup) + { + // only one popup please + Eina_List *l; + EINA_LIST_FOREACH(windows, l, win) + if (win->grab) + return NULL; + } + if (!(win = _evry_window_new(zone, edge))) return NULL; @@ -265,9 +276,20 @@ evry_show(E_Zone *zone, E_Zone_Edge edge, const char *params, Eina_Bool popup) win->func.hide = &_evry_hide_func; + win->delay_hide_action = ecore_timer_add(0.2, _evry_delay_hide_timer, win); + return win; } +static Eina_Bool +_evry_delay_hide_timer(void *data) +{ + Evry_Window *win = data; + win->delay_hide_action = NULL; + + return ECORE_CALLBACK_CANCEL; +} + static void _evry_hide_func(Evry_Window *win, int finished) { @@ -344,6 +366,9 @@ evry_hide(Evry_Window *win, int clear) EINA_LIST_FREE (win->handlers, ev) ecore_event_handler_del(ev); + if (win->delay_hide_action) + ecore_timer_del(win->delay_hide_action); + if (win->grab) e_grabinput_release(win->ewin->evas_win, win->ewin->evas_win); @@ -1951,7 +1976,7 @@ _evry_cb_key_down(void *data, int type __UNUSED__, void *event) return ECORE_CALLBACK_PASS_ON; } #endif - else if (ev->modifiers) + else if ((ev->modifiers) && (!win->delay_hide_action)) { Eina_List *l; E_Config_Binding_Key *binding;