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) */
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;
int x = self->area.x;
int y = self->area.y;
if (client_find_onscreen(self, &x, &y,
- self->area.width, self->area.height, rude)) {
+ self->frame->area.width,
+ self->frame->area.height, rude)) {
client_configure(self, OB_CORNER_TOPLEFT, x, y,
self->area.width, self->area.height,
TRUE, TRUE);
/* 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)
/* 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;
client_change_allowed_actions(self);
if (self->frame) {
- /* this makes sure that these windows appear on all desktops */
- if (self->type == OB_CLIENT_TYPE_DESKTOP &&
- self->desktop != DESKTOP_ALL)
- client_set_desktop(self, DESKTOP_ALL, FALSE);
-
- /* adjust the client's decorations, etc. */
+ if (self->decorations != self->frame->decorations)
+ /* adjust the client's decorations, etc. */
+ client_reconfigure(self);
+ /* we actually have to do this twice :P
+ the first time it removes the decorations, but now it may need to
+ be reconstrained for being maximized etc, so calling this again
+ will work with the new setup of decorations on the window */
client_reconfigure(self);
} else {
/* this makes sure that these windows appear on all desktops */
}
}
- /* 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
client_update_transient_for(self);
}
+ /* the WM_HINTS can contain an icon */
+ client_update_icons(self);
+
XFree(hints);
}
{
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)
{
gboolean moved = FALSE, resized = FALSE;
+ /* make the frame recalculate its dimentions n shit without changing
+ anything visible for real, this way the constraints below can work with
+ the updated frame dimensions. */
+ frame_adjust_area(self->frame, TRUE, TRUE, TRUE);
+
/* gets the frame's position */
frame_client_gravity(self->frame, &x, &y);
/* set the size and position if maximized */
if (self->max_horz) {
- x = a->x - self->frame->size.left;
- w = a->width;
+ x = a->x;
+ w = a->width - self->frame->size.left - self->frame->size.right;
}
if (self->max_vert) {
y = a->y;
/* for app-requested resizes, always resize if 'resized' is true.
for user-requested ones, only resize if final is true, or when
- resizing in opaque mode */
+ resizing in redraw mode */
if ((!user && resized) ||
- (user && (final || (resized && config_opaque_resize))))
+ (user && (final || (resized && config_redraw_resize))))
XResizeWindow(ob_display, self->window, w, h);
/* move/resize the frame to match the request */
moved = resized = TRUE;
if (moved || resized)
- frame_adjust_area(self->frame, moved, resized);
+ frame_adjust_area(self->frame, moved, resized, FALSE);
if (!resized && (force_reply || ((!user && moved) || (user && final))))
{
self->shaded = shade;
client_change_state(self);
/* resize the frame to just the titlebar */
- frame_adjust_area(self->frame, FALSE, FALSE);
+ frame_adjust_area(self->frame, FALSE, FALSE, FALSE);
}
void client_close(ObClient *self)