From 8f87a8af62c092617e7b5f4733d18ed11109f2ac Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 22 May 2007 02:14:49 +0000 Subject: [PATCH] only send configure notify when they requested a move, or if we are actually changing anything. that is: if they only request a resize and nothing changes, don't do anything and dont send a configurenotify. this fixes the emacs event storm also some new macros for rects --- openbox/event.c | 71 ++++++++++++++++++++++++++++++++----------------- openbox/geom.h | 5 ++++ 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/openbox/event.c b/openbox/event.c index ac0e6ff2..aa082e68 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -993,14 +993,11 @@ static void event_handle_client(ObClient *client, XEvent *e) */ gint x, y, w, h; + gboolean move = FALSE; + gboolean resize = FALSE; - /* if nothing is changed, then a configurenotify is needed */ - gboolean config = TRUE; - - x = client->area.x; - y = client->area.y; - w = client->area.width; - h = client->area.height; + /* get the current area */ + RECT_TO_DIMS(client->area, x, y, w, h); ob_debug("ConfigureRequest desktop %d wmstate %d visibile %d\n", screen_desktop, client->wmstate, client->frame->visible); @@ -1008,8 +1005,13 @@ static void event_handle_client(ObClient *client, XEvent *e) if (e->xconfigurerequest.value_mask & CWBorderWidth) if (client->border_width != e->xconfigurerequest.border_width) { client->border_width = e->xconfigurerequest.border_width; - /* if only the border width is changing, then it's not needed*/ - config = FALSE; + + /* 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; } @@ -1029,8 +1031,8 @@ static void event_handle_client(ObClient *client, XEvent *e) stacking_restack_request(client, sibling, e->xconfigurerequest.detail, TRUE); - /* if a stacking change is requested then it is needed */ - config = TRUE; + /* if a stacking change moves the window without resizing */ + move = TRUE; } /* don't allow clients to move shaded windows (fvwm does this) */ @@ -1042,7 +1044,7 @@ static void event_handle_client(ObClient *client, XEvent *e) /* if the client tried to move and we aren't letting it then a synthetic event is needed */ - config = TRUE; + move = TRUE; } if (e->xconfigurerequest.value_mask & CWX || @@ -1050,25 +1052,31 @@ static void event_handle_client(ObClient *client, XEvent *e) e->xconfigurerequest.value_mask & CWWidth || e->xconfigurerequest.value_mask & CWHeight) { - if (e->xconfigurerequest.value_mask & CWX) + if (e->xconfigurerequest.value_mask & CWX) { x = e->xconfigurerequest.x; - if (e->xconfigurerequest.value_mask & CWY) + move = TRUE; + } + if (e->xconfigurerequest.value_mask & CWY) { y = e->xconfigurerequest.y; - if (e->xconfigurerequest.value_mask & CWWidth) + move = TRUE; + } + if (e->xconfigurerequest.value_mask & CWWidth) { w = e->xconfigurerequest.width; - if (e->xconfigurerequest.value_mask & CWHeight) + resize = TRUE; + } + if (e->xconfigurerequest.value_mask & CWHeight) { h = e->xconfigurerequest.height; - - /* if a new position or size is requested, then a configure is - needed */ - config = TRUE; + resize = TRUE; + } } - ob_debug("ConfigureRequest x(%d) %d y(%d) %d w(%d) %d h(%d) %d\n", + ob_debug("ConfigureRequest x(%d) %d y(%d) %d w(%d) %d h(%d) %d " + "move %d resize %d\n", e->xconfigurerequest.value_mask & CWX, x, e->xconfigurerequest.value_mask & CWY, y, e->xconfigurerequest.value_mask & CWWidth, w, - e->xconfigurerequest.value_mask & CWHeight, h); + e->xconfigurerequest.value_mask & CWHeight, h, + move, resize); /* check for broken apps moving to their root position @@ -1077,7 +1085,8 @@ static void event_handle_client(ObClient *client, XEvent *e) desktop. eg. open amarok window on desktop 1, switch to desktop 2, click amarok tray icon. it will move by its decoration size. */ - if (x != client->area.x && + if (move && !resize && + x != client->area.x && x == (client->frame->area.x + client->frame->size.left - (gint)client->border_width) && y != client->area.y && @@ -1092,11 +1101,23 @@ static void event_handle_client(ObClient *client, XEvent *e) /* don't move it */ x = client->area.x; y = client->area.y; + + /* they still requested a move, so don't change whether a + notify is sent or not */ } - if (config) { + if (move || resize) { + gint lw,lh; + client_find_onscreen(client, &x, &y, w, h, FALSE); - client_configure(client, x, y, w, h, FALSE, TRUE); + 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)) { + ob_debug("Doing configure\n"); + client_configure(client, x, y, w, h, FALSE, TRUE); + } /* ignore enter events caused by these like ob actions do */ event_ignore_all_queued_enters(); diff --git a/openbox/geom.h b/openbox/geom.h index 39832e94..67a82cde 100644 --- a/openbox/geom.h +++ b/openbox/geom.h @@ -57,6 +57,11 @@ typedef struct _Rect { #define RECT_EQUAL(r1, r2) ((r1).x == (r2).x && (r1).y == (r2).y && \ (r1).width == (r2).width && \ (r1).height == (r2).height) +#define RECT_EQUAL_DIMS(r, x, y, w, h) \ + ((r).x == (x) && (r).y == (y) && (r).width == (w) && (r).height == (h)) + +#define RECT_TO_DIMS(r, x, y, w, h) \ + (x) = (r).x, (y) = (r).y, (w) = (r).width, (h) = (r).height #define RECT_CONTAINS(r, px, py) \ ((px) >= (r).x && (px) < (r).x + (r).width && \ -- 2.39.2