diff options
author | David Reveman <davidr@novell.com> | 2009-01-08 19:30:15 -0500 |
---|---|---|
committer | David Reveman <davidr@novell.com> | 2009-01-08 19:30:15 -0500 |
commit | b6adcec777100e5f49106314a4022db66a5a6975 (patch) | |
tree | 313e4dcee48a5af69a48a179ac4012b955072471 | |
parent | b909a151a741fb241aa0cc19d02941b4f98d9f1c (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.c | 35 |
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); |