eina macros in menu loops

SVN revision: 39651
This commit is contained in:
Gustavo Sverzut Barbieri 2009-03-23 12:28:15 +00:00
parent fb323cef74
commit 3475cb81c5
2 changed files with 101 additions and 159 deletions

View File

@ -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_mouse_wheel_handler = NULL;
static Ecore_Event_Handler *_e_menu_window_shape_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 */ /* externally accessible functions */
EAPI int EAPI int
e_menu_init(void) e_menu_init(void)
@ -550,20 +572,20 @@ e_menu_item_nth(E_Menu *m, int n)
} }
EAPI int 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; int i;
E_OBJECT_CHECK_RETURN(mi, -1); E_OBJECT_CHECK_RETURN(mi, -1);
E_OBJECT_CHECK_RETURN(mi->menu, -1); E_OBJECT_CHECK_RETURN(mi->menu, -1);
E_OBJECT_TYPE_CHECK_RETURN(mi, E_MENU_TYPE, -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; if (mi2 == mi) return i;
i++;
} }
return -1; return -1;
} }
@ -720,15 +742,13 @@ e_menu_item_toggle_set(E_Menu_Item *mi, int tog)
{ {
if (mi->radio) if (mi->radio)
{ {
Eina_List *l; const Eina_List *l;
E_Menu_Item *mi2;
for (l = mi->menu->items; l; l = l->next)
EINA_LIST_FOREACH(mi->menu->items, l, mi2)
{ {
E_Menu_Item *mi2; if ((mi2 != mi) &&
(mi2->radio) &&
mi2 = l->data;
if ((mi2 != mi) &&
(mi2->radio) &&
(mi2->radio_group == mi->radio_group)) (mi2->radio_group == mi->radio_group))
e_menu_item_toggle_set(mi2, 0); 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 */ /* 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 */ /* idle time to avoid falling behind the user. just evaluate the high */
/* level state machine */ /* 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 */ /* add refcount to all menus we will work with */
for (l = _e_active_menus; l; l = l->next) tmp = _e_active_menus_copy_ref();
{
tmp = eina_list_append(tmp, l->data);
e_object_ref(E_OBJECT(l->data));
}
/* phase 1. hide all the menus that want to be hidden */ /* 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)) if ((!m->cur.visible) && (m->prev.visible))
{ {
m->prev.visible = m->cur.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 */ /* 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) _e_menu_realize(m);
if (m->realized) if (m->realized)
{ {
@ -897,11 +908,8 @@ e_menu_idler_before(void)
} }
} }
/* phase 3. show all the menus that want to be shown */ /* 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)) if ((m->cur.visible) && (!m->prev.visible))
{ {
m->prev.visible = m->cur.visible; m->prev.visible = m->cur.visible;
@ -912,23 +920,16 @@ e_menu_idler_before(void)
} }
} }
/* phase 4. de-activate... */ /* 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) if (!m->active)
{ {
_e_menu_unrealize(m); _e_menu_unrealize(m);
removals = eina_list_append(removals, 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) if (m->in_active_list)
{ {
_e_active_menus = eina_list_remove(_e_active_menus, m); _e_active_menus = eina_list_remove(_e_active_menus, m);
@ -937,11 +938,8 @@ e_menu_idler_before(void)
} }
} }
/* phase 5. shapes... */ /* 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) if (m->need_shape_export)
{ {
Ecore_X_Rectangle *rects, *orects; Ecore_X_Rectangle *rects, *orects;
@ -994,11 +992,8 @@ e_menu_idler_before(void)
} }
} }
/* del refcount to all menus we worked with */ /* del refcount to all menus we worked with */
while (tmp) tmp = _e_menu_list_free_unref(tmp);
{
e_object_unref(E_OBJECT(tmp->data));
tmp = eina_list_remove_list(tmp, tmp);
}
if (!_e_active_menus) if (!_e_active_menus)
{ {
if (_e_menu_win) if (_e_menu_win)
@ -1020,29 +1015,26 @@ e_menu_grab_window_get(void)
static void static void
_e_menu_free(E_Menu *m) _e_menu_free(E_Menu *m)
{ {
Eina_List *l, *tmp; Eina_List *l, *l_next;
E_Menu_Item *mi;
E_Menu_Category *cat = NULL; E_Menu_Category *cat = NULL;
/* the foreign menu items */ /* the foreign menu items */
if (m->category) cat = eina_hash_find(_e_menu_categories, m->category); if (m->category) cat = eina_hash_find(_e_menu_categories, m->category);
if (cat) 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); if (cb->free) cb->free(cb->data);
} }
} }
_e_menu_unrealize(m); _e_menu_unrealize(m);
E_FREE(m->shape_rects); E_FREE(m->shape_rects);
m->shape_rects_num = 0; m->shape_rects_num = 0;
for (l = m->items; l;) EINA_LIST_FOREACH_SAFE(m->items, l, l_next, mi)
{ {
tmp = l; e_object_del(E_OBJECT(mi));
l = l->next;
e_object_del(E_OBJECT(tmp->data));
} }
if (m->in_active_list) if (m->in_active_list)
{ {
@ -1370,6 +1362,7 @@ _e_menu_realize(E_Menu *m)
{ {
Evas_Object *o; Evas_Object *o;
Eina_List *l; Eina_List *l;
E_Menu_Item *mi;
int ok; int ok;
@ -1442,12 +1435,8 @@ _e_menu_realize(E_Menu *m)
e_box_homogenous_set(o, 0); e_box_homogenous_set(o, 0);
edje_object_part_swallow(m->bg_object, "e.swallow.content", m->container_object); edje_object_part_swallow(m->bg_object, "e.swallow.content", m->container_object);
EINA_LIST_FOREACH(m->items, l, mi)
for (l = m->items; l; l = l->next)
{ {
E_Menu_Item *mi;
mi = l->data;
_e_menu_item_realize(mi); _e_menu_item_realize(mi);
} }
@ -1462,6 +1451,7 @@ static void
_e_menu_items_layout_update(E_Menu *m) _e_menu_items_layout_update(E_Menu *m)
{ {
Eina_List *l; Eina_List *l;
E_Menu_Item *mi;
Evas_Coord bw, bh, mw, mh; Evas_Coord bw, bh, mw, mh;
int toggles_on = 0; int toggles_on = 0;
int icons_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; int min_w = 0, min_h = 0;
e_box_freeze(m->container_object); 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) icons_on = 1;
if (mi->icon_object) icons_on = 1; if (mi->icon_object) icons_on = 1;
if (mi->label) labels_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_w = min_toggle_w + min_submenu_w;
min_h = min_toggle_h; 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) if (mi->separator)
{ {
e_box_pack_options_set(mi->separator_object, e_box_pack_options_set(mi->separator_object,
@ -1685,19 +1668,16 @@ static void
_e_menu_unrealize(E_Menu *m) _e_menu_unrealize(E_Menu *m)
{ {
Eina_List *l; Eina_List *l;
E_Menu_Item *mi;
if (!m->realized) return; if (!m->realized) return;
evas_event_freeze(m->evas); evas_event_freeze(m->evas);
e_container_shape_hide(m->shape); e_container_shape_hide(m->shape);
e_object_del(E_OBJECT(m->shape)); e_object_del(E_OBJECT(m->shape));
m->shape = NULL; m->shape = NULL;
e_box_freeze(m->container_object); e_box_freeze(m->container_object);
EINA_LIST_FOREACH(m->items, l, mi)
for (l = m->items; l; l = l->next)
{ {
E_Menu_Item *mi;
mi = l->data;
_e_menu_item_unrealize(mi); _e_menu_item_unrealize(mi);
} }
if (m->header.icon) evas_object_del(m->header.icon); 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); cat = evas_hash_find(_e_menu_categories, m->category);
if (cat) 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); 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 static void
_e_menu_deactivate_all(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); e_menu_deactivate(m);
m->parent_item = NULL; m->parent_item = NULL;
e_object_unref(E_OBJECT(m)); e_object_unref(E_OBJECT(m));
@ -1807,20 +1779,14 @@ _e_menu_deactivate_all(void)
static void static void
_e_menu_deactivate_above(E_Menu *ma) _e_menu_deactivate_above(E_Menu *ma)
{ {
Eina_List *l, *tmp = NULL; Eina_List *tmp;
int above = 0; 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) if (above)
{ {
e_menu_deactivate(m); e_menu_deactivate(m);
@ -1868,7 +1834,8 @@ _e_menu_submenu_deactivate(E_Menu_Item *mi)
static void static void
_e_menu_reposition(E_Menu *m) _e_menu_reposition(E_Menu *m)
{ {
Eina_List *l, *tmp = NULL; Eina_List *l, *tmp;
E_Menu_Item *mi;
int parent_item_bottom; int parent_item_bottom;
if (!m->parent_item) return; if (!m->parent_item) return;
@ -1897,23 +1864,14 @@ _e_menu_reposition(E_Menu *m)
} }
/* FIXME: this will suck for big menus */ /* 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); if ((mi->active) && (mi->submenu)) _e_menu_reposition(mi->submenu);
} }
while (tmp)
{ _e_menu_list_free_unref(tmp);
e_object_unref(E_OBJECT(tmp->data));
tmp = eina_list_remove_list(tmp, tmp);
}
} }
static int static int
@ -2084,9 +2042,9 @@ _e_menu_item_activate_nth(int n)
if (!mi) return; if (!mi) return;
} }
m = mi->menu; 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 (!mi->separator) i++;
if (i == n) break; if (i == n) break;
} }
@ -2265,11 +2223,9 @@ _e_menu_activate_nth(int n)
if (!mi) return; if (!mi) return;
} }
m = mi->menu; 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 (!mi->separator) i++;
if (i == n) if (i == n)
{ {
@ -2307,17 +2263,15 @@ static int
_e_menu_outside_bounds_get(int xdir, int ydir) _e_menu_outside_bounds_get(int xdir, int ydir)
{ {
Eina_List *l; Eina_List *l;
E_Menu *m;
int outl = 0; int outl = 0;
int outr = 0; int outr = 0;
int outt = 0; int outt = 0;
int outb = 0; int outb = 0;
int i; 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) if (m->cur.x < m->zone->x + e_config->menu_autoscroll_margin)
{ {
i = m->zone->x - m->cur.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) _e_menu_scroll_by(int dx, int dy)
{ {
Eina_List *l; Eina_List *l;
E_Menu *m;
for (l = _e_active_menus; l; l = l->next)
EINA_LIST_FOREACH(_e_active_menus, l, m)
{ {
E_Menu *m;
m = l->data;
m->cur.x += dx; m->cur.x += dx;
m->cur.y += dy; m->cur.y += dy;
} }
@ -2711,7 +2663,8 @@ static int
_e_menu_cb_mouse_move(void *data, int type, void *event) _e_menu_cb_mouse_move(void *data, int type, void *event)
{ {
Ecore_Event_Mouse_Move *ev; Ecore_Event_Mouse_Move *ev;
Eina_List *l, *tmp = NULL; Eina_List *l, *tmp;
E_Menu *m;
int dx, dy, d; int dx, dy, d;
double dt; double dt;
double fast_move_threshold; 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))) if ((dt > 0.0) && ((d / dt) >= (fast_move_threshold * fast_move_threshold)))
is_fast = 1; 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 ((m->realized) && (m->cur.visible))
{ {
if (is_fast) if (is_fast)
@ -2761,12 +2708,9 @@ _e_menu_cb_mouse_move(void *data, int type, void *event)
NULL); NULL);
} }
} }
while (tmp)
{ _e_menu_list_free_unref(tmp);
e_object_unref(E_OBJECT(tmp->data));
tmp = eina_list_remove_list(tmp, tmp);
}
_e_menu_x = ev->x; _e_menu_x = ev->x;
_e_menu_y = ev->y; _e_menu_y = ev->y;
_e_menu_time = ev->timestamp; _e_menu_time = ev->timestamp;
@ -2853,13 +2797,11 @@ _e_menu_cb_window_shape(void *data, int ev_type, void *ev)
{ {
Eina_List *l; Eina_List *l;
Ecore_X_Event_Window_Shape *e; Ecore_X_Event_Window_Shape *e;
E_Menu *m;
e = ev; 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) if (m->evas_win == e->win)
m->need_shape_export = 1; m->need_shape_export = 1;
} }

View File

@ -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_new(E_Menu *m);
EAPI E_Menu_Item *e_menu_item_nth(E_Menu *m, int n); 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_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_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); EAPI void e_menu_item_label_set(E_Menu_Item *mi, const char *label);