X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=1683c6082d1bfff657322164df45dd68af9955ba;hb=2521fd24c59d1f526cb355952801c3afcf7b9e1f;hp=4a3e8c372510225b5835b51da31c59689c162c6a;hpb=e9ccc6a82ef3fbb42550b65ee155bf53ef694ec8;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 4a3e8c37..1683c608 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -67,7 +67,6 @@ GList *client_list = NULL; static GSList *client_destroy_notifies = NULL; static void client_get_all(ObClient *self, gboolean real); -static void client_toggle_border(ObClient *self, gboolean show); static void client_get_startup_id(ObClient *self); static void client_get_session_ids(ObClient *self); static void client_get_area(ObClient *self); @@ -324,9 +323,6 @@ void client_manage(Window window) /* now we have all of the window's information so we can set this up */ client_setup_decor_and_functions(self); - /* remove the client's border (and adjust re gravity) */ - client_toggle_border(self, FALSE); - { Time t = sn_app_started(self->startup_id, self->class); if (t) self->user_time = t; @@ -377,17 +373,25 @@ void client_manage(Window window) (!self->positioned ? "no" : (self->positioned == PPosition ? "program specified" : (self->positioned == USPosition ? "user specified" : - (self->positioned == PPosition | USPosition ? + (self->positioned == (PPosition | USPosition) ? "program + user specified" : "BADNESS !?")))), self->area.x, self->area.y); + ob_debug("Sized: %s @ %d %d\n", + (!self->sized ? "no" : + (self->sized == PSize ? "program specified" : + (self->sized == USSize ? "user specified" : + (self->sized == (PSize | USSize) ? + "program + user specified" : + "BADNESS !?")))), self->area.width, self->area.height); + transient = place_client(self, &placex, &placey, settings); /* if the window isn't user-positioned, then make it fit inside the visible screen area on its monitor. the monitor is chosen by place_client! */ - if (!(self->positioned & USPosition)) { + if (!(self->sized & USSize)) { /* make a copy to modify */ Rect a = *screen_area_monitor(self->desktop, client_monitor(self)); @@ -396,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. */ @@ -452,6 +458,7 @@ void client_manage(Window window) */ client_configure(self, placex, placey, self->area.width, self->area.height, + self->border_width, FALSE, TRUE); @@ -693,9 +700,6 @@ void client_unmanage(ObClient *self) { Rect a; - /* give the client its border back */ - client_toggle_border(self, TRUE); - a = self->area; if (self->fullscreen) @@ -867,6 +871,7 @@ static void client_restore_session_state(ObClient *self) RECT_SET_POINT(self->area, self->session->x, self->session->y); self->positioned = USPosition; + self->sized = USSize; if (self->session->w > 0) self->area.width = self->session->w; if (self->session->h > 0) @@ -1028,71 +1033,6 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h, return ox != *x || oy != *y; } -static void client_toggle_border(ObClient *self, gboolean show) -{ - /* adjust our idea of where the client is, based on its border. When the - border is removed, the client should now be considered to be in a - different position. - when re-adding the border to the client, the same operation needs to be - reversed. */ - gint oldx = self->area.x, oldy = self->area.y; - gint x = oldx, y = oldy; - switch(self->gravity) { - default: - case NorthWestGravity: - case WestGravity: - case SouthWestGravity: - break; - case NorthEastGravity: - case EastGravity: - case SouthEastGravity: - if (show) x -= self->border_width * 2; - else x += self->border_width * 2; - break; - case NorthGravity: - case SouthGravity: - case CenterGravity: - case ForgetGravity: - case StaticGravity: - if (show) x -= self->border_width; - else x += self->border_width; - break; - } - switch(self->gravity) { - default: - case NorthWestGravity: - case NorthGravity: - case NorthEastGravity: - break; - case SouthWestGravity: - case SouthGravity: - case SouthEastGravity: - if (show) y -= self->border_width * 2; - else y += self->border_width * 2; - break; - case WestGravity: - case EastGravity: - case CenterGravity: - case ForgetGravity: - case StaticGravity: - if (show) y -= self->border_width; - else y += self->border_width; - break; - } - self->area.x = x; - self->area.y = y; - - if (show) { - XSetWindowBorderWidth(ob_display, self->window, self->border_width); - - /* set border_width to 0 because there is no border to add into - calculations anymore */ - self->border_width = 0; - } else - XSetWindowBorderWidth(ob_display, self->window, 0); -} - - static void client_get_all(ObClient *self, gboolean real) { /* this is needed for the frame to set itself up */ @@ -1617,6 +1557,7 @@ void client_update_normal_hints(ObClient *self) if (!client_normal(self)) */ self->positioned = (size.flags & (PPosition|USPosition)); + self->sized = (size.flags & (PSize|USSize)); if (size.flags & PWinGravity) self->gravity = size.win_gravity; @@ -1861,11 +1802,9 @@ 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, FALSE, TRUE); + self->area.width, self->area.height, + self->border_width, FALSE, TRUE); } void client_update_wmhints(ObClient *self) @@ -2347,7 +2286,6 @@ static void client_change_wm_state(ObClient *self) state[0] = self->wmstate; state[1] = None; PROP_SETA32(self->window, wm_state, wm_state, state, 2); - ob_debug("setting wm_state %d\n", self->wmstate); } } @@ -2531,8 +2469,7 @@ gboolean client_hide(ObClient *self) actions should not rely on being able to move focus during an interactive grab. */ - if (keyboard_interactively_grabbed()) - keyboard_interactive_cancel(); + event_cancel_all_key_grabs(); } frame_hide(self->frame); @@ -2843,7 +2780,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, +void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b, gboolean user, gboolean final) { gint oldw, oldh; @@ -2864,11 +2801,13 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, /* 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; + resized = w != self->area.width || h != self->area.height || + b != self->border_width; 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 @@ -2879,8 +2818,15 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, /* if the client is enlarging, then resize the client before the frame */ if (send_resize_client && (w > oldw || h > oldh)) { - XResizeWindow(ob_display, self->window, - 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); } @@ -2904,6 +2850,8 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, { XEvent event; + /* we have reset the client to 0 border width, so don't include + it in these coords */ POINT_SET(self->root_pos, self->frame->area.x + self->frame->size.left - self->border_width, @@ -2923,20 +2871,29 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, event.xconfigure.y = self->root_pos.y; event.xconfigure.width = w; event.xconfigure.height = h; - event.xconfigure.border_width = 0; - event.xconfigure.above = self->frame->plate; + event.xconfigure.border_width = self->border_width; + 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) - XResizeWindow(ob_display, self->window, 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); @@ -3517,8 +3474,7 @@ gboolean client_focus(ObClient *self) actions should not rely on being able to move focus during an interactive grab. */ - if (keyboard_interactively_grabbed()) - keyboard_interactive_cancel(); + event_cancel_all_key_grabs(); xerror_set_ignore(TRUE); xerror_occured = FALSE;