raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=86f4dc82d504d99100f14db602d27db2cc07c4a5

commit 86f4dc82d504d99100f14db602d27db2cc07c4a5
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Mon Jan 6 13:19:56 2014 +0900

    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 1b433ae..a5012ed 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 ece5960..2223f42 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 c312c1c..9203f16 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;

-- 


Reply via email to