From 2e529e3ff3db902cdf0c7b1fbf796ea2372a299b Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 26 May 2007 22:55:13 +0000 Subject: [PATCH] don't change clients' borders --- openbox/client.c | 103 +++++++++---------------------------------- openbox/client.h | 10 +++-- openbox/event.c | 32 +++++++------- openbox/frame.c | 7 ++- openbox/moveresize.c | 9 ++-- 5 files changed, 53 insertions(+), 108 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 3c6aee45..39cd27dc 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,7 +373,7 @@ 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); @@ -385,7 +381,7 @@ void client_manage(Window window) (!self->sized ? "no" : (self->sized == PSize ? "program specified" : (self->sized == USSize ? "user specified" : - (self->sized == PSize | USSize ? + (self->sized == (PSize | USSize) ? "program + user specified" : "BADNESS !?")))), self->area.width, self->area.height); @@ -460,6 +456,7 @@ void client_manage(Window window) */ client_configure(self, placex, placey, self->area.width, self->area.height, + self->border_width, FALSE, TRUE); @@ -701,9 +698,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) @@ -1037,71 +1031,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 */ @@ -1875,7 +1804,8 @@ void client_reconfigure(ObClient *self) 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) @@ -2851,7 +2781,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; @@ -2872,11 +2802,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 @@ -2887,8 +2819,9 @@ 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)); + XMoveResizeWindow(ob_display, self->window, + -self->border_width, -self->border_width, + MAX(w, oldw), MAX(h, oldh)); /* resize the plate to show the client padding color underneath */ frame_adjust_client_area(self->frame); } @@ -2915,8 +2848,10 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, /* 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->frame->area.y + self->frame->size.top); + self->frame->area.x + self->frame->size.left - + self->border_width, + self->frame->area.y + self->frame->size.top - + self->border_width); event.type = ConfigureNotify; event.xconfigure.display = ob_display; @@ -2931,7 +2866,7 @@ 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.border_width = self->border_width; event.xconfigure.above = self->frame->plate; event.xconfigure.override_redirect = FALSE; XSendEvent(event.xconfigure.display, event.xconfigure.window, @@ -2944,7 +2879,9 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, frame_adjust_client_area(self->frame); if (send_resize_client) - XResizeWindow(ob_display, self->window, w, h); + XMoveResizeWindow(ob_display, self->window, + -self->border_width, -self->border_width, + w, h); } XFlush(ob_display); diff --git a/openbox/client.h b/openbox/client.h index e4831b95..755b973a 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -386,11 +386,13 @@ void client_convert_gravity_resize(ObClient *self, gint gravity, gint w, gint h); #define client_move(self, x, y) \ - client_configure(self, x, y, self->area.width, self->area.height, TRUE, TRUE) + client_configure(self, x, y, self->area.width, self->area.height, \ + self->border_width, TRUE, TRUE) #define client_resize(self, w, h) \ - client_configure(self, self->area.x, self->area.y, w, h, TRUE, TRUE) + client_configure(self, self->area.x, self->area.y, w, h, \ + self->border_width, TRUE, TRUE) #define client_move_resize(self, x, y, w, h) \ - client_configure(self, x, y, w, h, TRUE, TRUE) + client_configure(self, x, y, w, h, self->border_width, TRUE, TRUE) /*! Figure out where a window will end up and what size it will be if you told it to move/resize to these coordinates. @@ -431,7 +433,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h, @param force_reply Send a ConfigureNotify to the client regardless of if the position changed. */ -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); void client_reconfigure(ObClient *self); diff --git a/openbox/event.c b/openbox/event.c index e7ef27fb..e03c8203 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -536,7 +536,6 @@ static void event_process(const XEvent *ec, gpointer data) client_bring_helper_windows(client); } } else if (e->type == FocusOut) { - gboolean nomove = FALSE; XEvent ce; /* Look for the followup FocusIn */ @@ -995,26 +994,22 @@ static void event_handle_client(ObClient *client, XEvent *e) also you can't compress stacking events */ - gint x, y, w, h; + gint x, y, w, h, b; gboolean move = FALSE; gboolean resize = FALSE; + gboolean border = FALSE; /* get the current area */ RECT_TO_DIMS(client->area, x, y, w, h); + b = client->border_width; ob_debug("ConfigureRequest desktop %d wmstate %d visibile %d\n", screen_desktop, client->wmstate, client->frame->visible); if (e->xconfigurerequest.value_mask & CWBorderWidth) if (client->border_width != e->xconfigurerequest.border_width) { - client->border_width = e->xconfigurerequest.border_width; - - /* if the border width is changing then that is the same - as requesting a resize, but we don't actually change - the client's border, so it will change their root - coordiantes (since they include the border width) and - we need to a notify then */ - move = TRUE; + b = e->xconfigurerequest.border_width; + border = TRUE; } @@ -1114,17 +1109,21 @@ static void event_handle_client(ObClient *client, XEvent *e) notify is sent or not */ } - if (move || resize) { + if (move || resize || border) { gint lw,lh; - client_find_onscreen(client, &x, &y, w, h, FALSE); - client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE); + if (move || resize) { + client_find_onscreen(client, &x, &y, w, h, FALSE); + client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE); + } /* if they requested something that moves the window, or if the window is actually being changed then configure it and send a configure notify to them */ - if (move || !RECT_EQUAL_DIMS(client->area, x, y, w, h)) { + if (move || !RECT_EQUAL_DIMS(client->area, x, y, w, h) || + border) + { ob_debug("Doing configure\n"); - client_configure(client, x, y, w, h, FALSE, TRUE); + client_configure(client, x, y, w, h, b, FALSE, TRUE); } /* ignore enter events caused by these like ob actions do */ @@ -1329,7 +1328,8 @@ static void event_handle_client(ObClient *client, XEvent *e) client_find_onscreen(client, &x, &y, w, h, FALSE); - client_configure(client, x, y, w, h, FALSE, TRUE); + client_configure(client, x, y, w, h, client->border_width, + FALSE, TRUE); client->gravity = ograv; diff --git a/openbox/frame.c b/openbox/frame.c index f788255c..780bc23d 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -695,7 +695,9 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->cbwidth_y); /* when the client has StaticGravity, it likes to move around. */ - XMoveWindow(ob_display, self->client->window, 0, 0); + XMoveWindow(ob_display, self->client->window, + -self->client->border_width, + -self->client->border_width); } } @@ -848,7 +850,8 @@ void frame_grab_client(ObFrame *self) */ /* reparent the client to the frame */ - XReparentWindow(ob_display, self->client->window, self->plate, 0, 0); + XReparentWindow(ob_display, self->client->window, self->plate, + -self->client->border_width, -self->client->border_width); /* When reparenting the client window, it is usually not mapped yet, since diff --git a/openbox/moveresize.c b/openbox/moveresize.c index c55b88e1..8ef18a87 100644 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@ -297,7 +297,8 @@ void moveresize_end(gboolean cancel) get_resize_position(&x, &y, cancel); client_configure(moveresize_client, x, y, (cancel ? start_cw : cur_x), - (cancel ? start_ch : cur_y), TRUE, TRUE); + (cancel ? start_ch : cur_y), + moveresize_client->border_width, TRUE, TRUE); } moveresize_in_progress = FALSE; @@ -316,7 +317,8 @@ static void do_move(gboolean keyboard) client_configure(moveresize_client, cur_x, cur_y, moveresize_client->area.width, - moveresize_client->area.height, TRUE, FALSE); + moveresize_client->area.height, + moveresize_client->border_width, TRUE, FALSE); if (config_resize_popup_show == 2) /* == "Always" */ popup_coords(moveresize_client, "%d x %d", moveresize_client->frame->area.x, @@ -374,7 +376,8 @@ static void do_resize() #endif get_resize_position(&x, &y, FALSE); - client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE); + client_configure(moveresize_client, x, y, cur_x, cur_y, + moveresize_client->border_width, TRUE, FALSE); /* this would be better with a fixed width font ... XXX can do it better if there are 2 text boxes */ -- 2.39.2