don't change clients' borders
This commit is contained in:
parent
306ea13177
commit
2e529e3ff3
5 changed files with 53 additions and 108 deletions
103
openbox/client.c
103
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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue