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);
/* 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;
(!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);
(!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);
*/
client_configure(self, placex, placey,
self->area.width, self->area.height,
+ self->border_width,
FALSE, TRUE);
{
Rect a;
- /* give the client its border back */
- client_toggle_border(self, TRUE);
-
a = self->area;
if (self->fullscreen)
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 */
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)
}
-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;
/* 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
/* 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);
}
/* 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;
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,
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);
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.
@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);
client_bring_helper_windows(client);
}
} else if (e->type == FocusOut) {
- gboolean nomove = FALSE;
XEvent ce;
/* Look for the followup FocusIn */
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;
}
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 */
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;
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);
}
}
*/
/* 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
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;
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,
#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 */