summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Reveman <davidr@novell.com>2009-01-08 19:30:15 -0500
committerDavid Reveman <davidr@novell.com>2009-01-08 19:30:15 -0500
commitb6adcec777100e5f49106314a4022db66a5a6975 (patch)
tree313e4dcee48a5af69a48a179ac4012b955072471
parentb909a151a741fb241aa0cc19d02941b4f98d9f1c (diff)
Have move plugin forward a notify client message to the decorator so
that double clicks and such can be properly handled.
-rw-r--r--plugins/move.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/plugins/move.c b/plugins/move.c
index d39b2aed..d66f17af 100644
--- a/plugins/move.c
+++ b/plugins/move.c
@@ -84,6 +84,7 @@ typedef struct _MoveDisplay {
KeyCode key[NUM_KEYS];
Atom moveAtom;
+ Atom moveNotifyAtom;
int releaseButton;
@@ -753,8 +754,27 @@ moveHandleEvent (CompDisplay *d,
CompActionStateInitButton,
o, 5))
{
+ XEvent ev;
+ int mask = NoEventMask;
+
if (!w->parent->substructureRedirect)
activateWindow (w);
+
+ if (w->parent == &w->screen->root)
+ mask = SubstructureRedirectMask |
+ SubstructureNotifyMask;
+
+ ev.type = ClientMessage;
+ ev.xclient.window = event->xbutton.subwindow;
+ ev.xclient.message_type = md->moveNotifyAtom;
+ ev.xclient.format = 32;
+ ev.xclient.data.l[0] = event->xbutton.button;
+ ev.xclient.data.l[1] = event->xbutton.x;
+ ev.xclient.data.l[2] = event->xbutton.y;
+ ev.xclient.data.l[3] = event->xbutton.time;
+ ev.xclient.data.l[4] = 0;
+
+ XSendEvent (d->display, w->parent->id, FALSE, mask, &ev);
}
}
}
@@ -898,6 +918,14 @@ moveHandleEvent (CompDisplay *d,
}
}
}
+ else if (event->xclient.message_type == md->moveNotifyAtom)
+ {
+ /* forward to owner */
+ XSendEvent (d->display,
+ event->xclient.window,
+ FALSE, NoEventMask,
+ event);
+ }
break;
case DestroyNotify:
if (md->w && md->w->id == event->xdestroywindow.window)
@@ -1077,7 +1105,12 @@ moveInitDisplay (CompPlugin *p,
md->key[i] = XKeysymToKeycode (d->display,
XStringToKeysym (mKeys[i].name));
- md->moveAtom = XInternAtom (d->display, "_COMPIZ_WM_WINDOW_MOVE_DECOR", 0);
+ md->moveAtom = XInternAtom (d->display,
+ "_COMPIZ_WM_WINDOW_MOVE_DECOR",
+ 0);
+ md->moveNotifyAtom = XInternAtom (d->display,
+ "_COMPIZ_WM_WINDOW_MOVE_DECOR_NOTIFY",
+ 0);
WRAP (md, d, handleEvent, moveHandleEvent);