| author | Danny Baumann <dannybaumann@web.de> | 2010-02-06 14:31:22 (GMT) |
|---|---|---|
| committer | Danny Baumann <dannybaumann@web.de> | 2010-02-06 14:34:39 (GMT) |
| commit | c892a7b8c2c096d7f8a9c24ca64b4ef04075b5de (patch) (side-by-side diff) | |
| tree | 311dd6c3db2e130459e4a55320a669dfe5e58682 | |
| parent | 9bea12c43bf15420a334c541b217f9ea5b64a4d1 (diff) | |
| download | core-c892a7b8c2c096d7f8a9c24ca64b4ef04075b5de.tar.gz core-c892a7b8c2c096d7f8a9c24ca64b4ef04075b5de.tar.bz2 | |
Fix selection aquiring, cleanup.
| -rw-r--r-- | plugins/composite/src/privates.h | 2 | ||||
| -rw-r--r-- | plugins/composite/src/screen.cpp | 60 | ||||
| -rw-r--r-- | src/privatescreen.h | 2 | ||||
| -rw-r--r-- | src/screen.cpp | 72 |
4 files changed, 40 insertions, 96 deletions
diff --git a/plugins/composite/src/privates.h b/plugins/composite/src/privates.h index 11ebea4..72514e1 100644 --- a/plugins/composite/src/privates.h +++ b/plugins/composite/src/privates.h @@ -65,8 +65,6 @@ class PrivateCompositeScreen : void detectRefreshRate (); int getTimeToNextRedraw (struct timeval *tv); - - bool aquireSelection (int, const char *, Atom, Window, Time); public: diff --git a/plugins/composite/src/screen.cpp b/plugins/composite/src/screen.cpp index e80d64a..ed2bf1e 100644 --- a/plugins/composite/src/screen.cpp +++ b/plugins/composite/src/screen.cpp @@ -303,45 +303,6 @@ PrivateCompositeScreen::~PrivateCompositeScreen () } bool -PrivateCompositeScreen::aquireSelection (int scr, - const char *name, - Atom selection, - Window owner, - Time timestamp) -{ - Display *dpy = screen->dpy (); - Window root = XRootWindow (dpy, scr); - XEvent event; - - XSetSelectionOwner (dpy, selection, owner, timestamp); - - if (XGetSelectionOwner (dpy, selection) != owner) - { - compLogMessage ("core", CompLogLevelError, - "Could not acquire %s manager " - "selection on screen %d display \"%s\"", - name, scr, DisplayString (dpy)); - - return true; - } - - /* Send client message indicating that we are now the manager */ - event.xclient.type = ClientMessage; - event.xclient.window = root; - event.xclient.message_type = Atoms::manager; - event.xclient.format = 32; - event.xclient.data.l[0] = timestamp; - event.xclient.data.l[1] = selection; - event.xclient.data.l[2] = 0; - event.xclient.data.l[3] = 0; - event.xclient.data.l[4] = 0; - - XSendEvent (dpy, root, FALSE, StructureNotifyMask, &event); - - return true; -} - -bool PrivateCompositeScreen::init () { Display *dpy = screen->dpy (); @@ -377,7 +338,7 @@ PrivateCompositeScreen::init () attr.event_mask = PropertyChangeMask; newCmSnOwner = - XCreateWindow (dpy, XRootWindow (dpy, screen->screenNum ()), + XCreateWindow (dpy, screen->root (), -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, @@ -392,13 +353,11 @@ PrivateCompositeScreen::init () cmSnTimestamp = event.xproperty.time; - XSetSelectionOwner (dpy, cmSnAtom, newCmSnOwner, cmSnTimestamp); - if (!aquireSelection (screen->screenNum (), "compositing", cmSnAtom, - newCmSnOwner, cmSnTimestamp)) + if (XGetSelectionOwner (dpy, cmSnAtom) != newCmSnOwner) { - compLogMessage ("composite", CompLogLevelError, + compLogMessage ("core", CompLogLevelError, "Could not acquire compositing manager " "selection on screen %d display \"%s\"", screen->screenNum (), DisplayString (dpy)); @@ -406,6 +365,19 @@ PrivateCompositeScreen::init () return false; } + /* Send client message indicating that we are now the compositing manager */ + event.xclient.type = ClientMessage; + event.xclient.window = screen->root (); + event.xclient.message_type = Atoms::manager; + event.xclient.format = 32; + event.xclient.data.l[0] = cmSnTimestamp; + event.xclient.data.l[1] = cmSnAtom; + event.xclient.data.l[2] = 0; + event.xclient.data.l[3] = 0; + event.xclient.data.l[4] = 0; + + XSendEvent (dpy, screen->root (), FALSE, StructureNotifyMask, &event); + return true; } diff --git a/src/privatescreen.h b/src/privatescreen.h index 124637a..0f77294 100644 --- a/src/privatescreen.h +++ b/src/privatescreen.h @@ -288,8 +288,6 @@ class PrivateScreen : public CoreOptions { void addScreenActions (); - bool aquireSelection (int scr, const char *name, Atom, Window, Time); - CompWindow * focusTopMostWindow (); diff --git a/src/screen.cpp b/src/screen.cpp index cf528bf..5bbb0ce 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -4064,50 +4064,13 @@ CompScreen::CompScreen (): } bool -PrivateScreen::aquireSelection (int scr, - const char *name, - Atom selection, - Window owner, - Time timestamp) -{ - Window root = XRootWindow (dpy, scr); - XEvent event; - - XSetSelectionOwner (dpy, selection, owner, timestamp); - - if (XGetSelectionOwner (dpy, selection) != owner) - { - compLogMessage ("core", CompLogLevelError, - "Could not acquire %s manager " - "selection on screen %d display \"%s\"", - name, scr, DisplayString (dpy)); - - return true; - } - - /* Send client message indicating that we are now the manager */ - event.xclient.type = ClientMessage; - event.xclient.window = root; - event.xclient.message_type = Atoms::manager; - event.xclient.format = 32; - event.xclient.data.l[0] = timestamp; - event.xclient.data.l[1] = selection; - event.xclient.data.l[2] = 0; - event.xclient.data.l[3] = 0; - event.xclient.data.l[4] = 0; - - XSendEvent (dpy, root, FALSE, StructureNotifyMask, &event); - - return true; -} - -bool CompScreen::init (const char *name) { Window focus; int revertTo, i; int xkbOpcode; Display *dpy; + Window root; Window newWmSnOwner = None; Atom wmSnAtom = 0; Time wmSnTimestamp = 0; @@ -4216,7 +4179,6 @@ CompScreen::init (const char *name) priv->escapeKeyCode = XKeysymToKeycode (dpy, XStringToKeysym ("Escape")); priv->returnKeyCode = XKeysymToKeycode (dpy, XStringToKeysym ("Return")); - priv->screenNum = DefaultScreen (dpy); sprintf (buf, "WM_S%d", DefaultScreen (dpy)); wmSnAtom = XInternAtom (dpy, buf, 0); @@ -4240,12 +4202,13 @@ CompScreen::init (const char *name) XSelectInput (dpy, currentWmSnOwner, StructureNotifyMask); } + root = XRootWindow (dpy, DefaultScreen (dpy)); + attr.override_redirect = true; attr.event_mask = PropertyChangeMask; newWmSnOwner = - XCreateWindow (dpy, XRootWindow (dpy, DefaultScreen (dpy)), - -100, -100, 1, 1, 0, + XCreateWindow (dpy, root, -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, @@ -4261,19 +4224,31 @@ CompScreen::init (const char *name) XSetSelectionOwner (dpy, wmSnAtom, newWmSnOwner, wmSnTimestamp); - if (!priv->aquireSelection (priv->screenNum, "window", wmSnAtom, - newWmSnOwner, wmSnTimestamp)) + if (XGetSelectionOwner (dpy, wmSnAtom) != newWmSnOwner) { compLogMessage ("core", CompLogLevelError, - "Could not acquire window manager " - "selection on screen %d display \"%s\"", - DefaultScreen (dpy), DisplayString (dpy)); + "Could not acquire window manager " + "selection on screen %d display \"%s\"", + DefaultScreen (dpy), DisplayString (dpy)); XDestroyWindow (dpy, newWmSnOwner); return false; } + /* Send client message indicating that we are now the window manager */ + event.xclient.type = ClientMessage; + event.xclient.window = root; + event.xclient.message_type = Atoms::manager; + event.xclient.format = 32; + event.xclient.data.l[0] = wmSnTimestamp; + event.xclient.data.l[1] = wmSnAtom; + event.xclient.data.l[2] = 0; + event.xclient.data.l[3] = 0; + event.xclient.data.l[4] = 0; + + XSendEvent (dpy, root, FALSE, StructureNotifyMask, &event); + /* Wait for old window manager to go away */ if (currentWmSnOwner != None) { @@ -4286,7 +4261,7 @@ CompScreen::init (const char *name) XGrabServer (dpy); - XSelectInput (dpy, XRootWindow (dpy, DefaultScreen (dpy)), + XSelectInput (dpy, root, SubstructureRedirectMask | SubstructureNotifyMask | StructureNotifyMask | @@ -4319,8 +4294,9 @@ CompScreen::init (const char *name) priv->screenEdge[i].count = 0; } + priv->screenNum = DefaultScreen (dpy); priv->colormap = DefaultColormap (dpy, priv->screenNum); - priv->root = XRootWindow (dpy, priv->screenNum); + priv->root = root; priv->snContext = sn_monitor_context_new (priv->snDisplay, priv->screenNum, compScreenSnEvent, this, NULL); |
