all repos — openbox @ 993fc6226d06f25513756251283e70054082ee8a

openbox fork - make it a bit more like ryudo

2 in 1 deal :\

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.
Dana Jansens danakj@orodu.net
commit

993fc6226d06f25513756251283e70054082ee8a

parent

3c7bf77dd9a14f93a63f9d790c1bdcf79b63eb39

6 files changed, 45 insertions(+), 78 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -14,6 +14,7 @@ #include "dispatch.h"

#include "openbox.h" #include "group.h" #include "config.h" +#include "render/render.h" #include <glib.h> #include <X11/Xutil.h>

@@ -94,7 +95,7 @@ GSList *it;

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 @@ client_update_title(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 @@ GSList *it;

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 @@

/* 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 @@

/* 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 @@ /* remove from the old group if there was one */

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

@@ -1149,23 +1148,6 @@ transient_for, and the transients lists of other windows in

the group may be affected */ 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 @@ g_assert(i <= num);

} 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 @@ } else {

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 @@ GSList *it;

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 @@ }

} 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; }
M openbox/client.hopenbox/client.h

@@ -15,8 +15,8 @@ #define TRAN_GROUP ((void*)~0l)

/*! 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 @@ /*! Icons for the client as specified on the client window */

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 @@ /*! Updates the strut for the client */

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).
M openbox/event.copenbox/event.c

@@ -895,10 +895,9 @@ client_setup_decor_and_functions(client);

} 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
M openbox/stacking.copenbox/stacking.c

@@ -120,13 +120,11 @@ return;

} 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 @@ return;

} 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 @@ } else {

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; } }
M render/render.crender/render.c

@@ -467,3 +467,10 @@ }

break; } } + +void render_pixmap_to_rgba(Pixmap pmap, Pixmap mask, + int *w, int *h, gulong **data) +{ + *w = *h = 0; + *data = NULL; +}
M render/render.hrender/render.h

@@ -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*/