X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=5a6f443ae82d3b157a136067044b74a6357653bd;hb=5074d902aa215a2a656980d31b19574a5db1f795;hp=48f5d2a9c86bf69ff5a866a45604ce6aad4b3e3c;hpb=56b01b73a808ccf51991a0aeb5362d5eb6bbfaaa;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 48f5d2a9..5a6f443a 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -349,15 +349,19 @@ void client_manage(Window window) client_search_focus_tree_full(self)) && /* this checks for focus=false for the window */ (!settings || settings->focus != 0) && - /* note the check against Type_Normal/Dialog, not client_normal(self), - which would also include other types. in this case we want more - strict rules for focus */ + /* note the check against type Normal/Dialog/Utility, + not client_normal(self), which would also include other types. + in this case we want more strict rules for focus */ (self->type == OB_CLIENT_TYPE_NORMAL || + self->type == OB_CLIENT_TYPE_UTILITY || self->type == OB_CLIENT_TYPE_DIALOG)) { activate = TRUE; } + /* remove the client's border */ + XSetWindowBorderWidth(ob_display, self->window, 0); + /* adjust the frame to the client's size before showing or placing the window */ frame_adjust_area(self->frame, FALSE, TRUE, FALSE); @@ -387,6 +391,8 @@ void client_manage(Window window) "program + user specified" : "BADNESS !?")))), placew, placeh); + /* splash screens are also returned as TRUE for transient, + and so will be forced on screen below */ transient = place_client(self, &placex, &placey, settings); /* make sure the window is visible. */ @@ -400,7 +406,11 @@ void client_manage(Window window) place.c or by the user are allowed partially off-screen and on xinerama divides (ie, it is up to the placement routines to avoid - the xinerama divides) */ + the xinerama divides) + + splash screens get "transient" set to TRUE by + the place_client call + */ transient || (!(self->positioned & USPosition) && client_normal(self) && @@ -411,7 +421,11 @@ void client_manage(Window window) the visible screen area on its monitor. Use basically the same rules for forcing the window on screen in the client_find_onscreen call. - do this after place_client, it chooses the monitor! */ + do this after place_client, it chooses the monitor! + + splash screens get "transient" set to TRUE by + the place_client call + */ if (transient || (!(self->sized & USSize) && client_normal(self) && @@ -426,12 +440,8 @@ void client_manage(Window window) /* fit the window inside the area */ if (placew > a.width || self->area.height > a.height) { - placew = MAX(MIN(MIN(self->area.width, a.width), - self->max_size.width), - self->min_size.width); - placeh = MAX(MIN(MIN(self->area.height, a.height), - self->max_size.height), - self->min_size.height); + placew = MIN(self->area.width, a.width); + placeh = MIN(self->area.height, a.height); ob_debug("setting window size to %dx%d\n", self->area.width, self->area.height); @@ -713,6 +723,9 @@ void client_unmanage(ObClient *self) self->functions = OB_CLIENT_FUNC_MOVE | OB_CLIENT_FUNC_RESIZE; self->decorations = 0; /* unmanaged windows have no decor */ + /* give the client its border back */ + XSetWindowBorderWidth(ob_display, self->window, self->border_width); + client_move_resize(self, a.x, a.y, a.width, a.height); } @@ -1810,7 +1823,7 @@ void client_reconfigure(ObClient *self) { client_configure(self, self->area.x, self->area.y, self->area.width, self->area.height, - self->border_width, FALSE, TRUE); + FALSE, TRUE); } void client_update_wmhints(ObClient *self) @@ -2568,7 +2581,7 @@ static void client_apply_startup_state(ObClient *self, do this before applying the states so they have the correct pre-max/pre-fullscreen values */ - client_configure(self, x, y, w, h, self->border_width, FALSE, TRUE); + client_configure(self, x, y, w, h, FALSE, TRUE); ob_debug("placed window 0x%x at %d, %d with size %d x %d\n", self->window, self->area.x, self->area.y, self->area.width, self->area.height); @@ -2818,7 +2831,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h, } -void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b, +void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gboolean user, gboolean final) { gint oldw, oldh; @@ -2838,14 +2851,12 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b, SIZE_SET(self->logical_size, logicalw, logicalh); /* figure out if we moved or resized or what */ - moved = x != self->area.x || y != self->area.y; - resized = w != self->area.width || h != self->area.height || - b != self->border_width; + moved = (x != self->area.x || y != self->area.y); + resized = (w != self->area.width || h != self->area.height); oldw = self->area.width; oldh = self->area.height; RECT_SET(self->area, x, y, w, h); - self->border_width = b; /* for app-requested resizes, always resize if 'resized' is true. for user-requested ones, only resize if final is true, or when @@ -2856,16 +2867,7 @@ 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)) { - XWindowChanges changes; - changes.x = self->frame->size.left - self->border_width; - changes.y = self->frame->size.top -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); - + XResizeWindow(ob_display, self->window, MAX(w, oldw), MAX(h, oldh)); frame_adjust_client_area(self->frame); } @@ -2916,20 +2918,14 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b, FALSE, StructureNotifyMask, &event); } - /* if the client is shrinking, then resize the frame before the client */ - if (send_resize_client && (w <= oldw && h <= oldh)) { - XWindowChanges changes; + /* if the client is shrinking, then resize the frame before the client. + both of these resize sections may run, because the top one only resizes + in the direction that is growing + */ + if (send_resize_client && (w <= oldw || h <= oldh)) { frame_adjust_client_area(self->frame); - - changes.x = self->frame->size.left - self->border_width; - changes.y = self->frame->size.top -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); + XResizeWindow(ob_display, self->window, w, h); } XFlush(ob_display);