all repos — openbox @ 2e529e3ff3db902cdf0c7b1fbf796ea2372a299b

openbox fork - make it a bit more like ryudo

don't change clients' borders
Dana Jansens danakj@orodu.net
commit

2e529e3ff3db902cdf0c7b1fbf796ea2372a299b

parent

306ea13177064e0d7512c49b78c868c37f717e3e

5 files changed, 53 insertions(+), 108 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -67,7 +67,6 @@

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 @@

/* 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 @@ ob_debug("Positioned: %s @ %d %d\n",

(!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 @@ ob_debug("Sized: %s @ %d %d\n",

(!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 @@ those states

*/ client_configure(self, placex, placey, self->area.width, self->area.height, + self->border_width, FALSE, TRUE);

@@ -700,9 +697,6 @@

/* restore the window's original geometry so it is not lost */ { Rect a; - - /* give the client its border back */ - client_toggle_border(self, TRUE); a = self->area;

@@ -1037,71 +1031,6 @@

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 @@ /* 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)

@@ -2851,7 +2781,7 @@ g_assert(*h > 0);

} -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 @@ 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; + 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 @@ (resized && config_resize_redraw))));

/* 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 @@

/* 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 @@ event.xconfigure.x = self->root_pos.x;

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 @@ /* 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); + XMoveResizeWindow(ob_display, self->window, + -self->border_width, -self->border_width, + w, h); } XFlush(ob_display);
M openbox/client.hopenbox/client.h

@@ -386,11 +386,13 @@ gint *x, gint *y,

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 @@ only.

@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);
M openbox/event.copenbox/event.c

@@ -536,7 +536,6 @@ client_calc_layer(client);

client_bring_helper_windows(client); } } else if (e->type == FocusOut) { - gboolean nomove = FALSE; XEvent ce; /* Look for the followup FocusIn */

@@ -995,26 +994,22 @@ do to the window).

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 @@ /* they still requested a move, so don't change whether a

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 @@ client->gravity);

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;
M openbox/frame.copenbox/frame.c

@@ -695,7 +695,9 @@ (!self->max_horz ? self->bwidth : 0) + self->cbwidth_x,

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 @@ send a mapnotify or we create race conditions.

*/ /* 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
M openbox/moveresize.copenbox/moveresize.c

@@ -297,7 +297,8 @@

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 @@ resist_move_monitors(moveresize_client, resist, &cur_x, &cur_y);

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 @@ }

#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 */