removed e_menu_item_icon_object_set as it could have never worked properly.

now, the menu icon can be set properly upon realization with the e_menu_item_realize_callback_set function. rewrote the clients menu to use the border icon, and be sorted like the winselector.


SVN revision: 25026
This commit is contained in:
Viktor Kojouharov 2006-08-21 20:03:09 +00:00
parent de39c5f662
commit d0751b3258
3 changed files with 98 additions and 55 deletions

View File

@ -37,8 +37,10 @@ static void _e_int_menus_config_pre_cb (void *data, E_Menu *m);
static void _e_int_menus_config_free_hook (void *obj);
static void _e_int_menus_config_item_cb (void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_int_menus_clients_pre_cb (void *data, E_Menu *m);
static void _e_int_menus_clients_item_create (E_Border *bd, E_Menu *m);
static void _e_int_menus_clients_free_hook (void *obj);
static void _e_int_menus_clients_item_cb (void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_int_menus_clients_icon_cb (void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_int_menus_clients_cleanup_cb (void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_int_menus_desktops_pre_cb (void *data, E_Menu *m);
static void _e_int_menus_desktops_item_cb (void *data, E_Menu *m, E_Menu_Item *mi);
@ -685,21 +687,23 @@ static void
_e_int_menus_clients_pre_cb(void *data, E_Menu *m)
{
E_Menu_Item *mi;
Evas_List *l, *borders = NULL;
E_Menu *root;
Evas_List *l, *borders = NULL, *alt = NULL;
E_Zone *zone = NULL;
E_Desk *desk = NULL;
const char *s;
e_menu_pre_activate_callback_set(m, NULL, NULL);
root = e_menu_root_get(m);
/* get the current clients */
if (root)
zone = root->zone;
zone =
e_zone_current_get(e_container_current_get(e_manager_current_get()));
desk = e_desk_current_get(zone);
for (l = e_border_client_list(); l; l = l->next)
{
E_Border *border;
border = l->data;
if (border->client.netwm.state.skip_taskbar) continue;
if (border->user_skip_winlist) continue;
if ((border->zone == zone) || (border->iconic))
borders = evas_list_append(borders, border);
}
@ -714,31 +718,22 @@ _e_int_menus_clients_pre_cb(void *data, E_Menu *m)
for (l = borders; l; l = l->next)
{
E_Border *bd = l->data;
E_App *a;
const char *title;
title = e_border_name_get(bd);
mi = e_menu_item_new(m);
e_menu_item_check_set(mi, 1);
if ((title) && (title[0]))
e_menu_item_label_set(mi, title);
else
e_menu_item_label_set(mi, _("No name!!"));
/* ref the border as we implicitly unref it in the callback */
e_object_ref(E_OBJECT(bd));
// e_object_breadcrumb_add(E_OBJECT(bd), "clients_menu");
e_menu_item_callback_set(mi, _e_int_menus_clients_item_cb, bd);
if (!bd->iconic) e_menu_item_toggle_set(mi, 1);
a = bd->app;
if (a)
if (bd->desk != desk)
{
if (!((a->icon_class) &&
(e_util_menu_item_edje_icon_list_set(mi, a->icon_class))))
{
e_menu_item_icon_edje_set(mi, a->path, "icon");
if (a->icon_path) e_menu_item_icon_path_set(mi, a->icon_path);
}
alt = evas_list_append(alt, bd);
continue;
}
_e_int_menus_clients_item_create(bd, m);
}
mi = e_menu_item_new(m);
e_menu_item_separator_set(mi, 1);
for (l = alt; l; l = l->next)
{
E_Border *bd = l->data;
_e_int_menus_clients_item_create(bd, m);
}
mi = e_menu_item_new(m);
e_menu_item_separator_set(mi, 1);
@ -754,6 +749,27 @@ _e_int_menus_clients_pre_cb(void *data, E_Menu *m)
e_object_data_set(E_OBJECT(m), borders);
}
static void
_e_int_menus_clients_item_create(E_Border *bd, E_Menu *m)
{
E_Menu_Item *mi;
const char *title;
title = e_border_name_get(bd);
mi = e_menu_item_new(m);
e_menu_item_check_set(mi, 1);
if ((title) && (title[0]))
e_menu_item_label_set(mi, title);
else
e_menu_item_label_set(mi, _("No name!!"));
/* ref the border as we implicitly unref it in the callback */
e_object_ref(E_OBJECT(bd));
/* e_object_breadcrumb_add(E_OBJECT(bd), "clients_menu");*/
e_menu_item_callback_set(mi, _e_int_menus_clients_item_cb, bd);
e_menu_item_realize_callback_set(mi, _e_int_menus_clients_icon_cb, bd);
if (!bd->iconic) e_menu_item_toggle_set(mi, 1);
}
static void
_e_int_menus_clients_free_hook(void *obj)
{
@ -798,6 +814,21 @@ _e_int_menus_clients_item_cb(void *data, E_Menu *m, E_Menu_Item *mi)
}
}
static void
_e_int_menus_clients_icon_cb(void *data, E_Menu *m, E_Menu_Item *mi)
{
E_Border *bd;
Evas_Object *o;
bd = data;
E_OBJECT_CHECK(bd);
o = e_icon_add(m->evas);
e_icon_object_set(o, e_border_icon_add(bd, m->evas));
mi->icon_object = o;
}
static void
_e_int_menus_clients_cleanup_cb(void *data, E_Menu *m, E_Menu_Item *mi)
{

View File

@ -47,6 +47,7 @@ static void _e_menu_submenu_activate (E_Menu_Item *mi);
static void _e_menu_submenu_deactivate (E_Menu_Item *mi);
static void _e_menu_reposition (E_Menu *m);
static int _e_menu_active_call (void);
static int _e_menu_realize_call (E_Menu_Item *mi);
static void _e_menu_item_activate_next (void);
static void _e_menu_item_activate_previous (void);
static void _e_menu_item_activate_first (void);
@ -599,19 +600,6 @@ e_menu_item_icon_edje_set(E_Menu_Item *mi, const char *icon, const char *key)
mi->menu->changed = 1;
}
EAPI void
e_menu_item_icon_object_set(E_Menu_Item *mi, Evas_Object *obj)
{
E_OBJECT_CHECK(mi);
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
if (((mi->icon_object) && (obj) && (mi->icon_object == obj)) ||
((!mi->icon_object) && (!obj)))
return;
mi->icon_object = obj;
mi->changed = 1;
mi->menu->changed = 1;
}
EAPI void
e_menu_item_label_set(E_Menu_Item *mi, const char *label)
{
@ -761,6 +749,15 @@ e_menu_item_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m,
mi->cb.data = data;
}
EAPI void
e_menu_item_realize_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data)
{
E_OBJECT_CHECK(mi);
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
mi->realize_cb.func = func;
mi->realize_cb.data = data;
}
EAPI void
e_menu_item_submenu_pre_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data)
{
@ -1199,7 +1196,7 @@ _e_menu_item_realize(E_Menu_Item *mi)
evas_object_pass_events_set(o, 1);
e_box_pack_end(mi->container_object, o);
}
if (mi->icon || mi->icon_object)
if (mi->icon || mi->realize_cb.func)
{
int icon_w, icon_h;
@ -1213,17 +1210,7 @@ _e_menu_item_realize(E_Menu_Item *mi)
else
evas_object_del(o);
/* FIXME: This should be cleaned up a bit. */
if (mi->icon_object)
{
o = e_icon_add(mi->menu->evas);
e_icon_object_set(o, mi->icon_object);
e_icon_fill_inside_set(o, 1);
e_icon_size_get(o, &icon_w, &icon_h);
mi->icon_object = o;
}
else if (mi->icon)
if (mi->icon)
{
/* Try a the usual suspects first. */
if (!mi->icon_key)
@ -1259,6 +1246,12 @@ _e_menu_item_realize(E_Menu_Item *mi)
e_icon_size_get(mi->icon_object, &icon_w, &icon_h);
}
}
if (_e_menu_realize_call(mi))
{
o = mi->icon_object;
e_icon_fill_inside_set(o, 1);
e_icon_size_get(o, &icon_w, &icon_h);
}
evas_object_pass_events_set(o, 1);
evas_object_show(o);
@ -1896,6 +1889,20 @@ _e_menu_active_call(void)
return -1;
}
static int
_e_menu_realize_call(E_Menu_Item *mi)
{
if (mi)
{
if (mi->realize_cb.func)
{
mi->realize_cb.func(mi->realize_cb.data, mi->menu, mi);
return 1;
}
}
return 0;
}
static void
_e_menu_item_activate_next(void)
{

View File

@ -113,7 +113,12 @@ struct _E_Menu_Item
struct {
void *data;
void (*func) (void *data, E_Menu *m, E_Menu_Item *mi);
} cb;
} cb; /* Callback for menu item activation */
struct {
void *data;
void (*func) (void *data, E_Menu *m, E_Menu_Item *mi);
} realize_cb; /* Callback for menu item icon realization */
struct {
void *data;
@ -173,7 +178,6 @@ EAPI int e_menu_item_num_get(E_Menu_Item *mi);
EAPI void e_menu_item_icon_path_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_object_set(E_Menu_Item *mi, Evas_Object *obj);
EAPI void e_menu_item_label_set(E_Menu_Item *mi, const char *label);
EAPI void e_menu_item_submenu_set(E_Menu_Item *mi, E_Menu *sub);
EAPI void e_menu_item_separator_set(E_Menu_Item *mi, int sep);
@ -183,6 +187,7 @@ EAPI void e_menu_item_radio_group_set(E_Menu_Item *mi, int radg);
EAPI void e_menu_item_toggle_set(E_Menu_Item *mi, int tog);
EAPI int e_menu_item_toggle_get(E_Menu_Item *mi);
EAPI void e_menu_item_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data);
EAPI void e_menu_item_realize_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data);
EAPI void e_menu_item_submenu_pre_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data);
EAPI void e_menu_item_submenu_post_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data);
EAPI void e_menu_item_active_set(E_Menu_Item *mi, int active);