summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/client.c78
-rw-r--r--openbox/client.h11
-rw-r--r--openbox/event.c5
-rw-r--r--openbox/stacking.c19
-rw-r--r--render/render.c7
-rw-r--r--render/render.h3
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*/