all repos — openbox @ 0813e4451d662e2ec162ef70216f641a6ebd93d0

openbox fork - make it a bit more like ryudo

add force_reply back to client_configure(). client_reconfigure is nicer this time around. eat enter events in client_configure when user is FALSE.
Dana Jansens danakj@orodu.net
commit

0813e4451d662e2ec162ef70216f641a6ebd93d0

parent

84b8cf165ab47a5cfc3e431be1b73d1613b12524

4 files changed, 44 insertions(+), 52 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -1808,24 +1808,6 @@ else self->max_vert = self->max_horz = FALSE;

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

/* 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_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 @@ fmoved = fresized = TRUE;

} /* 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,17 +2946,9 @@ used to follow the same rules as above, but _Java_ Swing can't handle

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;
M openbox/client.hopenbox/client.h

@@ -379,16 +379,21 @@ gint *x, gint *y,

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 @@ configuration. e.g. Final should be FALSE if doing an

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
M openbox/event.copenbox/event.c

@@ -1160,7 +1160,6 @@ }

{ gint lw,lh; - gulong ignore_start; client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);

@@ -1179,9 +1178,7 @@ client_find_onscreen(client, &x, &y, w, h, FALSE);

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 @@ prop_atoms.net_wm_moveresize_cancel)

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

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) {
M openbox/moveresize.copenbox/moveresize.c

@@ -299,7 +299,7 @@ get_resize_position(&x, &y, 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 @@

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

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