From: Dana Jansens Date: Sun, 18 May 2003 17:09:55 +0000 (+0000) Subject: 2 in 1 deal :\ X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=993fc6226d06f25513756251283e70054082ee8a;p=chaz%2Fopenbox 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. --- diff --git a/openbox/client.c b/openbox/client.c index abc9a1e3..200131e7 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -14,6 +14,7 @@ #include "openbox.h" #include "group.h" #include "config.h" +#include "render/render.h" #include #include @@ -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; } diff --git a/openbox/client.h b/openbox/client.h index 08a3a887..7545b860 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -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). diff --git a/openbox/event.c b/openbox/event.c index a2604bcf..b0048e37 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -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 diff --git a/openbox/stacking.c b/openbox/stacking.c index eac4025c..e205d4b0 100644 --- a/openbox/stacking.c +++ b/openbox/stacking.c @@ -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; } } diff --git a/render/render.c b/render/render.c index 804e6c36..a1022bd0 100644 --- a/render/render.c +++ b/render/render.c @@ -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; +} diff --git a/render/render.h b/render/render.h index 006eaf4c..3fbf3249 100644 --- a/render/render.h +++ b/render/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*/