don't change clients' borders

This commit is contained in:
Dana Jansens 2007-05-26 22:55:13 +00:00
parent 306ea13177
commit 2e529e3ff3
5 changed files with 53 additions and 108 deletions

View file

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

View file

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

View file

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

View file

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

View file

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