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);
_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);
}
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);
}
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)
{
E_Menu *m;
}
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)
{
E_Zone *zone;
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);
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)
{
}
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)
{
E_OBJECT_CHECK(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;
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)
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);
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)
{
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;
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);
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);