X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fclient.c;h=3f891b5a4712cd0a676fb0ab114da019d342c1e5;hb=0c8c23e8fdef2936d2ca425dcbf35e4eb7dd7edf;hp=39cd27dca466f420d2cd101306622f055d0a72fb;hpb=2e529e3ff3db902cdf0c7b1fbf796ea2372a299b;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 39cd27dc..3f891b5a 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -277,7 +277,7 @@ void client_manage(Window window) XFree(wmhint); } - ob_debug("Managing window: %lx\n", window); + ob_debug("Managing window: 0x%lx\n", window); /* choose the events we want to receive on the CLIENT window */ attrib_set.event_mask = CLIENT_EVENTMASK; @@ -400,15 +400,17 @@ void client_manage(Window window) 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. */ @@ -425,8 +427,7 @@ void client_manage(Window window) it is up to the placement routines to avoid the xinerama divides) */ transient || - (((self->positioned & PPosition) && - !(self->positioned & USPosition)) && + (!(self->positioned & USPosition) && client_normal(self) && !self->session)); } @@ -1108,8 +1109,8 @@ static void client_get_area(ObClient *self) POINT_SET(self->root_pos, wattrib.x, wattrib.y); self->border_width = wattrib.border_width; - ob_debug("client area: %d %d %d %d\n", wattrib.x, wattrib.y, - wattrib.width, wattrib.height); + ob_debug("client area: %d %d %d %d bw %d\n", wattrib.x, wattrib.y, + wattrib.width, wattrib.height, wattrib.border_width); } static void client_get_desktop(ObClient *self) @@ -1533,7 +1534,16 @@ void client_get_colormap(ObClient *self) void client_update_colormap(ObClient *self, Colormap colormap) { - self->colormap = colormap; + if (colormap == self->colormap) return; + + ob_debug("Setting client %s colormap: 0x%x\n", self->title, colormap); + + if (client_focused(self)) { + screen_install_colormap(self, FALSE); /* uninstall old one */ + self->colormap = colormap; + screen_install_colormap(self, FALSE); /* install new one */ + } else + self->colormap = colormap; } void client_update_normal_hints(ObClient *self) @@ -1800,9 +1810,6 @@ static void client_change_allowed_actions(ObClient *self) 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); @@ -2819,9 +2826,15 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b, /* 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); } @@ -2867,21 +2880,28 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b, 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); @@ -3452,8 +3472,8 @@ gboolean client_focus(ObClient *self) } ob_debug_type(OB_DEBUG_FOCUS, - "Focusing client \"%s\" at time %u\n", - self->title, event_curtime); + "Focusing client \"%s\" (0x%x) at time %u\n", + self->title, self->window, event_curtime); /* if there is a grab going on, then we need to cancel it. if we move focus during the grab, applications will get NotifyWhileGrabbed events @@ -3491,6 +3511,7 @@ gboolean client_focus(ObClient *self) xerror_set_ignore(FALSE); + ob_debug_type(OB_DEBUG_FOCUS, "Error focusing? %d\n", xerror_occured); return !xerror_occured; }