Small change in the last patch I sent. To finalise this ongoing thread,
the e_menu_prev_next.patch and then menu_keys.patch, both of which are
attached.
metrics
Index: src/bin/e_menu.c
===
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_menu.c,v
retrieving revision 1.68
diff -u -r1.68 e_menu.c
--- src/bin/e_menu.c9 Sep 2006 07:00:14 - 1.68
+++ src/bin/e_menu.c27 Sep 2006 04:14:31 -
@@ -60,6 +60,7 @@
static void _e_menu_activate_nth (int n);
static E_Menu *_e_menu_active_get (void);
static E_Menu_Item *_e_menu_item_active_get (void);
+static Evas_List * _e_menu_list_item_active_get (void);
static int _e_menu_outside_bounds_get(int xdir, int ydir);
static void _e_menu_scroll_by (int dx, int dy);
static void _e_menu_mouse_autoscroll_check(void);
@@ -521,6 +522,7 @@
mi = E_OBJECT_ALLOC(E_Menu_Item, E_MENU_ITEM_TYPE, _e_menu_item_free);
mi-menu = m;
mi-menu-items = evas_list_append(mi-menu-items, mi);
+ mi-list_position = evas_list_last(mi-menu-items);
return mi;
}
@@ -1926,118 +1928,68 @@
static void
_e_menu_item_activate_next(void)
{
- E_Menu *m;
+ E_Menu_Item *mi;
+ Evas_List *ll;
- /* FIXME: inefficient. should track active item */
- m = _e_menu_active_get();
- if (m)
+ ll = _e_menu_list_item_active_get();
+ mi = _e_menu_item_active_get();
+ if (ll mi)
{
- Evas_List *ll;
-
- for (ll = m-items; ll; ll = ll-next)
- {
-E_Menu_Item *mi;
-
+ /* Look at the next item and then cycle until we're not on
+* a separator. */
+ if (!(ll-next))
+ ll = mi-menu-items;
+ else
+ ll = ll-next;
+ mi = ll-data;
+ while (mi-separator)
+ {
+if (!(ll-next))
+ ll = mi-menu-items;
+else
+ ll = ll-next;
mi = ll-data;
-if (mi-active)
- {
- if (ll-next)
- {
- ll = ll-next;
- mi = ll-data;
- while ((mi-separator) (ll-next))
-{
- ll = ll-next;
- mi = ll-data;
-}
- if ((mi-separator) (!ll-next))
-{
- ll = m-items;
- mi = ll-data;
- while ((mi-separator) (ll-next))
- {
-ll = ll-next;
-mi = ll-data;
- }
-}
- e_menu_item_active_set(mi, 1);
- _e_menu_item_ensure_onscreen(mi);
- }
- else
- {
- ll = m-items;
- mi = ll-data;
- while ((mi-separator) (ll-next))
-{
- ll = ll-next;
- mi = ll-data;
-}
- e_menu_item_active_set(mi, 1);
- _e_menu_item_ensure_onscreen(mi);
- }
- return;
- }
}
+
+ e_menu_item_active_set(mi, 1);
+ _e_menu_item_ensure_onscreen(mi);
+ return;
}
+
_e_menu_activate_first();
}
static void
_e_menu_item_activate_previous(void)
{
- E_Menu *m;
+ E_Menu_Item *mi;
+ Evas_List *ll;
- /* FIXME: inefficient. should track active item */
- m = _e_menu_active_get();
- if (m)
+ ll = _e_menu_list_item_active_get();
+ mi = _e_menu_item_active_get();
+ if (ll mi)
{
- Evas_List *ll;
-
- for (ll = m-items; ll; ll = ll-next)
- {
-E_Menu_Item *mi;
-
+ /* Look at the prev item and then cycle until we're not on
+* a separator. */
+ if (!(ll-prev))
+ ll = evas_list_last(ll);
+ else
+ ll = ll-prev;
+ mi = ll-data;
+ while (mi-separator)
+ {
+if (!(ll-prev))
+ ll = evas_list_last(ll);
+else
+ ll = ll-prev;
mi = ll-data;
-if (mi-active)
- {
- if (ll-prev)
- {
- ll = ll-prev;
- mi = ll-data;
- while ((mi-separator) (ll-prev))
-{
- ll = ll-prev;
- mi = ll-data;
-}
- if ((mi-separator) (!ll-prev))
-{
- ll = m-items;
- mi = ll-data;
- while