From 86f4dc82d504d99100f14db602d27db2cc07c4a5 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Mon, 6 Jan 2014 13:19:56 +0900 Subject: [PATCH] ibar - add option to show icon menu on mousover --- src/modules/ibar/e_mod_config.c | 5 ++ src/modules/ibar/e_mod_main.c | 81 ++++++++++++++++++++++++++++----- src/modules/ibar/e_mod_main.h | 1 + 3 files changed, 75 insertions(+), 12 deletions(-) diff --git a/src/modules/ibar/e_mod_config.c b/src/modules/ibar/e_mod_config.c index 1b433ae09..a5012edab 100644 --- a/src/modules/ibar/e_mod_config.c +++ b/src/modules/ibar/e_mod_config.c @@ -8,6 +8,7 @@ struct _E_Config_Dialog_Data int lock_move; int track_launch; int dont_add_nonorder; + int icon_menu_mouseover; Evas_Object *tlist; Evas_Object *radio_name; @@ -70,6 +71,7 @@ _fill_data(Config_Item *ci, E_Config_Dialog_Data *cfdata) cfdata->lock_move = ci->lock_move; cfdata->dont_add_nonorder = ci->dont_add_nonorder; cfdata->track_launch = !ci->dont_track_launch; + cfdata->icon_menu_mouseover = !ci->dont_icon_menu_mouseover; } static void * @@ -150,6 +152,8 @@ _basic_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dial e_widget_framelist_object_append(of, ob); ob = e_widget_check_add(evas, _("Track launch"), &(cfdata->track_launch)); e_widget_framelist_object_append(of, ob); + ob = e_widget_check_add(evas, _("Mouseover Menu"), &(cfdata->icon_menu_mouseover)); + e_widget_framelist_object_append(of, ob); e_widget_list_object_append(o, of, 1, 1, 0.5); @@ -170,6 +174,7 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) ci->lock_move = cfdata->lock_move; ci->dont_add_nonorder = cfdata->dont_add_nonorder; ci->dont_track_launch = !cfdata->track_launch; + ci->dont_icon_menu_mouseover = !cfdata->icon_menu_mouseover; _ibar_config_update(ci); e_config_save_queue(); return 1; diff --git a/src/modules/ibar/e_mod_main.c b/src/modules/ibar/e_mod_main.c index ece59602f..2223f42aa 100644 --- a/src/modules/ibar/e_mod_main.c +++ b/src/modules/ibar/e_mod_main.c @@ -70,6 +70,7 @@ struct _IBar_Icon Efreet_Desktop *app; Ecore_Timer *reset_timer; Ecore_Timer *timer; + Ecore_Timer *hide_timer; E_Exec_Instance *exe_inst; Eina_List *exes; //all instances Eina_List *exe_current; @@ -83,6 +84,7 @@ struct _IBar_Icon } drag; Eina_Bool focused : 1; Eina_Bool not_in_order : 1; + Eina_Bool menu_grabbed : 1; }; static IBar *_ibar_new(Evas *evas, Instance *inst); @@ -128,6 +130,9 @@ static void _ibar_drop_position_update(Instance *inst, Evas_Coord x, Eva static void _ibar_inst_cb_scroll(void *data); static Eina_Bool _ibar_cb_config_icons(void *data, int ev_type, void *ev); +static void _ibar_icon_menu_show(IBar_Icon *ic, Eina_Bool grab); +static void _ibar_icon_menu_hide(IBar_Icon *ic, Eina_Bool grab); + static E_Config_DD *conf_edd = NULL; static E_Config_DD *conf_item_edd = NULL; @@ -667,6 +672,7 @@ _ibar_config_item_get(const char *id) ci->lock_move = 0; ci->dont_add_nonorder = 0; ci->dont_track_launch = 0; + ci->dont_icon_menu_mouseover = 0; ibar_config->items = eina_list_append(ibar_config->items, ci); return ci; } @@ -833,6 +839,7 @@ _ibar_icon_free(IBar_Icon *ic) e_exec_instance_watcher_del(inst, _ibar_instance_watch, ic); E_FREE_FUNC(ic->menu, e_object_del); E_FREE_FUNC(ic->timer, ecore_timer_del); + E_FREE_FUNC(ic->hide_timer, ecore_timer_del); evas_object_del(ic->o_holder); evas_object_del(ic->o_holder2); if (ic->exe_inst) @@ -1070,7 +1077,7 @@ _ibar_cb_icon_menu_img_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EIN } static void -_ibar_icon_menu(IBar_Icon *ic) +_ibar_icon_menu(IBar_Icon *ic, Eina_Bool grab) { Evas_Object *o, *it; Eina_List *l; @@ -1158,7 +1165,40 @@ _ibar_icon_menu(IBar_Icon *ic) e_popup_move(ic->menu->win, ox, oy); } edje_object_signal_emit(o, "e,action,show", "e"); - e_popup_autoclose(ic->menu->win, _ibar_cb_icon_menu_autodel, NULL, ic); + ic->menu_grabbed = grab; + if (grab) + e_popup_autoclose(ic->menu->win, _ibar_cb_icon_menu_autodel, NULL, ic); +} + +static void +_ibar_icon_menu_show(IBar_Icon *ic, Eina_Bool grab) +{ + IBar_Icon *ic2; + + EINA_INLIST_FOREACH(ic->ibar->icons, ic2) + { + if (ic2 == ic) continue; + if (ic2->menu) _ibar_icon_menu_hide(ic2, ic2->menu_grabbed); + } + if (ic->menu) + { + edje_object_signal_emit(ic->menu->o_bg, "e,action,show", "e"); + return; + } + ic->drag.start = 0; + ic->drag.dnd = 0; + ic->mouse_down = 0; + _ibar_icon_menu(ic, grab); +} + +static void +_ibar_icon_menu_hide(IBar_Icon *ic, Eina_Bool grab) +{ + if (!ic->menu) return; + if (ic->menu_grabbed != grab) return; + E_FREE_FUNC(ic->hide_timer, ecore_timer_del); + ic->menu_grabbed = EINA_FALSE; + edje_object_signal_emit(ic->menu->o_bg, "e,action,hide", "e"); } static void @@ -1167,12 +1207,24 @@ _ibar_cb_icon_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED IBar_Icon *ic; ic = data; - if (ic->reset_timer) ecore_timer_del(ic->reset_timer); - ic->reset_timer = NULL; + E_FREE_FUNC(ic->reset_timer, ecore_timer_del); ic->focused = EINA_TRUE; _ibar_icon_signal_emit(ic, "e,state,focused", "e"); if (ic->ibar->inst->ci->show_label) _ibar_icon_signal_emit(ic, "e,action,show,label", "e"); + E_FREE_FUNC(ic->hide_timer, ecore_timer_del); + if (!ic->ibar->inst->ci->dont_icon_menu_mouseover) + _ibar_icon_menu_show(ic, EINA_FALSE); +} + +static Eina_Bool +_ibar_cb_out_hide_delay(void *data) +{ + IBar_Icon *ic = data; + + ic->hide_timer = NULL; + _ibar_icon_menu_hide(ic, EINA_FALSE); + return EINA_FALSE; } static void @@ -1181,12 +1233,16 @@ _ibar_cb_icon_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSE IBar_Icon *ic; ic = data; - if (ic->reset_timer) ecore_timer_del(ic->reset_timer); - ic->reset_timer = NULL; + E_FREE_FUNC(ic->reset_timer, ecore_timer_del); ic->focused = EINA_FALSE; _ibar_icon_signal_emit(ic, "e,state,unfocused", "e"); if (ic->ibar->inst->ci->show_label) _ibar_icon_signal_emit(ic, "e,action,hide,label", "e"); + if (!ic->ibar->inst->ci->dont_icon_menu_mouseover) + { + if (ic->hide_timer) ecore_timer_del(ic->hide_timer); + ic->hide_timer = ecore_timer_add(2.0, _ibar_cb_out_hide_delay, ic); + } } static Eina_Bool @@ -1195,10 +1251,7 @@ _ibar_cb_icon_menu_cb(void *data) IBar_Icon *ic = data; ic->timer = NULL; - ic->drag.start = 0; - ic->drag.dnd = 0; - ic->mouse_down = 0; - _ibar_icon_menu(ic); + _ibar_icon_menu_show(ic, EINA_TRUE); return EINA_FALSE; } @@ -1222,7 +1275,9 @@ _ibar_cb_icon_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS } else if (ev->button == 2) { - _ibar_cb_icon_menu_cb(ic); + E_FREE_FUNC(ic->hide_timer, ecore_timer_del); + E_FREE_FUNC(ic->timer, ecore_timer_del); + _ibar_icon_menu_show(ic, EINA_TRUE); } else if (ev->button == 3) { @@ -2395,7 +2450,8 @@ e_modapi_init(E_Module *m) E_CONFIG_VAL(D, T, lock_move, INT); E_CONFIG_VAL(D, T, dont_add_nonorder, INT); E_CONFIG_VAL(D, T, dont_track_launch, UCHAR); - + E_CONFIG_VAL(D, T, dont_icon_menu_mouseover, UCHAR); + conf_edd = E_CONFIG_DD_NEW("IBar_Config", Config); #undef T #undef D @@ -2419,6 +2475,7 @@ e_modapi_init(E_Module *m) ci->lock_move = 0; ci->dont_add_nonorder = 0; ci->dont_track_launch = 0; + ci->dont_icon_menu_mouseover = 0; ibar_config->items = eina_list_append(ibar_config->items, ci); } diff --git a/src/modules/ibar/e_mod_main.h b/src/modules/ibar/e_mod_main.h index c312c1c28..9203f16f1 100644 --- a/src/modules/ibar/e_mod_main.h +++ b/src/modules/ibar/e_mod_main.h @@ -24,6 +24,7 @@ struct _Config_Item int lock_move; int dont_add_nonorder; unsigned char dont_track_launch; + unsigned char dont_icon_menu_mouseover; }; EAPI extern E_Module_Api e_modapi;