From 0813e4451d662e2ec162ef70216f641a6ebd93d0 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 13 Jun 2007 15:56:44 +0000 Subject: [PATCH] add force_reply back to client_configure(). client_reconfigure is nicer this time around. eat enter events in client_configure when user is FALSE. --- openbox/client.c | 60 +++++++++++++++++++++----------------------- openbox/client.h | 19 ++++++++------ openbox/event.c | 11 ++------ openbox/moveresize.c | 6 ++--- 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 */ -- 2.44.0