a.height -= self->frame->size.top + self->frame->size.bottom;
/* fit the window inside the area */
- self->area.width = MIN(self->area.width, a.width);
- self->area.height = MIN(self->area.height, a.height);
+ if (self->area.width > a.width || self->area.height > a.height) {
+ self->area.width = MIN(self->area.width, a.width);
+ self->area.height = MIN(self->area.height, a.height);
- ob_debug("setting window size to %dx%d\n",
- self->area.width, self->area.height);
+ ob_debug("setting window size to %dx%d\n",
+ self->area.width, self->area.height);
- /* adjust the frame to the client's new size */
- frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
- frame_adjust_client_area(self->frame);
+ /* adjust the frame to the client's new size */
+ frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
+ frame_adjust_client_area(self->frame);
+ }
}
/* make sure the window is visible. */
void client_reconfigure(ObClient *self)
{
- /* by making this pass FALSE for user, we avoid the emacs event storm where
- every configurenotify causes an update in its normal hints, i think this
- is generally what we want anyways... */
client_configure(self, self->area.x, self->area.y,
self->area.width, self->area.height,
self->border_width, FALSE, TRUE);
/* if the client is enlarging, then resize the client before the frame */
if (send_resize_client && (w > oldw || h > oldh)) {
- XMoveResizeWindow(ob_display, self->window,
- -self->border_width, -self->border_width,
- MAX(w, oldw), MAX(h, oldh));
+ XWindowChanges changes;
+ changes.x = -self->border_width;
+ changes.y = -self->border_width;
+ changes.width = MAX(w, oldw);
+ changes.height = MAX(h, oldh);
+ changes.border_width = self->border_width;
+ XConfigureWindow(ob_display, self->window,
+ CWX|CWY|CWWidth|CWHeight|CWBorderWidth,
+ &changes);
/* resize the plate to show the client padding color underneath */
frame_adjust_client_area(self->frame);
}
event.xconfigure.width = w;
event.xconfigure.height = h;
event.xconfigure.border_width = self->border_width;
- event.xconfigure.above = self->frame->plate;
+ event.xconfigure.above = None;
event.xconfigure.override_redirect = FALSE;
XSendEvent(event.xconfigure.display, event.xconfigure.window,
FALSE, StructureNotifyMask, &event);
}
/* if the client is shrinking, then resize the frame before the client */
- if (send_resize_client && (w <= oldw || h <= oldh)) {
+ if (send_resize_client && (w <= oldw && h <= oldh)) {
/* resize the plate to show the client padding color underneath */
frame_adjust_client_area(self->frame);
- if (send_resize_client)
- XMoveResizeWindow(ob_display, self->window,
- -self->border_width, -self->border_width,
- w, h);
+ if (send_resize_client) {
+ XWindowChanges changes;
+ changes.x = -self->border_width;
+ changes.y = -self->border_width;
+ changes.width = w;
+ changes.height = h;
+ changes.border_width = self->border_width;
+ XConfigureWindow(ob_display, self->window,
+ CWX|CWY|CWWidth|CWHeight|CWBorderWidth,
+ &changes);
+ }
}
XFlush(ob_display);