diff options
| -rw-r--r-- | openbox/client.c | 78 | ||||
| -rw-r--r-- | openbox/client.h | 11 | ||||
| -rw-r--r-- | openbox/event.c | 5 | ||||
| -rw-r--r-- | openbox/stacking.c | 19 | ||||
| -rw-r--r-- | render/render.c | 7 | ||||
| -rw-r--r-- | render/render.h | 3 |
6 files changed, 45 insertions, 78 deletions
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 <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; } 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*/ |
