[PATCH weston] xwayland: Create the drag-and-drop window in weston_wm_dnd_init
Carlos Garnacho
carlosg at gnome.org
Mon Feb 22 18:42:23 UTC 2016
Just to keep it hidden so far... A lot of the plumbing necessary to
handle x11->wayland drag and drop is missing, and the current
partial handling gets in the middle for X11 drag-and-drop itself
to work.
The approach is well directed, but needs some further work, till
then, just keep our fake drag-and-drop target hidden. This allows
drag-and-drop to work between X11 clients in Xwayland, and avoids
a crash with (currently unhandled) wl_resource-less data sources.
Fixes https://bugs.freedesktop.org/show_bug.cgi?id=94218
Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
---
I'm sending this patch with the promise to look into improving the
drag-and-drop interoperation situation at some point before 1.11.
My intention is copying what mutter is doing currently, and works
nicely there:
* Set up an special pointer grab that still relays pointer and
keyboard events to the DnD X11 source client, needed as it's
still driving DnD as X11 expects of it.
* Hook to motion events in that grab so we resize/move/map the
fake DnD target window to have the same position than the
wayland app the pointer is above. That'll make the X11 source
side see something consistent. This is why keeping
wm->dnd_window around makes sense IMO.
* Reply appropriately to XdndPosition/XdndLeave/XdndDrop
and translate those to the wayland side.
But at the moment, I'm doing just the minimals to avoid the crash,
and allow X11<->X11 drag-and-drop to work.
xwayland/dnd.c | 70 ++++++++++++++++++++--------------------------------------
1 file changed, 24 insertions(+), 46 deletions(-)
diff --git a/xwayland/dnd.c b/xwayland/dnd.c
index f17e4cd..1130f56 100644
--- a/xwayland/dnd.c
+++ b/xwayland/dnd.c
@@ -42,45 +42,6 @@
#include "compositor.h"
#include "hash.h"
-static void
-weston_dnd_start(struct weston_wm *wm, xcb_window_t owner)
-{
- uint32_t values[1], version = 4;
-
- wm->dnd_window = xcb_generate_id(wm->conn);
- values[0] =
- XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
- XCB_EVENT_MASK_PROPERTY_CHANGE;
-
- xcb_create_window(wm->conn,
- XCB_COPY_FROM_PARENT,
- wm->dnd_window,
- wm->screen->root,
- 0, 0,
- 8192, 8192,
- 0,
- XCB_WINDOW_CLASS_INPUT_ONLY,
- wm->screen->root_visual,
- XCB_CW_EVENT_MASK, values);
- xcb_change_property(wm->conn,
- XCB_PROP_MODE_REPLACE,
- wm->dnd_window,
- wm->atom.xdnd_aware,
- XCB_ATOM_ATOM,
- 32, /* format */
- 1, &version);
-
- xcb_map_window(wm->conn, wm->dnd_window);
- wm->dnd_owner = owner;
-}
-
-static void
-weston_dnd_stop(struct weston_wm *wm)
-{
- xcb_destroy_window(wm->conn, wm->dnd_window);
- wm->dnd_window = XCB_WINDOW_NONE;
-}
-
struct dnd_data_source {
struct weston_data_source base;
struct weston_wm *wm;
@@ -233,12 +194,6 @@ weston_wm_handle_dnd_event(struct weston_wm *wm,
weston_log("XdndSelection owner: %d!\n",
xfixes_selection_notify->owner);
-
- if (xfixes_selection_notify->owner != XCB_WINDOW_NONE)
- weston_dnd_start(wm, xfixes_selection_notify->owner);
- else
- weston_dnd_stop(wm);
-
return 1;
}
@@ -266,7 +221,7 @@ weston_wm_handle_dnd_event(struct weston_wm *wm,
void
weston_wm_dnd_init(struct weston_wm *wm)
{
- uint32_t mask;
+ uint32_t values[1], version = 4, mask;
mask =
XCB_XFIXES_SELECTION_EVENT_MASK_SET_SELECTION_OWNER |
@@ -274,4 +229,27 @@ weston_wm_dnd_init(struct weston_wm *wm)
XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_CLIENT_CLOSE;
xcb_xfixes_select_selection_input(wm->conn, wm->selection_window,
wm->atom.xdnd_selection, mask);
+
+ wm->dnd_window = xcb_generate_id(wm->conn);
+ values[0] =
+ XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
+ XCB_EVENT_MASK_PROPERTY_CHANGE;
+
+ xcb_create_window(wm->conn,
+ XCB_COPY_FROM_PARENT,
+ wm->dnd_window,
+ wm->screen->root,
+ 0, 0,
+ 8192, 8192,
+ 0,
+ XCB_WINDOW_CLASS_INPUT_ONLY,
+ wm->screen->root_visual,
+ XCB_CW_EVENT_MASK, values);
+ xcb_change_property(wm->conn,
+ XCB_PROP_MODE_REPLACE,
+ wm->dnd_window,
+ wm->atom.xdnd_aware,
+ XCB_ATOM_ATOM,
+ 32, /* format */
+ 1, &version);
}
--
2.5.0
More information about the wayland-devel
mailing list