parent
fb323cef74
commit
3475cb81c5
258
src/bin/e_menu.c
258
src/bin/e_menu.c
|
@ -113,6 +113,28 @@ static Ecore_Event_Handler *_e_menu_mouse_move_handler = NULL;
|
|||
static Ecore_Event_Handler *_e_menu_mouse_wheel_handler = NULL;
|
||||
static Ecore_Event_Handler *_e_menu_window_shape_handler = NULL;
|
||||
|
||||
static Eina_List *
|
||||
_e_active_menus_copy_ref(void)
|
||||
{
|
||||
E_Object *o;
|
||||
Eina_List *l, *ret = NULL;
|
||||
EINA_LIST_FOREACH(_e_active_menus, l, o)
|
||||
{
|
||||
ret = eina_list_append(ret, o);
|
||||
e_object_ref(o);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static Eina_List *
|
||||
_e_menu_list_free_unref(Eina_List *l)
|
||||
{
|
||||
E_Object *o;
|
||||
EINA_LIST_FREE(l, o)
|
||||
e_object_unref(o);
|
||||
return l;
|
||||
}
|
||||
|
||||
/* externally accessible functions */
|
||||
EAPI int
|
||||
e_menu_init(void)
|
||||
|
@ -550,20 +572,20 @@ e_menu_item_nth(E_Menu *m, int n)
|
|||
}
|
||||
|
||||
EAPI int
|
||||
e_menu_item_num_get(E_Menu_Item *mi)
|
||||
e_menu_item_num_get(const E_Menu_Item *mi)
|
||||
{
|
||||
Eina_List *l;
|
||||
const Eina_List *l;
|
||||
const E_Menu_Item *mi2;
|
||||
int i;
|
||||
|
||||
|
||||
E_OBJECT_CHECK_RETURN(mi, -1);
|
||||
E_OBJECT_CHECK_RETURN(mi->menu, -1);
|
||||
E_OBJECT_TYPE_CHECK_RETURN(mi, E_MENU_TYPE, -1);
|
||||
for (i = 0, l = mi->menu->items; l; l = l->next, i++)
|
||||
i = 0;
|
||||
EINA_LIST_FOREACH(mi->menu->items, l, mi2)
|
||||
{
|
||||
E_Menu_Item *mi2;
|
||||
|
||||
mi2 = l->data;
|
||||
if (mi2 == mi) return i;
|
||||
i++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -720,15 +742,13 @@ e_menu_item_toggle_set(E_Menu_Item *mi, int tog)
|
|||
{
|
||||
if (mi->radio)
|
||||
{
|
||||
Eina_List *l;
|
||||
|
||||
for (l = mi->menu->items; l; l = l->next)
|
||||
const Eina_List *l;
|
||||
E_Menu_Item *mi2;
|
||||
|
||||
EINA_LIST_FOREACH(mi->menu->items, l, mi2)
|
||||
{
|
||||
E_Menu_Item *mi2;
|
||||
|
||||
mi2 = l->data;
|
||||
if ((mi2 != mi) &&
|
||||
(mi2->radio) &&
|
||||
if ((mi2 != mi) &&
|
||||
(mi2->radio) &&
|
||||
(mi2->radio_group == mi->radio_group))
|
||||
e_menu_item_toggle_set(mi2, 0);
|
||||
}
|
||||
|
@ -848,20 +868,14 @@ e_menu_idler_before(void)
|
|||
/* when e goes "idle" this gets called so leave all our hard work till */
|
||||
/* idle time to avoid falling behind the user. just evaluate the high */
|
||||
/* level state machine */
|
||||
Eina_List *l, *removals = NULL, *tmp = NULL;
|
||||
Eina_List *l, *removals = NULL, *tmp;
|
||||
E_Menu *m;
|
||||
|
||||
/* add refcount to all menus we will work with */
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
{
|
||||
tmp = eina_list_append(tmp, l->data);
|
||||
e_object_ref(E_OBJECT(l->data));
|
||||
}
|
||||
tmp = _e_active_menus_copy_ref();
|
||||
/* phase 1. hide all the menus that want to be hidden */
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = l->data;
|
||||
if ((!m->cur.visible) && (m->prev.visible))
|
||||
{
|
||||
m->prev.visible = m->cur.visible;
|
||||
|
@ -870,11 +884,8 @@ e_menu_idler_before(void)
|
|||
}
|
||||
}
|
||||
/* phase 2. move & reisze all the menus that want to moves/resized */
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = l->data;
|
||||
if (!m->realized) _e_menu_realize(m);
|
||||
if (m->realized)
|
||||
{
|
||||
|
@ -897,11 +908,8 @@ e_menu_idler_before(void)
|
|||
}
|
||||
}
|
||||
/* phase 3. show all the menus that want to be shown */
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = l->data;
|
||||
if ((m->cur.visible) && (!m->prev.visible))
|
||||
{
|
||||
m->prev.visible = m->cur.visible;
|
||||
|
@ -912,23 +920,16 @@ e_menu_idler_before(void)
|
|||
}
|
||||
}
|
||||
/* phase 4. de-activate... */
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = l->data;
|
||||
if (!m->active)
|
||||
{
|
||||
_e_menu_unrealize(m);
|
||||
removals = eina_list_append(removals, m);
|
||||
}
|
||||
}
|
||||
while (removals)
|
||||
EINA_LIST_FREE(removals, m)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = removals->data;
|
||||
removals = eina_list_remove(removals, m);
|
||||
if (m->in_active_list)
|
||||
{
|
||||
_e_active_menus = eina_list_remove(_e_active_menus, m);
|
||||
|
@ -937,11 +938,8 @@ e_menu_idler_before(void)
|
|||
}
|
||||
}
|
||||
/* phase 5. shapes... */
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = l->data;
|
||||
if (m->need_shape_export)
|
||||
{
|
||||
Ecore_X_Rectangle *rects, *orects;
|
||||
|
@ -994,11 +992,8 @@ e_menu_idler_before(void)
|
|||
}
|
||||
}
|
||||
/* del refcount to all menus we worked with */
|
||||
while (tmp)
|
||||
{
|
||||
e_object_unref(E_OBJECT(tmp->data));
|
||||
tmp = eina_list_remove_list(tmp, tmp);
|
||||
}
|
||||
tmp = _e_menu_list_free_unref(tmp);
|
||||
|
||||
if (!_e_active_menus)
|
||||
{
|
||||
if (_e_menu_win)
|
||||
|
@ -1020,29 +1015,26 @@ e_menu_grab_window_get(void)
|
|||
static void
|
||||
_e_menu_free(E_Menu *m)
|
||||
{
|
||||
Eina_List *l, *tmp;
|
||||
Eina_List *l, *l_next;
|
||||
E_Menu_Item *mi;
|
||||
E_Menu_Category *cat = NULL;
|
||||
|
||||
/* the foreign menu items */
|
||||
if (m->category) cat = eina_hash_find(_e_menu_categories, m->category);
|
||||
if (cat)
|
||||
{
|
||||
for (l = cat->callbacks; l; l = l->next)
|
||||
E_Menu_Category_Callback *cb;
|
||||
EINA_LIST_FOREACH(cat->callbacks, l, cb)
|
||||
{
|
||||
E_Menu_Category_Callback *cb;
|
||||
|
||||
cb = l->data;
|
||||
if (cb->free) cb->free(cb->data);
|
||||
}
|
||||
}
|
||||
_e_menu_unrealize(m);
|
||||
E_FREE(m->shape_rects);
|
||||
m->shape_rects_num = 0;
|
||||
for (l = m->items; l;)
|
||||
EINA_LIST_FOREACH_SAFE(m->items, l, l_next, mi)
|
||||
{
|
||||
tmp = l;
|
||||
l = l->next;
|
||||
e_object_del(E_OBJECT(tmp->data));
|
||||
e_object_del(E_OBJECT(mi));
|
||||
}
|
||||
if (m->in_active_list)
|
||||
{
|
||||
|
@ -1370,6 +1362,7 @@ _e_menu_realize(E_Menu *m)
|
|||
{
|
||||
Evas_Object *o;
|
||||
Eina_List *l;
|
||||
E_Menu_Item *mi;
|
||||
|
||||
int ok;
|
||||
|
||||
|
@ -1442,12 +1435,8 @@ _e_menu_realize(E_Menu *m)
|
|||
e_box_homogenous_set(o, 0);
|
||||
edje_object_part_swallow(m->bg_object, "e.swallow.content", m->container_object);
|
||||
|
||||
|
||||
for (l = m->items; l; l = l->next)
|
||||
EINA_LIST_FOREACH(m->items, l, mi)
|
||||
{
|
||||
E_Menu_Item *mi;
|
||||
|
||||
mi = l->data;
|
||||
_e_menu_item_realize(mi);
|
||||
}
|
||||
|
||||
|
@ -1462,6 +1451,7 @@ static void
|
|||
_e_menu_items_layout_update(E_Menu *m)
|
||||
{
|
||||
Eina_List *l;
|
||||
E_Menu_Item *mi;
|
||||
Evas_Coord bw, bh, mw, mh;
|
||||
int toggles_on = 0;
|
||||
int icons_on = 0;
|
||||
|
@ -1474,12 +1464,8 @@ _e_menu_items_layout_update(E_Menu *m)
|
|||
int min_w = 0, min_h = 0;
|
||||
|
||||
e_box_freeze(m->container_object);
|
||||
for (l = m->items; l; l = l->next)
|
||||
EINA_LIST_FOREACH(m->items, l, mi)
|
||||
{
|
||||
E_Menu_Item *mi;
|
||||
|
||||
mi = l->data;
|
||||
|
||||
if (mi->icon) icons_on = 1;
|
||||
if (mi->icon_object) icons_on = 1;
|
||||
if (mi->label) labels_on = 1;
|
||||
|
@ -1541,11 +1527,8 @@ _e_menu_items_layout_update(E_Menu *m)
|
|||
min_w = min_toggle_w + min_submenu_w;
|
||||
min_h = min_toggle_h;
|
||||
}
|
||||
for (l = m->items; l; l = l->next)
|
||||
EINA_LIST_FOREACH(m->items, l, mi)
|
||||
{
|
||||
E_Menu_Item *mi;
|
||||
|
||||
mi = l->data;
|
||||
if (mi->separator)
|
||||
{
|
||||
e_box_pack_options_set(mi->separator_object,
|
||||
|
@ -1685,19 +1668,16 @@ static void
|
|||
_e_menu_unrealize(E_Menu *m)
|
||||
{
|
||||
Eina_List *l;
|
||||
|
||||
E_Menu_Item *mi;
|
||||
|
||||
if (!m->realized) return;
|
||||
evas_event_freeze(m->evas);
|
||||
e_container_shape_hide(m->shape);
|
||||
e_object_del(E_OBJECT(m->shape));
|
||||
m->shape = NULL;
|
||||
e_box_freeze(m->container_object);
|
||||
|
||||
for (l = m->items; l; l = l->next)
|
||||
EINA_LIST_FOREACH(m->items, l, mi)
|
||||
{
|
||||
E_Menu_Item *mi;
|
||||
|
||||
mi = l->data;
|
||||
_e_menu_item_unrealize(mi);
|
||||
}
|
||||
if (m->header.icon) evas_object_del(m->header.icon);
|
||||
|
@ -1767,11 +1747,9 @@ _e_menu_activate_internal(E_Menu *m, E_Zone *zone)
|
|||
cat = evas_hash_find(_e_menu_categories, m->category);
|
||||
if (cat)
|
||||
{
|
||||
for (l = cat->callbacks; l; l = l->next)
|
||||
E_Menu_Category_Callback *cb;
|
||||
EINA_LIST_FOREACH(cat->callbacks, l, cb)
|
||||
{
|
||||
E_Menu_Category_Callback *cb;
|
||||
|
||||
cb = l->data;
|
||||
if (cb->create) cb->create(m, cat->data, cb->data);
|
||||
}
|
||||
}
|
||||
|
@ -1782,19 +1760,13 @@ _e_menu_activate_internal(E_Menu *m, E_Zone *zone)
|
|||
static void
|
||||
_e_menu_deactivate_all(void)
|
||||
{
|
||||
Eina_List *l, *tmp = NULL;
|
||||
Eina_List *tmp;
|
||||
E_Menu *m;
|
||||
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
tmp = _e_active_menus_copy_ref();
|
||||
|
||||
EINA_LIST_FREE(tmp, m)
|
||||
{
|
||||
e_object_ref(E_OBJECT(l->data));
|
||||
tmp = eina_list_append(tmp, l->data);
|
||||
}
|
||||
while (tmp)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = tmp->data;
|
||||
tmp = eina_list_remove_list(tmp, tmp);
|
||||
e_menu_deactivate(m);
|
||||
m->parent_item = NULL;
|
||||
e_object_unref(E_OBJECT(m));
|
||||
|
@ -1807,20 +1779,14 @@ _e_menu_deactivate_all(void)
|
|||
static void
|
||||
_e_menu_deactivate_above(E_Menu *ma)
|
||||
{
|
||||
Eina_List *l, *tmp = NULL;
|
||||
Eina_List *tmp;
|
||||
int above = 0;
|
||||
E_Menu *m;
|
||||
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
tmp = _e_active_menus_copy_ref();
|
||||
|
||||
EINA_LIST_FREE(tmp, m)
|
||||
{
|
||||
e_object_ref(E_OBJECT(l->data));
|
||||
tmp = eina_list_append(tmp, l->data);
|
||||
}
|
||||
while (tmp)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = tmp->data;
|
||||
tmp = eina_list_remove_list(tmp, tmp);
|
||||
if (above)
|
||||
{
|
||||
e_menu_deactivate(m);
|
||||
|
@ -1868,7 +1834,8 @@ _e_menu_submenu_deactivate(E_Menu_Item *mi)
|
|||
static void
|
||||
_e_menu_reposition(E_Menu *m)
|
||||
{
|
||||
Eina_List *l, *tmp = NULL;
|
||||
Eina_List *l, *tmp;
|
||||
E_Menu_Item *mi;
|
||||
int parent_item_bottom;
|
||||
|
||||
if (!m->parent_item) return;
|
||||
|
@ -1897,23 +1864,14 @@ _e_menu_reposition(E_Menu *m)
|
|||
}
|
||||
|
||||
/* FIXME: this will suck for big menus */
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
tmp = _e_active_menus_copy_ref();
|
||||
|
||||
EINA_LIST_FOREACH(m->items, l, mi)
|
||||
{
|
||||
tmp = eina_list_append(tmp, l->data);
|
||||
e_object_ref(E_OBJECT(l->data));
|
||||
}
|
||||
for (l = m->items; l; l = l->next)
|
||||
{
|
||||
E_Menu_Item *mi;
|
||||
|
||||
mi = l->data;
|
||||
if ((mi->active) && (mi->submenu)) _e_menu_reposition(mi->submenu);
|
||||
}
|
||||
while (tmp)
|
||||
{
|
||||
e_object_unref(E_OBJECT(tmp->data));
|
||||
tmp = eina_list_remove_list(tmp, tmp);
|
||||
}
|
||||
|
||||
_e_menu_list_free_unref(tmp);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -2084,9 +2042,9 @@ _e_menu_item_activate_nth(int n)
|
|||
if (!mi) return;
|
||||
}
|
||||
m = mi->menu;
|
||||
for (i = -1, ll = m->items; ll; ll = ll->next)
|
||||
i = -1;
|
||||
EINA_LIST_FOREACH(m->items, ll, mi)
|
||||
{
|
||||
mi = ll->data;
|
||||
if (!mi->separator) i++;
|
||||
if (i == n) break;
|
||||
}
|
||||
|
@ -2265,11 +2223,9 @@ _e_menu_activate_nth(int n)
|
|||
if (!mi) return;
|
||||
}
|
||||
m = mi->menu;
|
||||
for (i = -1, ll = m->items; ll; ll = ll->next)
|
||||
i = -1;
|
||||
EINA_LIST_FOREACH(m->items, ll, mi)
|
||||
{
|
||||
E_Menu_Item *mi;
|
||||
|
||||
mi = ll->data;
|
||||
if (!mi->separator) i++;
|
||||
if (i == n)
|
||||
{
|
||||
|
@ -2307,17 +2263,15 @@ static int
|
|||
_e_menu_outside_bounds_get(int xdir, int ydir)
|
||||
{
|
||||
Eina_List *l;
|
||||
E_Menu *m;
|
||||
int outl = 0;
|
||||
int outr = 0;
|
||||
int outt = 0;
|
||||
int outb = 0;
|
||||
int i;
|
||||
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = l->data;
|
||||
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
||||
{
|
||||
if (m->cur.x < m->zone->x + e_config->menu_autoscroll_margin)
|
||||
{
|
||||
i = m->zone->x - m->cur.x + e_config->menu_autoscroll_margin;
|
||||
|
@ -2362,12 +2316,10 @@ static void
|
|||
_e_menu_scroll_by(int dx, int dy)
|
||||
{
|
||||
Eina_List *l;
|
||||
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
E_Menu *m;
|
||||
|
||||
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = l->data;
|
||||
m->cur.x += dx;
|
||||
m->cur.y += dy;
|
||||
}
|
||||
|
@ -2711,7 +2663,8 @@ static int
|
|||
_e_menu_cb_mouse_move(void *data, int type, void *event)
|
||||
{
|
||||
Ecore_Event_Mouse_Move *ev;
|
||||
Eina_List *l, *tmp = NULL;
|
||||
Eina_List *l, *tmp;
|
||||
E_Menu *m;
|
||||
int dx, dy, d;
|
||||
double dt;
|
||||
double fast_move_threshold;
|
||||
|
@ -2728,16 +2681,10 @@ _e_menu_cb_mouse_move(void *data, int type, void *event)
|
|||
if ((dt > 0.0) && ((d / dt) >= (fast_move_threshold * fast_move_threshold)))
|
||||
is_fast = 1;
|
||||
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
tmp = _e_active_menus_copy_ref();
|
||||
|
||||
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
||||
{
|
||||
tmp = eina_list_append(tmp, l->data);
|
||||
e_object_ref(E_OBJECT(l->data));
|
||||
}
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = l->data;
|
||||
if ((m->realized) && (m->cur.visible))
|
||||
{
|
||||
if (is_fast)
|
||||
|
@ -2761,12 +2708,9 @@ _e_menu_cb_mouse_move(void *data, int type, void *event)
|
|||
NULL);
|
||||
}
|
||||
}
|
||||
while (tmp)
|
||||
{
|
||||
e_object_unref(E_OBJECT(tmp->data));
|
||||
tmp = eina_list_remove_list(tmp, tmp);
|
||||
}
|
||||
|
||||
|
||||
_e_menu_list_free_unref(tmp);
|
||||
|
||||
_e_menu_x = ev->x;
|
||||
_e_menu_y = ev->y;
|
||||
_e_menu_time = ev->timestamp;
|
||||
|
@ -2853,13 +2797,11 @@ _e_menu_cb_window_shape(void *data, int ev_type, void *ev)
|
|||
{
|
||||
Eina_List *l;
|
||||
Ecore_X_Event_Window_Shape *e;
|
||||
|
||||
E_Menu *m;
|
||||
|
||||
e = ev;
|
||||
for (l = _e_active_menus; l; l = l->next)
|
||||
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
||||
{
|
||||
E_Menu *m;
|
||||
|
||||
m = l->data;
|
||||
if (m->evas_win == e->win)
|
||||
m->need_shape_export = 1;
|
||||
}
|
||||
|
|
|
@ -184,7 +184,7 @@ EAPI E_Menu *e_menu_root_get(E_Menu *m);
|
|||
|
||||
EAPI E_Menu_Item *e_menu_item_new(E_Menu *m);
|
||||
EAPI E_Menu_Item *e_menu_item_nth(E_Menu *m, int n);
|
||||
EAPI int e_menu_item_num_get(E_Menu_Item *mi);
|
||||
EAPI int e_menu_item_num_get(const E_Menu_Item *mi);
|
||||
EAPI void e_menu_item_icon_file_set(E_Menu_Item *mi, const char *icon);
|
||||
EAPI void e_menu_item_icon_edje_set(E_Menu_Item *mi, const char *icon, const char *key);
|
||||
EAPI void e_menu_item_label_set(E_Menu_Item *mi, const char *label);
|
||||
|
|
Loading…
Reference in New Issue