X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fclient.c;h=17172dd99f37fb40b4597f24dad32ac4cbd9f0b2;hb=185d1337e553283530e23b1edff3bb709f04e9bb;hp=d1d235cee87c29dc0da5d6e5c87bf0c8806ce7a6;hpb=5898c685301cb10e9c7408f6ad019a5ae704e5ce;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index d1d235ce..17172dd9 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -518,14 +518,6 @@ static void client_get_all(Client *self) client_update_icons(self); client_update_kwm_icon(self); - /* this makes sure that these windows appear on all desktops */ - if (self->type == Type_Desktop) - self->desktop = DESKTOP_ALL; - - /* set the desktop hint, to make sure that it always exists, and to - reflect any changes we've made here */ - PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop); - client_change_state(self); } @@ -552,6 +544,9 @@ static void client_get_desktop(Client *self) } else { /* defaults to the current desktop */ self->desktop = screen_desktop; + + /* set the desktop hint, to make sure that it always exists */ + PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop); } } @@ -735,6 +730,10 @@ void client_get_type(Client *self) else self->type = Type_Normal; } + + /* this makes sure that these windows appear on all desktops */ + if (self->type == Type_Desktop) + self->desktop = DESKTOP_ALL; } void client_update_protocols(Client *self) @@ -1015,6 +1014,7 @@ void client_update_wmhints(Client *self) { XWMHints *hints; gboolean ur = FALSE; + GSList *it; /* assume a window takes input if it doesnt specify */ self->can_focus = TRUE; @@ -1033,35 +1033,57 @@ void client_update_wmhints(Client *self) ur = TRUE; if (!(hints->flags & WindowGroupHint)) - hints->window_group = None; /* no group */ + hints->window_group = None; + /* did the group state change? */ - if (hints->window_group != (self->group ? self->group->leader : None)){ + if (hints->window_group != + (self->group ? self->group->leader : None)) { /* remove from the old group if there was one */ - if (self->group != NULL) + 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); + } group_remove(self->group, self); - if (hints->window_group != None) + self->group = NULL; + } + if (hints->window_group != None) { self->group = group_add(hints->window_group, self); + /* add other transients of the group that are already + set up */ + for (it = self->group->members; it; it = it->next) + if (it->data != self && + ((Client*)it->data)->transient_for == TRAN_GROUP) + self->transients = g_slist_append(self->transients, + it->data); + } + /* because the self->transient flag wont change from this call, we don't need to update the window's type and such, only its - transient_for, and the transients lists of other windows in the - group may be affected */ + transient_for, and the transients lists of other windows in + the group may be affected */ client_update_transient_for(self); } - if (hints->flags & IconPixmapHint) { - client_update_kwm_icon(self); - /* try get the kwm icon first, this is a fallback only */ - 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); - } + 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);