summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/client.c60
-rw-r--r--openbox/client.h19
-rw-r--r--openbox/event.c11
-rw-r--r--openbox/moveresize.c6
4 files changed, 44 insertions, 52 deletions
diff --git a/openbox/client.c b/openbox/client.c
index d80ed298..ae2a9986 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -1808,24 +1808,6 @@ static void client_change_allowed_actions(ObClient *self)
}
}
-void client_reconfigure(ObClient *self, gboolean force)
-{
- gint x, y, w, h, lw, lh;
-
- RECT_TO_DIMS(self->area, x, y, w, h);
- if (!force)
- client_try_configure(self, &x, &y, &w, &h, &lw, &lh, FALSE);
- if (force || !RECT_EQUAL_DIMS(self->area, x, y, w, h)) {
- gulong ignore_start;
-
- ob_debug("Reconfiguring client x %d y %d w %d h %d\n",
- x, y, w, h);
- ignore_start = event_start_ignore_all_enters();
- client_configure(self, x, y, w, h, FALSE, TRUE);
- event_end_ignore_all_enters(ignore_start);
- }
-}
-
void client_update_wmhints(ObClient *self)
{
XWMHints *hints;
@@ -2630,7 +2612,7 @@ static void client_apply_startup_state(ObClient *self,
/* if the window hasn't been configured yet, then do so now */
if (!fullscreen && !max_vert && !max_horz) {
self->area = oldarea;
- client_configure(self, x, y, w, h, FALSE, TRUE);
+ client_configure(self, x, y, w, h, FALSE, TRUE, FALSE);
}
/* set the desktop hint, to make sure that it always exists */
@@ -2873,11 +2855,11 @@ 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,
- gboolean user, gboolean final)
+ gboolean user, gboolean final, gboolean force_reply)
{
gint oldw, oldh;
gboolean send_resize_client;
- gboolean moved = FALSE, resized = FALSE;
+ gboolean moved = FALSE, resized = FALSE, rootmoved = FALSE;
gboolean fmoved, fresized;
guint fdecor = self->frame->decorations;
gboolean fhorz = self->frame->max_horz;
@@ -2926,15 +2908,37 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
}
/* adjust the frame */
- if (fmoved || fresized)
+ if (fmoved || fresized) {
+ gulong ignore_start;
+ if (!user)
+ ignore_start = event_start_ignore_all_enters();
+
frame_adjust_area(self->frame, fmoved, fresized, FALSE);
+ if (!user)
+ event_end_ignore_all_enters(ignore_start);
+ }
+
+ if (!user || final) {
+ gint oldrx = self->root_pos.x;
+ gint oldry = self->root_pos.y;
+ /* 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->border_width,
+ self->frame->area.y + self->frame->size.top -
+ self->border_width);
+ if (self->root_pos.x != oldrx || self->root_pos.y != oldry)
+ rootmoved = TRUE;
+ }
+
/* This is kinda tricky and should not be changed.. let me explain!
When user = FALSE, then the request is coming from the application
itself, and we are more strict about when to send a synthetic
ConfigureNotify. We strictly follow the rules of the ICCCM sec 4.1.5
- in this case.
+ in this case (if force_reply is true)
When user = TRUE, then the request is coming from "us", like when we
maximize a window or sometihng. In this case we are more lenient. We
@@ -2942,18 +2946,10 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
this. So just to appease Swing, when user = TRUE, we always send
a synthetic ConfigureNotify to give the window its root coordinates.
*/
- if ((!user && !resized) || (user && final))
+ if ((!user && !resized && (rootmoved || force_reply)) || (user && final))
{
XEvent event;
- /* 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->border_width,
- self->frame->area.y + self->frame->size.top -
- self->border_width);
-
event.type = ConfigureNotify;
event.xconfigure.display = ob_display;
event.xconfigure.event = self->window;
diff --git a/openbox/client.h b/openbox/client.h
index 812d0ac5..ed677926 100644
--- a/openbox/client.h
+++ b/openbox/client.h
@@ -379,16 +379,21 @@ 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, TRUE, TRUE,\
+ FALSE)
#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, TRUE, TRUE, FALSE)
#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, TRUE, TRUE, FALSE)
+#define client_reconfigure(self, force) \
+ client_configure(self, ((ObClient*)self)->area.x, ((ObClient*)self)->area.y, \
+ ((ObClient*)self)->area.width, \
+ ((ObClient*)self)->area.height, FALSE, TRUE, force)
/*! Figure out where a window will end up and what size it will be if you
told it to move/resize to these coordinates.
- These values are what client_configure_full will give the window.
+ These values are what client_configure will give the window.
@param x The x coordiante of the new position for the client.
@param y The y coordiante of the new position for the client.
@@ -422,12 +427,10 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
interactive move/resize, and then be TRUE for the last call
only.
@param force_reply Send a ConfigureNotify to the client regardless of if
- the position changed.
+ the position/size changed.
*/
void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
- gboolean user, gboolean final);
-
-void client_reconfigure(ObClient *self, gboolean force);
+ gboolean user, gboolean final, gboolean force_reply);
/*! Finds coordinates to keep a client on the screen.
@param self The client
diff --git a/openbox/event.c b/openbox/event.c
index 3052e1bf..8089792c 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -1160,7 +1160,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
{
gint lw,lh;
- gulong ignore_start;
client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
@@ -1179,9 +1178,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
ob_debug("Granting ConfigureRequest x %d y %d w %d h %d\n",
x, y, w, h);
- ignore_start = event_start_ignore_all_enters();
- client_configure(client, x, y, w, h, FALSE, TRUE);
- event_end_ignore_all_enters(ignore_start);
+ client_configure(client, x, y, w, h, FALSE, TRUE, TRUE);
}
break;
}
@@ -1343,7 +1340,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
moveresize_end(TRUE);
} else if (msgtype == prop_atoms.net_moveresize_window) {
gint ograv, x, y, w, h;
- gulong ignore_start;
ograv = client->gravity;
@@ -1388,10 +1384,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
client_find_onscreen(client, &x, &y, w, h, FALSE);
- /* ignore enter events caused by these like ob actions do */
- ignore_start = event_start_ignore_all_enters();
- client_configure(client, x, y, w, h, FALSE, TRUE);
- event_end_ignore_all_enters(ignore_start);
+ client_configure(client, x, y, w, h, FALSE, TRUE, FALSE);
client->gravity = ograv;
} else if (msgtype == prop_atoms.net_restack_window) {
diff --git a/openbox/moveresize.c b/openbox/moveresize.c
index 232cc9b9..534cd011 100644
--- a/openbox/moveresize.c
+++ b/openbox/moveresize.c
@@ -299,7 +299,7 @@ void moveresize_end(gboolean cancel)
client_configure(moveresize_client, x, y,
(cancel ? start_cw : cur_x),
(cancel ? start_ch : cur_y),
- TRUE, TRUE);
+ TRUE, TRUE, FALSE);
}
moveresize_in_progress = FALSE;
@@ -319,7 +319,7 @@ static void do_move(gboolean keyboard)
client_configure(moveresize_client, cur_x, cur_y,
moveresize_client->area.width,
moveresize_client->area.height,
- TRUE, FALSE);
+ TRUE, FALSE, FALSE);
if (config_resize_popup_show == 2) /* == "Always" */
popup_coords(moveresize_client, "%d x %d",
moveresize_client->frame->area.x,
@@ -377,7 +377,7 @@ 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, TRUE, FALSE, FALSE);
/* this would be better with a fixed width font ... XXX can do it better
if there are 2 text boxes */