X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=c57c66e84571ec5e4ec90813ffb6e3a150722924;hb=4a2400c5c2f86cacbf907cfc13488cd212cc3d17;hp=0ee5043401f463974bc1b861619fbbc6cdc910fb;hpb=d7f3d16fb702aecb4ed3bf190204f43db0aac8f0;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 0ee50434..c57c66e8 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -237,9 +237,6 @@ void client_manage(Window window) client_get_all(self); client_restore_session_state(self); - /* set the desktop hint, to make sure that it always exists */ - PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop); - client_change_state(self); /* remove the client's border (and adjust re gravity) */ @@ -472,10 +469,13 @@ static void client_restore_session_state(ObClient *self) if (!(s)) return; RECT_SET(self->area, s->x, s->y, s->w, s->h); - XResizeWindow(ob_display, self->window, s->w, s->h); self->positioned = TRUE; + XResizeWindow(ob_display, self->window, s->w, s->h); + self->desktop = s->desktop == DESKTOP_ALL ? s->desktop : MIN(screen_num_desktops - 1, s->desktop); + PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop); + self->shaded = s->shaded; self->iconic = s->iconic; self->skip_pager = s->skip_pager; @@ -704,6 +704,10 @@ static void client_get_desktop(ObClient *self) /* defaults to the current desktop */ self->desktop = screen_desktop; } + if (self->desktop != d) { + /* set the desktop hint, to make sure that it always exists */ + PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop); + } } static void client_get_state(ObClient *self) @@ -953,10 +957,7 @@ void client_update_normal_hints(ObClient *self) /* get the hints from the window */ if (XGetWMNormalHints(ob_display, self->window, &size, &ret)) { - /* don't let apps tell me where to put transient windows, but only if - they have a valid parent */ - self->positioned = !!(size.flags & (PPosition|USPosition)) && - !self->transient_for; + self->positioned = !!(size.flags & (PPosition|USPosition)); if (size.flags & PWinGravity) { self->gravity = size.win_gravity; @@ -1241,9 +1242,6 @@ void client_update_wmhints(ObClient *self) } } - /* the WM_HINTS can contain an icon */ - client_update_icons(self); - /* 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 @@ -1251,6 +1249,9 @@ void client_update_wmhints(ObClient *self) client_update_transient_for(self); } + /* the WM_HINTS can contain an icon */ + client_update_icons(self); + XFree(hints); } @@ -1373,17 +1374,35 @@ void client_update_strut(ObClient *self) { guint num; guint32 *data; + gboolean got = FALSE; + + if (PROP_GETA32(self->window, net_wm_strut_partial, cardinal, + &data, &num)) { + if (num == 12) { + got = TRUE; + STRUT_PARTIAL_SET(self->strut, + data[0], data[2], data[1], data[3], + data[4], data[5], data[8], data[9], + data[6], data[7], data[10], data[11]); + } + g_free(data); + } - if (!PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) { - STRUT_SET(self->strut, 0, 0, 0, 0); - } else { - if (num == 4) - STRUT_SET(self->strut, data[0], data[2], data[1], data[3]); - else - STRUT_SET(self->strut, 0, 0, 0, 0); - g_free(data); + if (!got && + PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) { + if (num == 4) { + got = TRUE; + STRUT_PARTIAL_SET(self->strut, + data[0], data[2], data[1], data[3], + 0, 0, 0, 0, 0, 0, 0, 0); + } + g_free(data); } + if (!got) + STRUT_PARTIAL_SET(self->strut, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0); + /* updating here is pointless while we're being mapped cuz we're not in the client list yet */ if (self->frame)