[metacity] screen: move cm selection to compositor



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]