[metacity] screen: move cm selection to compositor
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity] screen: move cm selection to compositor
- Date: Fri, 10 Mar 2017 20:22:46 +0000 (UTC)
commit 1607ca9a2d7ed2950aaf5a99ec1c3dd62314c790
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Fri Mar 10 21:52:31 2017 +0200
screen: move cm selection to compositor
src/compositor/meta-compositor-private.h | 5 ++-
src/compositor/meta-compositor-vulkan.c | 3 +
src/compositor/meta-compositor-xrender.c | 7 +--
src/compositor/meta-compositor.c | 61 ++++++++++++++++++++++++++++++
src/core/screen-private.h | 3 -
src/core/screen.c | 32 ---------------
src/core/window.c | 3 -
src/include/screen.h | 3 -
8 files changed, 71 insertions(+), 46 deletions(-)
---
diff --git a/src/compositor/meta-compositor-private.h b/src/compositor/meta-compositor-private.h
index 575e8a7..73904d5 100644
--- a/src/compositor/meta-compositor-private.h
+++ b/src/compositor/meta-compositor-private.h
@@ -77,7 +77,10 @@ struct _MetaCompositorClass
Window xwindow);
};
-MetaDisplay *meta_compositor_get_display (MetaCompositor *compositor);
+gboolean meta_compositor_set_selection (MetaCompositor *compositor,
+ GError **error);
+
+MetaDisplay *meta_compositor_get_display (MetaCompositor *compositor);
G_END_DECLS
diff --git a/src/compositor/meta-compositor-vulkan.c b/src/compositor/meta-compositor-vulkan.c
index 2db721c..798aa8f 100644
--- a/src/compositor/meta-compositor-vulkan.c
+++ b/src/compositor/meta-compositor-vulkan.c
@@ -510,6 +510,9 @@ meta_compositor_vulkan_manage (MetaCompositor *compositor,
if (!enumerate_physical_devices (vulkan, error))
return FALSE;
+ if (!meta_compositor_set_selection (compositor, error))
+ return FALSE;
+
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Not implemented");
return FALSE;
diff --git a/src/compositor/meta-compositor-xrender.c b/src/compositor/meta-compositor-xrender.c
index db47da4..14fc845 100644
--- a/src/compositor/meta-compositor-xrender.c
+++ b/src/compositor/meta-compositor-xrender.c
@@ -2614,8 +2614,6 @@ meta_compositor_xrender_finalize (GObject *object)
XCompositeUnredirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
XCompositeReleaseOverlayWindow (xdisplay, xrender->overlay_window);
- meta_screen_unset_cm_selection (display->screen);
-
G_OBJECT_CLASS (meta_compositor_xrender_parent_class)->finalize (object);
}
@@ -2632,6 +2630,9 @@ meta_compositor_xrender_manage (MetaCompositor *compositor,
int screen_number = meta_screen_get_screen_number (screen);
Window xroot = meta_screen_get_xroot (screen);
+ if (!meta_compositor_set_selection (compositor, error))
+ return FALSE;
+
gdk_error_trap_push ();
XCompositeRedirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
XSync (xdisplay, FALSE);
@@ -2700,8 +2701,6 @@ meta_compositor_xrender_manage (MetaCompositor *compositor,
XClearArea (xdisplay, xrender->overlay_window, 0, 0, 0, 0, TRUE);
- meta_screen_set_cm_selection (screen);
-
show_overlay_window (xrender, xdisplay);
meta_prefs_add_listener (update_shadows, xrender);
diff --git a/src/compositor/meta-compositor.c b/src/compositor/meta-compositor.c
index 20eb169..60c5b09 100644
--- a/src/compositor/meta-compositor.c
+++ b/src/compositor/meta-compositor.c
@@ -18,13 +18,20 @@
#include "config.h"
+#include "display-private.h"
#include "meta-compositor-none.h"
#include "meta-compositor-xrender.h"
#include "meta-compositor-vulkan.h"
+#include "screen-private.h"
typedef struct
{
MetaDisplay *display;
+
+ /* _NET_WM_CM_Sn */
+ Atom cm_atom;
+ Window cm_window;
+ guint32 cm_timestamp;
} MetaCompositorPrivate;
enum
@@ -68,6 +75,21 @@ initable_iface_init (GInitableIface *iface)
static void
meta_compositor_finalize (GObject *object)
{
+ MetaCompositor *compositor;
+ MetaCompositorPrivate *priv;
+ Display *xdisplay;
+
+ compositor = META_COMPOSITOR (object);
+ priv = meta_compositor_get_instance_private (compositor);
+ xdisplay = priv->display->xdisplay;
+
+ if (priv->cm_window != None)
+ {
+ XSetSelectionOwner (xdisplay, priv->cm_atom, None, priv->cm_timestamp);
+ XDestroyWindow (xdisplay, priv->cm_window);
+ priv->cm_window = None;
+ }
+
G_OBJECT_CLASS (meta_compositor_parent_class)->finalize (object);
}
@@ -346,13 +368,52 @@ gboolean
meta_compositor_is_our_xwindow (MetaCompositor *compositor,
Window xwindow)
{
+ MetaCompositorPrivate *priv;
MetaCompositorClass *compositor_class;
+ priv = meta_compositor_get_instance_private (compositor);
compositor_class = META_COMPOSITOR_GET_CLASS (compositor);
+ if (priv->cm_window == xwindow)
+ return TRUE;
+
return compositor_class->is_our_xwindow (compositor, xwindow);
}
+gboolean
+meta_compositor_set_selection (MetaCompositor *compositor,
+ GError **error)
+{
+ MetaCompositorPrivate *priv;
+ Display *xdisplay;
+ gchar *atom_name;
+ Window xroot;
+
+ priv = meta_compositor_get_instance_private (compositor);
+ xdisplay = priv->display->xdisplay;
+
+ atom_name = g_strdup_printf ("_NET_WM_CM_S%d", DefaultScreen (xdisplay));
+ priv->cm_atom = XInternAtom (xdisplay, atom_name, FALSE);
+ g_free (atom_name);
+
+ xroot = DefaultRootWindow (xdisplay);
+ priv->cm_window = meta_create_offscreen_window (xdisplay, xroot, NoEventMask);
+ priv->cm_timestamp = meta_display_get_current_time_roundtrip (priv->display);
+
+ XSetSelectionOwner (xdisplay, priv->cm_atom, priv->cm_window, priv->cm_timestamp);
+
+ if (XGetSelectionOwner (xdisplay, priv->cm_atom) != priv->cm_window)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Could not acquire selection: %s",
+ XGetAtomName (xdisplay, priv->cm_atom));
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
MetaDisplay *
meta_compositor_get_display (MetaCompositor *compositor)
{
diff --git a/src/core/screen-private.h b/src/core/screen-private.h
index abd9ca5..935cbd8 100644
--- a/src/core/screen-private.h
+++ b/src/core/screen-private.h
@@ -114,9 +114,6 @@ struct _MetaScreen
guint startup_sequence_timeout;
#endif
- Window wm_cm_selection_window;
- guint32 wm_cm_timestamp;
-
guint work_area_idle;
int rows_of_workspaces;
diff --git a/src/core/screen.c b/src/core/screen.c
index 7766fb6..460760a 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -489,10 +489,6 @@ meta_screen_new (MetaDisplay *display,
screen->wm_sn_atom = wm_sn_atom;
screen->wm_sn_timestamp = manager_timestamp;
- screen->wm_cm_selection_window = meta_create_offscreen_window (xdisplay,
- xroot,
- NoEventMask);
-
screen->work_area_idle = 0;
screen->active_workspace = NULL;
@@ -2774,31 +2770,3 @@ meta_screen_get_size (MetaScreen *screen,
*width = screen->rect.width;
*height = screen->rect.height;
}
-
-void
-meta_screen_set_cm_selection (MetaScreen *screen)
-{
- char selection[32];
- Atom a;
-
- screen->wm_cm_timestamp = meta_display_get_current_time_roundtrip (
- screen->display);
-
- g_snprintf (selection, sizeof(selection), "_NET_WM_CM_S%d", screen->number);
- meta_verbose ("Setting selection: %s\n", selection);
- a = XInternAtom (screen->display->xdisplay, selection, FALSE);
- XSetSelectionOwner (screen->display->xdisplay, a,
- screen->wm_cm_selection_window, screen->wm_cm_timestamp);
-}
-
-void
-meta_screen_unset_cm_selection (MetaScreen *screen)
-{
- char selection[32];
- Atom a;
-
- g_snprintf (selection, sizeof(selection), "_NET_WM_CM_S%d", screen->number);
- a = XInternAtom (screen->display->xdisplay, selection, FALSE);
- XSetSelectionOwner (screen->display->xdisplay, a,
- None, screen->wm_cm_timestamp);
-}
diff --git a/src/core/window.c b/src/core/window.c
index ff0a11d..9b4f5ac 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -207,9 +207,6 @@ is_our_xwindow (MetaDisplay *display,
if (xwindow == display->screen->wm_sn_selection_window)
return TRUE;
- if (xwindow == display->screen->wm_cm_selection_window)
- return TRUE;
-
if (meta_compositor_is_our_xwindow (display->compositor, xwindow))
return TRUE;
diff --git a/src/include/screen.h b/src/include/screen.h
index 7a27a0a..c6bef30 100644
--- a/src/include/screen.h
+++ b/src/include/screen.h
@@ -34,7 +34,4 @@ void meta_screen_get_size (MetaScreen *screen,
MetaScreen *meta_screen_for_x_screen (Screen *xscreen);
-void meta_screen_set_cm_selection (MetaScreen *screen);
-void meta_screen_unset_cm_selection (MetaScreen *screen);
-
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]