diff --git a/src/compositor.c b/src/compositor.c index 11879cd1431db6637b00a6edead0a97b6ba766a5..a894ecbd18ac64782f1ba31d7a75159112c72f98 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -2711,6 +2711,26 @@ compositorSetCompositeMode (DisplayInfo *display_info, gboolean use_manual_redir #endif /* HAVE_COMPOSITOR */ } +static void +compositorSetCMSelection (ScreenInfo *screen_info, Window w) +{ + DisplayInfo *display_info; + gchar selection[32]; + Atom a; + + g_return_if_fail (screen_info != NULL); + + display_info = screen_info->display_info; + /* Newer EWMH standard property "_NET_WM_CM_S<n>" */ + g_snprintf (selection, sizeof (selection), "_NET_WM_CM_S%d", screen_info->screen); + a = XInternAtom (display_info->dpy, selection, FALSE); + setXAtomManagerOwner (display_info, a, screen_info->xroot, w); + + /* Older property "COMPOSITING_MANAGER" */ + setAtomIdManagerOwner (display_info, COMPOSITING_MANAGER, screen_info->xroot, w); +} + + gboolean compositorManageScreen (ScreenInfo *screen_info) { @@ -2777,8 +2797,7 @@ compositorManageScreen (ScreenInfo *screen_info) screen_info->overlays = 0; XClearArea (display_info->dpy, screen_info->xroot, 0, 0, 0, 0, TRUE); - setAtomManagerOwner (display_info, COMPOSITING_MANAGER, - screen_info->xroot, screen_info->xfwm4_win); + compositorSetCMSelection (screen_info, screen_info->xfwm4_win); return TRUE; #else @@ -2856,7 +2875,7 @@ compositorUnmanageScreen (ScreenInfo *screen_info) XCompositeUnredirectSubwindows (display_info->dpy, screen_info->xroot, display_info->composite_mode); - setAtomManagerOwner (display_info, COMPOSITING_MANAGER, screen_info->xroot, None); + compositorSetCMSelection (screen_info, None); #endif /* HAVE_COMPOSITOR */ } diff --git a/src/hints.c b/src/hints.c index 06b41a714a47b6d963583f7b5a9972c8a596b92a..faf64827c72a3aeb27bf38421d77b9c9ceac79b9 100644 --- a/src/hints.c +++ b/src/hints.c @@ -1115,30 +1115,29 @@ getOpacityLock (DisplayInfo *display_info, Window window) } gboolean -setAtomManagerOwner (DisplayInfo *display_info, int atom_id, Window root, Window w) +setXAtomManagerOwner (DisplayInfo *display_info, Atom atom, Window root, Window w) { XClientMessageEvent ev; Time server_time; int status; - - g_return_val_if_fail (((atom_id >= 0) && (atom_id < NB_ATOMS)), FALSE); + + g_return_val_if_fail (root != None, FALSE); + server_time = myDisplayGetCurrentTime (display_info); - status = XSetSelectionOwner (display_info->dpy, - display_info->atoms[atom_id], - w, server_time); + status = XSetSelectionOwner (display_info->dpy, atom, w, server_time); if ((status == BadAtom) || (status == BadWindow)) { return FALSE; } - if (XGetSelectionOwner (display_info->dpy, display_info->atoms[atom_id]) == w) + if (XGetSelectionOwner (display_info->dpy, atom) == w) { ev.type = ClientMessage; - ev.message_type = display_info->atoms[atom_id]; + ev.message_type = atom; ev.format = 32; ev.data.l[0] = server_time; - ev.data.l[1] = display_info->atoms[atom_id]; + ev.data.l[1] = atom; ev.data.l[2] = w; ev.data.l[3] = 0; ev.data.l[4] = 0; @@ -1152,6 +1151,14 @@ setAtomManagerOwner (DisplayInfo *display_info, int atom_id, Window root, Window return FALSE; } +gboolean +setAtomIdManagerOwner (DisplayInfo *display_info, int atom_id, Window root, Window w) +{ + g_return_val_if_fail (((atom_id >= 0) && (atom_id < NB_ATOMS)), FALSE); + + return setXAtomManagerOwner(display_info, display_info->atoms[atom_id], root, w); +} + #ifdef ENABLE_KDE_SYSTRAY_PROXY gboolean checkKdeSystrayWindow(DisplayInfo *display_info, Window window) diff --git a/src/hints.h b/src/hints.h index bdb10bc15c5d90d754424b26e8c8e5bc724f9253..90060ac78aa024b454b2edf19e0153b2cc33b0bf 100644 --- a/src/hints.h +++ b/src/hints.h @@ -178,7 +178,8 @@ gboolean getKDEIcon (DisplayInfo *, Window, Pixmap *, Pixmap *); gboolean getRGBIconData (DisplayInfo *, Window, unsigned long **, unsigned long *); gboolean getOpacity (DisplayInfo *, Window, guint *); gboolean getOpacityLock (DisplayInfo *, Window); -gboolean setAtomManagerOwner (DisplayInfo *, int, Window , Window); +gboolean setAtomIdManagerOwner (DisplayInfo *, int, Window , Window); +gboolean setXAtomManagerOwner (DisplayInfo *, Atom, Window , Window); #ifdef ENABLE_KDE_SYSTRAY_PROXY gboolean checkKdeSystrayWindow(DisplayInfo *, Window); diff --git a/src/main.c b/src/main.c index 3949587dfb15437344ba50a664578710fd3d248a..091c0cd55c43b9acfc9c84624496ed65a307949f 100644 --- a/src/main.c +++ b/src/main.c @@ -461,7 +461,7 @@ initialize (int argc, char **argv, gint compositor_mode) compositing manager (used by WM tweaks to determine whether or not show the "compositor" tab. */ - setAtomManagerOwner (display_info, XFWM4_COMPOSITING_MANAGER, + setAtomIdManagerOwner (display_info, XFWM4_COMPOSITING_MANAGER, screen_info->xroot, screen_info->xfwm4_win); } }