summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-05-22 02:14:49 +0000
committerDana Jansens <danakj@orodu.net>2007-05-22 02:14:49 +0000
commit8f87a8af62c092617e7b5f4733d18ed11109f2ac (patch)
tree491353bc3bd3cf4ba2dedb263eeeb311c43f260d
parent4c25342316a3d55f7c2e44b879c38bfca8b69053 (diff)
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
-rw-r--r--openbox/event.c71
-rw-r--r--openbox/geom.h5
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 && \