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
This commit is contained in:
Dana Jansens 2007-05-22 02:14:49 +00:00
parent 4c25342316
commit 8f87a8af62
2 changed files with 51 additions and 25 deletions

View file

@ -993,14 +993,11 @@ static void event_handle_client(ObClient *client, XEvent *e)
*/ */
gint x, y, w, h; gint x, y, w, h;
gboolean move = FALSE;
gboolean resize = FALSE;
/* if nothing is changed, then a configurenotify is needed */ /* get the current area */
gboolean config = TRUE; RECT_TO_DIMS(client->area, x, y, w, h);
x = client->area.x;
y = client->area.y;
w = client->area.width;
h = client->area.height;
ob_debug("ConfigureRequest desktop %d wmstate %d visibile %d\n", ob_debug("ConfigureRequest desktop %d wmstate %d visibile %d\n",
screen_desktop, client->wmstate, client->frame->visible); 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 (e->xconfigurerequest.value_mask & CWBorderWidth)
if (client->border_width != e->xconfigurerequest.border_width) { if (client->border_width != e->xconfigurerequest.border_width) {
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, stacking_restack_request(client, sibling,
e->xconfigurerequest.detail, TRUE); e->xconfigurerequest.detail, TRUE);
/* if a stacking change is requested then it is needed */ /* if a stacking change moves the window without resizing */
config = TRUE; move = TRUE;
} }
/* don't allow clients to move shaded windows (fvwm does this) */ /* 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 /* if the client tried to move and we aren't letting it then a
synthetic event is needed */ synthetic event is needed */
config = TRUE; move = TRUE;
} }
if (e->xconfigurerequest.value_mask & CWX || 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 & CWWidth ||
e->xconfigurerequest.value_mask & CWHeight) e->xconfigurerequest.value_mask & CWHeight)
{ {
if (e->xconfigurerequest.value_mask & CWX) if (e->xconfigurerequest.value_mask & CWX) {
x = e->xconfigurerequest.x; x = e->xconfigurerequest.x;
if (e->xconfigurerequest.value_mask & CWY) move = TRUE;
}
if (e->xconfigurerequest.value_mask & CWY) {
y = e->xconfigurerequest.y; y = e->xconfigurerequest.y;
if (e->xconfigurerequest.value_mask & CWWidth) move = TRUE;
}
if (e->xconfigurerequest.value_mask & CWWidth) {
w = e->xconfigurerequest.width; w = e->xconfigurerequest.width;
if (e->xconfigurerequest.value_mask & CWHeight) resize = TRUE;
}
if (e->xconfigurerequest.value_mask & CWHeight) {
h = e->xconfigurerequest.height; h = e->xconfigurerequest.height;
resize = TRUE;
/* if a new position or size is requested, then a configure is }
needed */
config = 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 & CWX, x,
e->xconfigurerequest.value_mask & CWY, y, e->xconfigurerequest.value_mask & CWY, y,
e->xconfigurerequest.value_mask & CWWidth, w, 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 /* 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 desktop. eg. open amarok window on desktop 1, switch to desktop
2, click amarok tray icon. it will move by its decoration size. 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 - x == (client->frame->area.x + client->frame->size.left -
(gint)client->border_width) && (gint)client->border_width) &&
y != client->area.y && y != client->area.y &&
@ -1092,11 +1101,23 @@ static void event_handle_client(ObClient *client, XEvent *e)
/* don't move it */ /* don't move it */
x = client->area.x; x = client->area.x;
y = client->area.y; 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_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)) {
ob_debug("Doing configure\n");
client_configure(client, x, y, w, h, FALSE, TRUE); client_configure(client, x, y, w, h, FALSE, TRUE);
}
/* ignore enter events caused by these like ob actions do */ /* ignore enter events caused by these like ob actions do */
event_ignore_all_queued_enters(); event_ignore_all_queued_enters();

View file

@ -57,6 +57,11 @@ typedef struct _Rect {
#define RECT_EQUAL(r1, r2) ((r1).x == (r2).x && (r1).y == (r2).y && \ #define RECT_EQUAL(r1, r2) ((r1).x == (r2).x && (r1).y == (r2).y && \
(r1).width == (r2).width && \ (r1).width == (r2).width && \
(r1).height == (r2).height) (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) \ #define RECT_CONTAINS(r, px, py) \
((px) >= (r).x && (px) < (r).x + (r).width && \ ((px) >= (r).x && (px) < (r).x + (r).width && \