[mutter/wip/carlosg/init-xdnd] compositor: Add MetaDnD private function to initialize XDND



commit b3b922f9bc332f69e21f46d98738b85c0c169157
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Jul 3 16:23:45 2019 +0200

    compositor: Add MetaDnD private function to initialize XDND
    
    We need to set XdndAware and XdndProxy on the stage window if running
    a X11 compositor, this is not necessary on wayland.
    
    Takes over gnome-shell code doing this initialization.
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/667

 src/backends/meta-dnd-private.h |  2 ++
 src/compositor/meta-dnd.c       | 28 ++++++++++++++++++++++++++++
 src/x11/meta-x11-display.c      |  4 ++++
 3 files changed, 34 insertions(+)
---
diff --git a/src/backends/meta-dnd-private.h b/src/backends/meta-dnd-private.h
index ebbd14143..6f39d43ad 100644
--- a/src/backends/meta-dnd-private.h
+++ b/src/backends/meta-dnd-private.h
@@ -30,6 +30,8 @@ gboolean meta_dnd_handle_xdnd_event (MetaBackend    *backend,
                                      Display        *xdisplay,
                                      XEvent         *xev);
 
+void meta_dnd_init_xdnd (MetaX11Display *x11_display);
+
 #ifdef HAVE_WAYLAND
 void meta_dnd_wayland_handle_begin_modal (MetaCompositor *compositor);
 void meta_dnd_wayland_handle_end_modal   (MetaCompositor *compositor);
diff --git a/src/compositor/meta-dnd.c b/src/compositor/meta-dnd.c
index 467aec347..7f0891741 100644
--- a/src/compositor/meta-dnd.c
+++ b/src/compositor/meta-dnd.c
@@ -26,6 +26,7 @@
 #include "compositor/compositor-private.h"
 #include "core/display-private.h"
 #include "backends/meta-dnd-private.h"
+#include "backends/x11/meta-backend-x11.h"
 #include "meta/meta-dnd.h"
 #include "x11/meta-x11-display-private.h"
 
@@ -109,6 +110,33 @@ meta_dnd_init (MetaDnd *dnd)
 {
 }
 
+void
+meta_dnd_init_xdnd (MetaX11Display *x11_display)
+{
+  MetaBackend *backend = meta_get_backend ();
+  Window output_window = meta_get_overlay_window (x11_display->display);
+  Window window = meta_backend_x11_get_xwindow (META_BACKEND_X11 (backend));
+  Display *xdisplay = x11_display->xdisplay;
+  long xdnd_version = 5;
+
+  XChangeProperty (xdisplay, window,
+                   XInternAtom (xdisplay, "XdndAware", TRUE), XA_ATOM,
+                   32, PropModeReplace,
+                   (const unsigned char *) &xdnd_version, 1);
+
+  XChangeProperty (xdisplay, output_window,
+                   XInternAtom (xdisplay, "XdndProxy", TRUE), XA_WINDOW,
+                   32, PropModeReplace, (const unsigned char *) &window, 1);
+
+  /*
+   * XdndProxy is additionally set on the proxy window as verification that the
+   * XdndProxy property on the target window isn't a left-over
+   */
+  XChangeProperty (xdisplay, window,
+                   XInternAtom (xdisplay, "XdndProxy", TRUE), XA_WINDOW,
+                   32, PropModeReplace, (const unsigned char *) &window, 1);
+}
+
 static void
 meta_dnd_notify_dnd_enter (MetaDnd *dnd)
 {
diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c
index 3174d8c4e..e9428e54d 100644
--- a/src/x11/meta-x11-display.c
+++ b/src/x11/meta-x11-display.c
@@ -48,6 +48,7 @@
 #include <X11/extensions/Xrandr.h>
 
 #include "backends/meta-backend-private.h"
+#include "backends/meta-dnd-private.h"
 #include "backends/meta-cursor-sprite-xcursor.h"
 #include "backends/meta-logical-monitor.h"
 #include "backends/meta-settings-private.h"
@@ -1342,6 +1343,9 @@ meta_x11_display_new (MetaDisplay *display, GError **error)
   meta_x11_startup_notification_init (x11_display);
   meta_x11_selection_init (x11_display);
 
+  if (!meta_is_wayland_compositor ())
+    meta_dnd_init_xdnd (x11_display);
+
   return x11_display;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]