Hello,

Presently in E you can set a global setting in the config panel that
specifies you prefer the NetwM icon on your borders, or the icon you
specified in your .desktop files.

This works well, however does not seem to suit certain applications such
as pidgin or gimp.  These do not work too well (for me) because they
have multiple windows, some of which I prefer the NetWM icon and some of
which I prefer my .desktop icon.

As a result I have created a patch to override the global setting on a
border by border basis (And allow it to be remembered).

If you apply the patch and right click on the border you will notice the
"Border" menu now has a submenu.  In there you will find the options to
override the default behavior.  Additionally, if you wish the behavior
to be remembered, use the "Remember" menu and select the "Icon
Preference" as the thing to remember.

Attached is said patch.  Wanted to bounce it off the ML for thoughts and
opinions.  If there are no objections, I'll commit it in the next few days.

-- 
Regards,
Ravenlock

Index: e17/apps/e/src/bin/e_border.c
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_border.c,v
retrieving revision 1.594
diff -u -r1.594 e_border.c
--- e17/apps/e/src/bin/e_border.c       10 Jun 2007 04:39:51 -0000      1.594
+++ e17/apps/e/src/bin/e_border.c       1 Jul 2007 13:01:56 -0000
@@ -2614,7 +2614,7 @@
          }
        return o;
      }
-   if (e_config->use_app_icon)
+   if (e_config->use_app_icon && bd->icon_preference != E_ICON_PREF_USER)
      {
        if (bd->client.netwm.icons)
          {
@@ -2628,10 +2628,11 @@
      }
    if (!o)
      {
-       if (bd->desktop)
+       if (bd->desktop && bd->icon_preference != E_ICON_PREF_NETWM)
          {
             o = e_util_desktop_icon_add(bd->desktop, "24x24", evas);
-            return o;
+            if (o)
+              return o;
          }
        else if (bd->client.netwm.icons)
          {
@@ -5629,6 +5630,8 @@
               }
             if (rem->apply & E_REMEMBER_APPLY_SKIP_WINLIST)
               bd->user_skip_winlist = rem->prop.skip_winlist;
+            if (rem->apply & E_REMEMBER_APPLY_ICON_PREF)
+              bd->icon_preference = rem->prop.icon_preference;
          }
      }
    
Index: e17/apps/e/src/bin/e_border.h
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_border.h,v
retrieving revision 1.160
diff -u -r1.160 e_border.h
--- e17/apps/e/src/bin/e_border.h       10 Jun 2007 04:21:05 -0000      1.160
+++ e17/apps/e/src/bin/e_border.h       1 Jul 2007 13:01:57 -0000
@@ -3,6 +3,13 @@
  */
 #ifdef E_TYPEDEFS
 
+typedef enum _E_Icon_Preferece
+{
+   E_ICON_PREF_E_DEFAULT,
+   E_ICON_PREF_NETWM,
+   E_ICON_PREF_USER
+} E_Icon_Preference;
+
 typedef enum _E_Direction
 {
    E_DIRECTION_UP,
@@ -384,7 +391,8 @@
    double          ping;
  
    unsigned char   changed : 1;
-   
+  
+   unsigned char   icon_preference; 
    unsigned char   ignore_first_unmap;
    unsigned char   resize_mode;
    
Index: e17/apps/e/src/bin/e_config.c
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_config.c,v
retrieving revision 1.246
diff -u -r1.246 e_config.c
--- e17/apps/e/src/bin/e_config.c       12 Jun 2007 19:00:15 -0000      1.246
+++ e17/apps/e/src/bin/e_config.c       1 Jul 2007 13:01:58 -0000
@@ -303,6 +303,7 @@
    E_CONFIG_VAL(D, T, prop.zone, INT);
    E_CONFIG_VAL(D, T, prop.head, INT);
    E_CONFIG_VAL(D, T, prop.command, STR);
+   E_CONFIG_VAL(D, T, prop.icon_preference, UCHAR);
    
    _e_config_color_class_edd = E_CONFIG_DD_NEW("E_Color_Class", E_Color_Class);
 #undef T
Index: e17/apps/e/src/bin/e_int_border_menu.c
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_int_border_menu.c,v
retrieving revision 1.64
diff -u -r1.64 e_int_border_menu.c
--- e17/apps/e/src/bin/e_int_border_menu.c      18 Jun 2007 18:46:33 -0000      
1.64
+++ e17/apps/e/src/bin/e_int_border_menu.c      1 Jul 2007 13:01:59 -0000
@@ -35,6 +35,10 @@
 static void _e_border_menu_cb_fav_add(void *data, E_Menu *m, E_Menu_Item *mi);
 static void _e_border_menu_cb_ibar_add_pre(void *data, E_Menu *m, E_Menu_Item 
*mi);
 static void _e_border_menu_cb_ibar_add(void *data, E_Menu *m, E_Menu_Item *mi);
+static void _e_border_menu_cb_border_pre(void *data, E_Menu *m, E_Menu_Item 
*mi);
+static void _e_border_menu_cb_iconpref_e(void *data, E_Menu *m, E_Menu_Item 
*mi);
+static void _e_border_menu_cb_iconpref_netwm(void *data, E_Menu *m, 
E_Menu_Item *mi);
+static void _e_border_menu_cb_iconpref_user(void *data, E_Menu *m, E_Menu_Item 
*mi);
 
 EAPI void
 e_int_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key, 
Ecore_X_Time timestamp)
@@ -162,16 +166,15 @@
                             e_theme_edje_file_get("base/theme/borders",
                                                   
"e/widgets/border/default/remember"),
                             "e/widgets/border/default/remember");
