[mutter/wip/carlosg/init-xdnd] compositor: Add MetaDnD private function to initialize XDND
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/init-xdnd] compositor: Add MetaDnD private function to initialize XDND
- Date: Wed, 3 Jul 2019 14:35:09 +0000 (UTC)
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]