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..2a7302cf8 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,35 @@ meta_dnd_init (MetaDnd *dnd) { } +void +meta_dnd_init_xdnd (MetaX11Display *x11_display) +{ + MetaBackend *backend = meta_get_backend (); + Display *xdisplay = x11_display->xdisplay; + Window xwindow, overlay_xwindow; + long xdnd_version = 5; + + overlay_xwindow = meta_get_overlay_window (x11_display->display); + xwindow = meta_backend_x11_get_xwindow (META_BACKEND_X11 (backend)); + + XChangeProperty (xdisplay, xwindow, + XInternAtom (xdisplay, "XdndAware", TRUE), XA_ATOM, + 32, PropModeReplace, + (const unsigned char *) &xdnd_version, 1); + + XChangeProperty (xdisplay, overlay_xwindow, + XInternAtom (xdisplay, "XdndProxy", TRUE), XA_WINDOW, + 32, PropModeReplace, (const unsigned char *) &xwindow, 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, xwindow, + XInternAtom (xdisplay, "XdndProxy", TRUE), XA_WINDOW, + 32, PropModeReplace, (const unsigned char *) &xwindow, 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 #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; }