-   if (!bd->lock_border)
-     {
-       mi = e_menu_item_new(m);
-       e_menu_item_label_set(mi, _("Borders"));
-       e_menu_item_callback_set(mi, _e_border_menu_cb_border, bd);
-       e_menu_item_icon_edje_set(mi,
-                                 e_theme_edje_file_get("base/theme/borders",
-                                                       
"e/widgets/border/default/borderless"),
-                                 "e/widgets/border/default/borderless");
-     }
+
+   mi = e_menu_item_new(m);
+   e_menu_item_label_set(mi, _("Border"));
+   e_menu_item_submenu_pre_callback_set(mi, _e_border_menu_cb_border_pre, bd);
+   e_menu_item_icon_edje_set(mi,
+        e_theme_edje_file_get("base/theme/borders",
+           "e/widgets/border/default/borderless"),
+        "e/widgets/border/default/borderless");
+
 
    if (!bd->sticky)
      {
@@ -748,6 +751,96 @@
      {
        e_border_lower(bd);
      }   
+}
+
+static void
+_e_border_menu_cb_border_pre(void *data, E_Menu *m, E_Menu_Item *mi)
+{
+   E_Menu *subm;
+   E_Menu_Item *submi;
+   E_Border *bd;
+   Evas_Object *o;
+   Evas *evas;
+
+   bd = data;
+   if (!bd) return;
+
+   subm = e_menu_new();
+   e_object_data_set(E_OBJECT(subm), bd);
+   e_menu_item_submenu_set(mi, subm);
+
+   if (!bd->lock_border)
+     {
+       submi = e_menu_item_new(subm);
+       e_menu_item_label_set(submi, _("Select Border Style"));
+       e_menu_item_callback_set(submi, _e_border_menu_cb_border, bd);
+       e_menu_item_icon_edje_set(submi,
+                                 e_theme_edje_file_get("base/theme/borders",
+                                                       
"e/widgets/border/default/borderless"),
+                                 "e/widgets/border/default/borderless");
+     }
+
+   submi = e_menu_item_new(subm);
+   e_menu_item_label_set(submi, _("Use E17 Default Icon Preference"));
+   e_menu_item_radio_set(submi, 1);
+   e_menu_item_radio_group_set(submi, 2);
+   e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_E_DEFAULT 
? 1 : 0));
+   e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_e, bd);
+   
+   submi = e_menu_item_new(subm);
+   evas = submi->menu->evas;
+   e_menu_item_label_set(submi, _("Use Application Provided Icon "));
+   e_menu_item_radio_set(submi, 1);
+   e_menu_item_radio_group_set(submi, 2);
+   e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_NETWM ? 1 
: 0));
+   e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_netwm, bd);
+
+   submi = e_menu_item_new(subm);
+   e_menu_item_label_set(submi, _("Use User Defined Icon"));
+   e_menu_item_radio_set(submi, 1);
+   e_menu_item_radio_group_set(submi, 2);
+   e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_USER ? 1 
: 0));
+   e_util_desktop_menu_item_icon_add(bd->desktop, "16x16", submi);
+   e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_user, bd);
+}
+
+static void 
+_e_border_menu_cb_iconpref_e(void *data, E_Menu *m, E_Menu_Item *mi) 
+{
+   E_Border *bd;
+
+   bd = data;
+   if (!bd) return;
+
+   bd->icon_preference = E_ICON_PREF_E_DEFAULT;
+   bd->changes.icon = 1;
+   bd->changed = 1;
+}
+
+static void 
+_e_border_menu_cb_iconpref_user(void *data, E_Menu *m, E_Menu_Item *mi) 
+{
+   E_Border *bd;
+
+   bd = data;
+   if (!bd) return;
+
+   bd->icon_preference = E_ICON_PREF_USER;
+   bd->changes.icon = 1;
+   bd->changed = 1;
+}
+
+static void 
+_e_border_menu_cb_iconpref_netwm(void *data, E_Menu *m, E_Menu_Item *mi) 
+{
+   E_Border *bd;
+
+   bd = data;
+   if (!bd) return;
+
+   bd->icon_preference = E_ICON_PREF_NETWM;
+   bd->changes.icon = 1;
+   bd->changed = 1;
 }
 
 static void 
Index: e17/apps/e/src/bin/e_int_border_remember.c
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_int_border_remember.c,v
retrieving revision 1.15
diff -u -r1.15 e_int_border_remember.c
--- e17/apps/e/src/bin/e_int_border_remember.c  24 Apr 2007 13:28:25 -0000      
1.15
+++ e17/apps/e/src/bin/e_int_border_remember.c  1 Jul 2007 13:01:59 -0000
@@ -43,6 +43,7 @@
       int apply_zone;
       int apply_skip_winlist;
       int apply_run;
