forked from enlightenment/enlightenment
parent
8678ebe026
commit
7cdf9af46b
|
@ -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
|
||||
|
|
225
src/bin/e_menu.c
225
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue