]> Dogcows Code - chaz/openbox/commitdiff
2 in 1 deal :\
authorDana Jansens <danakj@orodu.net>
Sun, 18 May 2003 17:09:55 +0000 (17:09 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 18 May 2003 17:09:55 +0000 (17:09 +0000)
client.c stacking.c: fixing looping transient case for group transient windows. now a window which is transient for a group is *not* transient for any other transient windows in the group (perviously the other window had to be transient for the group to be excluded, now it can be transient for anything).

client.c/h event.c render.c/h: adjustnig icon handling a bit. will be converting the legacy pixmap icons into rgba data so they can be handled the same as netwm icons.

openbox/client.c
openbox/client.h
openbox/event.c
openbox/stacking.c
render/render.c
render/render.h

index abc9a1e38778ef16631c00ca8c7c9408b036f949..200131e7400c94a77b231dacbff94ca57d4a373d 100644 (file)
@@ -14,6 +14,7 @@
 #include "openbox.h"
 #include "group.h"
 #include "config.h"
+#include "render/render.h"
 
 #include <glib.h>
 #include <X11/Xutil.h>
@@ -94,7 +95,7 @@ void client_foreach_ancestor(Client *self, ClientForeachFunc func, void *data)
 
             for (it = self->group->members; it; it = it->next)
                 if (it->data != self &&
-                    ((Client*)it->data)->transient_for != TRAN_GROUP) {
+                    !((Client*)it->data)->transient_for) {
                     if (!func(it->data, data)) return;
                     client_foreach_ancestor(it->data, func, data);
                 }
@@ -555,7 +556,6 @@ static void client_get_all(Client *self)
     client_update_class(self);
     client_update_strut(self);
     client_update_icons(self);
-    client_update_kwm_icon(self);
 
     client_change_state(self);
 }
@@ -592,7 +592,7 @@ static void client_get_desktop(Client *self)
 
                 for (it = self->group->members; it; it = it->next)
                     if (it->data != self &&
-                        ((Client*)it->data)->transient_for != TRAN_GROUP) {
+                        !((Client*)it->data)->transient_for) {
                         self->desktop = ((Client*)it->data)->desktop;
                         trdesk = TRUE;
                         break;
@@ -700,7 +700,7 @@ void client_update_transient_for(Client *self)
            /* remove from old parents */
             for (it = self->group->members; it; it = it->next)
                 if (it->data != self &&
-                    (((Client*)it->data)->transient_for != TRAN_GROUP))
+                    !((Client*)it->data)->transient_for)
                     ((Client*)it->data)->transients =
                         g_slist_remove(((Client*)it->data)->transients, self);
         } else if (self->transient_for != NULL) { /* transient of window */
@@ -715,7 +715,7 @@ void client_update_transient_for(Client *self)
            /* add to new parents */
             for (it = self->group->members; it; it = it->next)
                 if (it->data != self &&
-                    (((Client*)it->data)->transient_for != TRAN_GROUP))
+                    !((Client*)it->data)->transient_for)
                     ((Client*)it->data)->transients =
                         g_slist_append(((Client*)it->data)->transients, self);
 
@@ -1123,15 +1123,14 @@ void client_update_wmhints(Client *self)
             if (self->group != NULL) {
                 /* remove transients of the group */
                 for (it = self->group->members; it; it = it->next)
-                    if (it->data != self &&
-                        ((Client*)it->data)->transient_for == TRAN_GROUP) {
-                        self->transients = g_slist_remove(self->transients,
-                                                          it->data);
-                    }
+                    self->transients = g_slist_remove(self->transients,
+                                                      it->data);
                 group_remove(self->group, self);
                 self->group = NULL;
             }
