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:
parent
4c25342316
commit
8f87a8af62
2 changed files with 51 additions and 25 deletions
|
@ -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();
|
||||||
|
|
|
@ -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 && \
|
||||||
|
|
Loading…
Reference in a new issue