+      int apply_icon_pref;
    } remember;
 };
 
@@ -98,6 +99,7 @@
        if (cfdata->border->remember->apply & E_REMEMBER_APPLY_ZONE) 
cfdata->remember.apply_zone = 1;
        if (cfdata->border->remember->apply & E_REMEMBER_APPLY_SKIP_WINLIST) 
cfdata->remember.apply_skip_winlist = 1;
        if (cfdata->border->remember->apply & E_REMEMBER_APPLY_RUN) 
cfdata->remember.apply_run = 1;
+       if (cfdata->border->remember->apply & E_REMEMBER_APPLY_ICON_PREF) 
cfdata->remember.apply_icon_pref = 1;
      }
    if (!cfdata->border->remember) cfdata->mode = MODE_NOTHING;
    else if ((cfdata->remember.apply_pos) && (cfdata->remember.apply_size) && 
@@ -289,7 +291,7 @@
         (cfdata->remember.apply_border) || (cfdata->remember.apply_sticky) ||
         (cfdata->remember.apply_desktop) || (cfdata->remember.apply_shade) ||
         (cfdata->remember.apply_zone) || (cfdata->remember.apply_skip_winlist) 
||
-        (cfdata->remember.apply_run)))
+        (cfdata->remember.apply_run) || (cfdata->remember.apply_icon_pref)))
      {
        if (cfdata->border->remember)
          {
@@ -397,6 +399,7 @@
        if (cfdata->remember.apply_zone) cfdata->border->remember->apply |= 
E_REMEMBER_APPLY_ZONE;
        if (cfdata->remember.apply_skip_winlist) 
cfdata->border->remember->apply |= E_REMEMBER_APPLY_SKIP_WINLIST;
        if (cfdata->remember.apply_run) cfdata->border->remember->apply |= 
E_REMEMBER_APPLY_RUN;
+       if (cfdata->remember.apply_icon_pref) cfdata->border->remember->apply 
|= E_REMEMBER_APPLY_ICON_PREF;
        cfdata->border->remember->apply_first_only = 
cfdata->remember.apply_first_only;
        e_remember_update(cfdata->border->remember, cfdata->border);
      }
@@ -493,6 +496,8 @@
    e_widget_frametable_object_append(of, ob, 0, 3, 1, 1, 1, 1, 1, 1);
    ob = e_widget_check_add(evas, _("Border style"), 
&(cfdata->remember.apply_border));
    e_widget_frametable_object_append(of, ob, 0, 4, 1, 1, 1, 1, 1, 1);
+   ob = e_widget_check_add(evas, _("Icon Preference"), 
&(cfdata->remember.apply_icon_pref));
+   e_widget_frametable_object_append(of, ob, 0, 5, 1, 1, 1, 1, 1, 1);
    ob = e_widget_check_add(evas, _("Stickiness"), 
&(cfdata->remember.apply_sticky));
    e_widget_frametable_object_append(of, ob, 1, 0, 1, 1, 1, 1, 1, 1);
    ob = e_widget_check_add(evas, _("Virtual Desktop"), 
&(cfdata->remember.apply_desktop));
Index: e17/apps/e/src/bin/e_remember.c
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_remember.c,v
retrieving revision 1.23
diff -u -r1.23 e_remember.c
--- e17/apps/e/src/bin/e_remember.c     21 Feb 2007 00:24:53 -0000      1.23
+++ e17/apps/e/src/bin/e_remember.c     1 Jul 2007 13:02:00 -0000
@@ -288,7 +288,8 @@
      rem->prop.shaded = 50 + bd->shade.dir;
    
    rem->prop.skip_winlist = bd->user_skip_winlist;
-   
+   rem->prop.icon_preference = bd->icon_preference;
+
    e_desk_xy_get(bd->desk, &rem->prop.desk_x, &rem->prop.desk_y);
    
    rem->prop.zone = bd->zone->num;
Index: e17/apps/e/src/bin/e_remember.h
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_remember.h,v
retrieving revision 1.10
diff -u -r1.10 e_remember.h
--- e17/apps/e/src/bin/e_remember.h     4 Jan 2007 10:30:55 -0000       1.10
+++ e17/apps/e/src/bin/e_remember.h     1 Jul 2007 13:02:00 -0000
@@ -23,6 +23,7 @@
 #define E_REMEMBER_APPLY_ZONE (1 << 8)
 #define E_REMEMBER_APPLY_RUN (1 << 9)
 #define E_REMEMBER_APPLY_SKIP_WINLIST (1 << 10)
+#define E_REMEMBER_APPLY_ICON_PREF (1 << 11)
 
 #else
 #ifndef E_REMEMBER_H
@@ -79,6 +80,7 @@
        unsigned char sticky;
        unsigned char shaded;
        unsigned char skip_winlist;
+       unsigned char icon_preference;
       
        int           desk_x, desk_y;
        int           zone;

Attachment: signature.asc
Description: OpenPGP digital signature

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to