-            if (hints->window_group != None) {
+            /* i can only have transients from the group if i am not transient
+               myself */
+            if (hints->window_group != None && !self->transient_for) {
                 self->group = group_add(hints->window_group, self);
 
                 /* add other transients of the group that are already
@@ -1150,23 +1149,6 @@ void client_update_wmhints(Client *self)
             client_update_transient_for(self);
         }
 
-        client_update_kwm_icon(self);
-        /* try get the kwm icon first, this is a fallback only */
-        if (self->pixmap_icon == None) {
-            if (hints->flags & IconPixmapHint) {
-                if (self->pixmap_icon == None) {
-                    self->pixmap_icon = hints->icon_pixmap;
-                    if (hints->flags & IconMaskHint)
-                        self->pixmap_icon_mask = hints->icon_mask;
-                    else
-                        self->pixmap_icon_mask = None;
-
-                    if (self->frame)
-                        frame_adjust_icon(self->frame);
-                }
-            }
-       }
-
        XFree(hints);
     }
 
@@ -1344,27 +1326,20 @@ void client_update_icons(Client *self)
        }
 
        g_free(data);
-    }
-
-    if (self->frame)
-       frame_adjust_icon(self->frame);
-}
-
-void client_update_kwm_icon(Client *self)
-{
-    guint num;
-    guint32 *data;
-
-    if (!PROP_GETA32(self->window, kwm_win_icon, kwm_win_icon, &data, &num)) {
-       self->pixmap_icon = self->pixmap_icon_mask = None;
-    } else {
+    } else if (PROP_GETA32(self->window, kwm_win_icon,
+                           kwm_win_icon, &data, &num)) {
         if (num == 2) {
-            self->pixmap_icon = data[0];
-            self->pixmap_icon_mask = data[1];
-        } else
-            self->pixmap_icon = self->pixmap_icon_mask = None;
-       g_free(data);
+            self->nicons++;
+            self->icons = g_new(Icon, self->nicons);
+            /* XXX WHAT IF THIS FAILS YOU TWIT!@!*()@ */
+            render_pixmap_to_rgba(data[0], data[1],
+                                  &self->icons[self->nicons-1].width,
+                                  &self->icons[self->nicons-1].height,
+                                  &self->icons[self->nicons-1].data);
+        }
+        g_free(data);
     }
+
     if (self->frame)
        frame_adjust_icon(self->frame);
 }
@@ -1429,7 +1404,7 @@ Client *client_search_focus_tree_full(Client *self)
             GSList *it;
         
             for (it = self->group->members; it; it = it->next)
