removed e_menu_item_icon_object_set as it could have never worked properly.
authorViktor Kojouharov <vkojouharov@gmail.com>
Mon, 21 Aug 2006 20:03:09 +0000 (20:03 +0000)
committerViktor Kojouharov <vkojouharov@gmail.com>
Mon, 21 Aug 2006 20:03:09 +0000 (20:03 +0000)
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

src/bin/e_int_menus.c
src/bin/e_menu.c
src/bin/e_menu.h

index 6e6177c..d4f14db 100644 (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);
@@ -755,6 +750,27 @@ _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)
+{
+   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;
@@ -799,6 +815,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)
 {
    E_Zone *zone;
index c624250..a2b53b1 100644 (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)
 {
@@ -762,6 +750,15 @@ e_menu_item_callback_set(E_Menu_Item *mi,  void (*func) (void *data, E_Menu *m,
 }
 
 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);
@@ -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)
 {
index f28c740..92da0b1 100644 (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);