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 GSList *client_destroy_notifies = NULL;
|
||||||
|
|
||||||
static void client_get_all(ObClient *self, gboolean real);
|
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_startup_id(ObClient *self);
|
||||||
static void client_get_session_ids(ObClient *self);
|
static void client_get_session_ids(ObClient *self);
|
||||||
static void client_get_area(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 */
|
/* now we have all of the window's information so we can set this up */
|
||||||
client_setup_decor_and_functions(self);
|
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);
|
Time t = sn_app_started(self->startup_id, self->class);
|
||||||
if (t) self->user_time = t;
|
if (t) self->user_time = t;
|
||||||
|
@ -377,7 +373,7 @@ void client_manage(Window window)
|
||||||
(!self->positioned ? "no" :
|
(!self->positioned ? "no" :
|
||||||
(self->positioned == PPosition ? "program specified" :
|
(self->positioned == PPosition ? "program specified" :
|
||||||
(self->positioned == USPosition ? "user specified" :
|
(self->positioned == USPosition ? "user specified" :
|
||||||
(self->positioned == PPosition | USPosition ?
|
(self->positioned == (PPosition | USPosition) ?
|
||||||
"program + user specified" :
|
"program + user specified" :
|
||||||
"BADNESS !?")))), self->area.x, self->area.y);
|
"BADNESS !?")))), self->area.x, self->area.y);
|
||||||
|
|
||||||
|
@ -385,7 +381,7 @@ void client_manage(Window window)
|
||||||
(!self->sized ? "no" :
|
(!self->sized ? "no" :
|
||||||
(self->sized == PSize ? "program specified" :
|
(self->sized == PSize ? "program specified" :
|
||||||
(self->sized == USSize ? "user specified" :
|
(self->sized == USSize ? "user specified" :
|
||||||
(self->sized == PSize | USSize ?
|
(self->sized == (PSize | USSize) ?
|
||||||
"program + user specified" :
|
"program + user specified" :
|
||||||
"BADNESS !?")))), self->area.width, self->area.height);
|
"BADNESS !?")))), self->area.width, self->area.height);
|
||||||
|
|
||||||
|
@ -460,6 +456,7 @@ void client_manage(Window window)
|
||||||
*/
|
*/
|
||||||
client_configure(self, placex, placey,
|
client_configure(self, placex, placey,
|
||||||
self->area.width, self->area.height,
|
self->area.width, self->area.height,
|
||||||
|
self->border_width,
|
||||||
FALSE, TRUE);
|
FALSE, TRUE);
|
||||||
|
|
||||||
|
|
||||||
|
@ -701,9 +698,6 @@ void client_unmanage(ObClient *self)
|
||||||
{
|
{
|
||||||
Rect a;
|
Rect a;
|
||||||
|
|
||||||
/* give the client its border back */
|
|
||||||
client_toggle_border(self, TRUE);
|
|
||||||
|
|
||||||
a = self->area;
|
a = self->area;
|
||||||
|
|
||||||
if (self->fullscreen)
|
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;
|
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)
|
static void client_get_all(ObClient *self, gboolean real)
|
||||||
{
|
{
|
||||||
/* this is needed for the frame to set itself up */
|
/* 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
|
every configurenotify causes an update in its normal hints, i think this
|
||||||
is generally what we want anyways... */
|
is generally what we want anyways... */
|
||||||
client_configure(self, self->area.x, self->area.y,
|
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)
|
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)
|
gboolean user, gboolean final)
|
||||||
{
|
{
|
||||||
gint oldw, oldh;
|
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 */
|
/* figure out if we moved or resized or what */
|
||||||
moved = x != self->area.x || y != self->area.y;
|
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;
|
oldw = self->area.width;
|
||||||
oldh = self->area.height;
|
oldh = self->area.height;
|
||||||
RECT_SET(self->area, x, y, w, h);
|
RECT_SET(self->area, x, y, w, h);
|
||||||
|
self->border_width = b;
|
||||||
|
|
||||||
/* for app-requested resizes, always resize if 'resized' is true.
|
/* for app-requested resizes, always resize if 'resized' is true.
|
||||||
for user-requested ones, only resize if final is true, or when
|
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 the client is enlarging, then resize the client before the frame */
|
||||||
if (send_resize_client && (w > oldw || h > oldh)) {
|
if (send_resize_client && (w > oldw || h > oldh)) {
|
||||||
XResizeWindow(ob_display, self->window,
|
XMoveResizeWindow(ob_display, self->window,
|
||||||
MAX(w, oldw), MAX(h, oldh));
|
-self->border_width, -self->border_width,
|
||||||
|
MAX(w, oldw), MAX(h, oldh));
|
||||||
/* resize the plate to show the client padding color underneath */
|
/* resize the plate to show the client padding color underneath */
|
||||||
frame_adjust_client_area(self->frame);
|
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
|
/* we have reset the client to 0 border width, so don't include
|
||||||
it in these coords */
|
it in these coords */
|
||||||
POINT_SET(self->root_pos,
|
POINT_SET(self->root_pos,
|
||||||
self->frame->area.x + self->frame->size.left,
|
self->frame->area.x + self->frame->size.left -
|
||||||
self->frame->area.y + self->frame->size.top);
|
self->border_width,
|
||||||
|
self->frame->area.y + self->frame->size.top -
|
||||||
|
self->border_width);
|
||||||
|
|
||||||
event.type = ConfigureNotify;
|
event.type = ConfigureNotify;
|
||||||
event.xconfigure.display = ob_display;
|
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.y = self->root_pos.y;
|
||||||
event.xconfigure.width = w;
|
event.xconfigure.width = w;
|
||||||
event.xconfigure.height = h;
|
event.xconfigure.height = h;
|
||||||
event.xconfigure.border_width = 0;
|
event.xconfigure.border_width = self->border_width;
|
||||||
event.xconfigure.above = self->frame->plate;
|
event.xconfigure.above = self->frame->plate;
|
||||||
event.xconfigure.override_redirect = FALSE;
|
event.xconfigure.override_redirect = FALSE;
|
||||||
XSendEvent(event.xconfigure.display, event.xconfigure.window,
|
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);
|
frame_adjust_client_area(self->frame);
|
||||||
|
|
||||||
if (send_resize_client)
|
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);
|
XFlush(ob_display);
|
||||||
|
|
|
@ -386,11 +386,13 @@ void client_convert_gravity_resize(ObClient *self, gint gravity,
|
||||||
gint w, gint h);
|
gint w, gint h);
|
||||||
|
|
||||||
#define client_move(self, x, y) \
|
#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) \
|
#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) \
|
#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
|
/*! Figure out where a window will end up and what size it will be if you
|
||||||
told it to move/resize to these coordinates.
|
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
|
@param force_reply Send a ConfigureNotify to the client regardless of if
|
||||||
the position changed.
|
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);
|
gboolean user, gboolean final);
|
||||||
|
|
||||||
void client_reconfigure(ObClient *self);
|
void client_reconfigure(ObClient *self);
|
||||||
|
|
|
@ -536,7 +536,6 @@ static void event_process(const XEvent *ec, gpointer data)
|
||||||
client_bring_helper_windows(client);
|
client_bring_helper_windows(client);
|
||||||
}
|
}
|
||||||
} else if (e->type == FocusOut) {
|
} else if (e->type == FocusOut) {
|
||||||
gboolean nomove = FALSE;
|
|
||||||
XEvent ce;
|
XEvent ce;
|
||||||
|
|
||||||
/* Look for the followup FocusIn */
|
/* 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
|
also you can't compress stacking events
|
||||||
*/
|
*/
|
||||||
|
|
||||||
gint x, y, w, h;
|
gint x, y, w, h, b;
|
||||||
gboolean move = FALSE;
|
gboolean move = FALSE;
|
||||||
gboolean resize = FALSE;
|
gboolean resize = FALSE;
|
||||||
|
gboolean border = FALSE;
|
||||||
|
|
||||||
/* get the current area */
|
/* get the current area */
|
||||||
RECT_TO_DIMS(client->area, x, y, w, h);
|
RECT_TO_DIMS(client->area, x, y, w, h);
|
||||||
|
b = client->border_width;
|
||||||
|
|
||||||
ob_debug("ConfigureRequest desktop %d wmstate %d visibile %d\n",
|
ob_debug("ConfigureRequest desktop %d wmstate %d visibile %d\n",
|
||||||
screen_desktop, client->wmstate, client->frame->visible);
|
screen_desktop, client->wmstate, client->frame->visible);
|
||||||
|
|
||||||
if (e->xconfigurerequest.value_mask & CWBorderWidth)
|
if (e->xconfigurerequest.value_mask & CWBorderWidth)
|
||||||
if (client->border_width != e->xconfigurerequest.border_width) {
|
if (client->border_width != e->xconfigurerequest.border_width) {
|
||||||
client->border_width = e->xconfigurerequest.border_width;
|
b = e->xconfigurerequest.border_width;
|
||||||
|
border = TRUE;
|
||||||
/* 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1114,17 +1109,21 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
notify is sent or not */
|
notify is sent or not */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (move || resize) {
|
if (move || resize || border) {
|
||||||
gint lw,lh;
|
gint lw,lh;
|
||||||
|
|
||||||
client_find_onscreen(client, &x, &y, w, h, FALSE);
|
if (move || resize) {
|
||||||
client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
|
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
|
/* if they requested something that moves the window, or if
|
||||||
the window is actually being changed then configure it and
|
the window is actually being changed then configure it and
|
||||||
send a configure notify to them */
|
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");
|
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 */
|
/* 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_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;
|
client->gravity = ograv;
|
||||||
|
|
||||||
|
|
|
@ -695,7 +695,9 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
|
||||||
self->cbwidth_y);
|
self->cbwidth_y);
|
||||||
|
|
||||||
/* when the client has StaticGravity, it likes to move around. */
|
/* 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 */
|
/* 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
|
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);
|
get_resize_position(&x, &y, cancel);
|
||||||
client_configure(moveresize_client, x, y,
|
client_configure(moveresize_client, x, y,
|
||||||
(cancel ? start_cw : cur_x),
|
(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;
|
moveresize_in_progress = FALSE;
|
||||||
|
@ -316,7 +317,8 @@ static void do_move(gboolean keyboard)
|
||||||
|
|
||||||
client_configure(moveresize_client, cur_x, cur_y,
|
client_configure(moveresize_client, cur_x, cur_y,
|
||||||
moveresize_client->area.width,
|
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" */
|
if (config_resize_popup_show == 2) /* == "Always" */
|
||||||
popup_coords(moveresize_client, "%d x %d",
|
popup_coords(moveresize_client, "%d x %d",
|
||||||
moveresize_client->frame->area.x,
|
moveresize_client->frame->area.x,
|
||||||
|
@ -374,7 +376,8 @@ static void do_resize()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
get_resize_position(&x, &y, FALSE);
|
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
|
/* this would be better with a fixed width font ... XXX can do it better
|
||||||
if there are 2 text boxes */
|
if there are 2 text boxes */
|
||||||
|
|
Loading…
Reference in a new issue