-                if (((Client*)it->data)->transient_for != TRAN_GROUP) {
+                if (!((Client*)it->data)->transient_for) {
                     Client *c;
                     if ((c = client_search_focus_tree_full(it->data)))
                         return c;
@@ -1496,7 +1471,7 @@ void client_calc_layer(Client *self)
 
             for (it = self->group->members; it; it = it->next)
                 if (it->data != self &&
-                    ((Client*)it->data)->transient_for != TRAN_GROUP) {
+                    !((Client*)it->data)->transient_for) {
                     self = it->data;
                     break;
                 }
@@ -1794,13 +1769,10 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
         } else {
             GSList *it;
 
-            /* the check for TRAN_GROUP is to prevent an infinate loop with
-               2 transients of the same group at the head of the group's
-               members list */
             for (it = self->group->members; it; it = it->next) {
                 Client *c = it->data;
                 if (c != self && c->iconic != iconic &&
-                    c->transient_for != TRAN_GROUP) {
+                    !c->transient_for) {
                     client_iconify(it->data, iconic, curdesk);
                     break;
                 }
index 08a3a887361d4fe6bbb4201b395acd7a86acdbc8..7545b8600f3d212e79f6578f68d5ab4e598e59ee 100644 (file)
@@ -15,8 +15,8 @@ struct Group;
 
 /*! Holds an icon in ARGB format */
 typedef struct Icon {
-    unsigned long width, height;
-    unsigned long *data;
+    int width, height;
+    gulong *data;
 } Icon;
      
 /*! The MWM Hints as retrieved from the window property
@@ -286,11 +286,6 @@ typedef struct Client {
     Icon *icons;
     /*! The number of icons in icons */
     int nicons;
-
-    /*! The icon for the client specified in the WMHints or the KWM hints */
-    Pixmap pixmap_icon;
-    /*! The mask for the pixmap_icon, or None if its not masked */
-    Pixmap pixmap_icon_mask;
 } Client;
 
 extern GList *client_list;
@@ -457,8 +452,6 @@ void client_update_class(Client *self);
 void client_update_strut(Client *self);
 /*! Updates the window's icons */
 void client_update_icons(Client *self);
-/*! Updates the window's kwm icon */
-void client_update_kwm_icon(Client *self);
 
 /*! Set up what decor should be shown on the window and what functions should
   be allowed (Client::decorations and Client::functions).
index a2604bcfb58c10e5b6164cd0bcd9d60ae7f9b329..b0048e3725c158c4eac5296394f9083b735fbfef 100644 (file)
@@ -895,10 +895,9 @@ static void event_handle_client(Client *client, XEvent *e)
        }
        else if (msgtype == prop_atoms.net_wm_strut)
            client_update_strut(client);
-       else if (msgtype == prop_atoms.net_wm_icon)
+       else if (msgtype == prop_atoms.net_wm_icon ||
+                 msgtype == prop_atoms.kwm_win_icon)
            client_update_icons(client);
-       else if (msgtype == prop_atoms.kwm_win_icon)
-           client_update_kwm_icon(client);
     default:
         ;
 #ifdef SHAPE
index eac4025cfb9b089b24cddc574fa28729a84add78..e205d4b05b952032ef0dc65f4a7a6c801164fc19 100644 (file)
@@ -120,13 +120,11 @@ void stacking_raise(ObWindow *window)
             } else {
                 GSList *it;
 
-                /* the check for TRAN_GROUP is to prevent an infinate loop with
-                   2 transients of the same group at the head of the group's
-                   members list */
                 for (it = client->group->members; it; it = it->next) {
                     Client *c = it->data;
 
-                    if (c != client && c->transient_for != TRAN_GROUP)
+                    /* checking transient_for prevents infinate loops! */
+                    if (c != client && !c->transient_for)
                         stacking_raise(it->data);
                 }
                 if (it == NULL) return;
@@ -183,13 +181,11 @@ void stacking_lower(ObWindow *window)
             } else {
                 GSList *it;
 
-                /* the check for TRAN_GROUP is to prevent an infinate loop with
-                   2 transients of the same group at the head of the group's
-                   members list */
                 for (it = client->group->members; it; it = it->next) {
                     Client *c = it->data;
 
-                    if (c != client && c->transient_for != TRAN_GROUP)
+                    /* checking transient_for prevents infinate loops! */
+                    if (c != client && !c->transient_for)
                         stacking_lower(it->data);
                 }
                 if (it == NULL) return;
@@ -228,15 +224,12 @@ void stacking_add_nonintrusive(ObWindow *win)
                 GSList *sit;
                 GList *it;
 
-                /* the check for TRAN_GROUP is to prevent an infinate loop with
-                   2 transients of the same group at the head of the group's
-                   members list */
                 for (it = stacking_list; !parent && it; it = it->next) {
                     for (sit = client->group->members; !parent && sit;
                          sit = sit->next) {
                         Client *c = sit->data;
-                        if (sit->data == it->data &&
-                            c->transient_for != TRAN_GROUP)
+                        /* checking transient_for prevents infinate loops! */
+                        if (sit->data == it->data && !c->transient_for)
                             parent = it->data;
                     }
                 }
index 804e6c36f4891d8ed578f0f9283c8127c5124f98..a1022bd0594fddaec218b7d3accbd0dcf8acc383 100644 (file)
@@ -467,3 +467,10 @@ void appearance_minsize(Appearance *l, int *w, int *h)
         break;
     }
 }
+
+void render_pixmap_to_rgba(Pixmap pmap, Pixmap mask,
+                           int *w, int *h, gulong **data)
+{
+    *w = *h = 0;
+    *data = NULL;
+}
index 006eaf4cdf44db2f410c7db6f537877b00b93a95..3fbf324958df65d20cbf6ccdfba5883f7ce3dbb8 100644 (file)
@@ -159,4 +159,7 @@ void pixel32_to_pixmap(pixel32 *in, Pixmap out, int x, int y, int w, int h);
 
 void appearance_minsize(Appearance *l, int *w, int *h);
 
+void render_pixmap_to_rgba(Pixmap pmap, Pixmap mask,
+                           int *w, int *h, gulong **data);
+
 #endif /*__render_h*/
This page took 0.038217 seconds and 4 git commands to generate.