diff --git a/src/bin/e_config_dialog.c b/src/bin/e_config_dialog.c index 52f471605..c19a5c90a 100644 --- a/src/bin/e_config_dialog.c +++ b/src/bin/e_config_dialog.c @@ -91,10 +91,10 @@ e_config_dialog_find(const char *name, const char *class) { E_Zone *z; + z = e_util_zone_current_get(e_manager_current_get()); e_border_uniconify(cfd->dia->win->border); e_dialog_show(cfd->dia); e_win_raise(cfd->dia->win); - z = e_util_zone_current_get(e_manager_current_get()); if (z->container == cfd->dia->win->border->zone->container) e_border_desk_set(cfd->dia->win->border, e_desk_current_get(z)); else diff --git a/src/bin/e_menu.c b/src/bin/e_menu.c index ad7de329b..70126383c 100644 --- a/src/bin/e_menu.c +++ b/src/bin/e_menu.c @@ -53,6 +53,7 @@ static void _e_menu_item_activate_previous (void); static void _e_menu_item_activate_first (void); static void _e_menu_item_activate_last (void); static void _e_menu_item_activate_nth (int n); +static void _e_menu_item_activate_char (char * key_compose); static void _e_menu_activate_next (void); static void _e_menu_activate_previous (void); static void _e_menu_activate_first (void); @@ -60,6 +61,7 @@ static void _e_menu_activate_last (void); 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); @@ -536,6 +538,7 @@ e_menu_item_new(E_Menu *m) 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; } @@ -1941,118 +1944,68 @@ _e_menu_realize_call(E_Menu_Item *mi) 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 ((mi->separator) && (ll->prev)) - { - ll = ll->prev; - mi = ll->data; - } - } - e_menu_item_active_set(mi, 1); - _e_menu_item_ensure_onscreen(mi); - } - else - { - ll = evas_list_last(m->items); - mi = ll->data; - while ((mi->separator) && (ll->prev)) - { - ll = ll->prev; - 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(); } @@ -2132,6 +2085,75 @@ _e_menu_item_activate_nth(int n) _e_menu_item_ensure_onscreen(mi); } +static void +_e_menu_item_activate_char(char * key_compose) +{ + E_Menu *m; + E_Menu_Item *mi; + Evas_List *ll, *ll_orig; + + /* Ignore modifiers and such. */ + if (!key_compose) return; + + /* Check we've got a menu and it's active. */ + m = _e_menu_active_get(); + if (!m) + { + if (!_e_active_menus) return; + m = _e_active_menus->data; + if (!m) return; + } + + ll = _e_menu_list_item_active_get(); + /* If we don't have an active item, start from the top of the list. */ + if (!ll) + { + ll = m->items; + mi = ll->data; + /* Only check the current item if it wasn't active before. */ + if (!mi->separator && mi->label && !strncasecmp(key_compose, mi->label, strlen(key_compose))) + { + e_menu_item_active_set(mi, 1); + _e_menu_item_ensure_onscreen(mi); + return; + } + } + + ll_orig = ll; + + mi = ll->data; + if (!(ll->next)) + ll = mi->menu->items; + else + ll = ll->next; + mi = ll->data; + + /* While we don't have a label OR we don't match AND we haven't + * wrapped around */ + while ((!mi->label || strncasecmp(key_compose, mi->label, strlen(key_compose))) + && ll != ll_orig) + { + 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; + } + } + + e_menu_item_active_set(mi, 1); + _e_menu_item_ensure_onscreen(mi); + return; +} + static void _e_menu_activate_next(void) { @@ -2261,6 +2283,15 @@ _e_menu_item_active_get(void) return _e_active_menu_item; } +static Evas_List * +_e_menu_list_item_active_get(void) +{ + if (_e_active_menu_item) + return _e_active_menu_item->list_position; + else + return NULL; +} + static int _e_menu_outside_bounds_get(int xdir, int ydir) { @@ -2585,6 +2616,8 @@ _e_menu_cb_key_down(void *data, int type, void *event) _e_menu_item_activate_nth(8); else if ((!strcmp(ev->keysymbol, "0")) || (!strcmp(ev->keysymbol, "KP_0"))) _e_menu_item_activate_last(); + else if (ev->key_compose) + _e_menu_item_activate_char(ev->key_compose); return 1; } diff --git a/src/bin/e_menu.h b/src/bin/e_menu.h index ddf6d4032..9544c05a8 100644 --- a/src/bin/e_menu.h +++ b/src/bin/e_menu.h @@ -102,6 +102,8 @@ struct _E_Menu_Item Evas_Object *event_object; E_App *app; /* For when this item is used for an app. Experimental, if this makes it into cvs, kill onefang. */ + + Evas_List *list_position; int label_w, label_h; int icon_w, icon_h;