diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2016-02-22 19:42:23 +0100 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2016-11-22 12:01:37 +0000 |
commit | 11f8fcbefeb89336dba6ec4ea68d100212bd26e4 (patch) | |
tree | be271fde4eb2c1f6adad5713fe09ee4e01627c25 /xwayland | |
parent | 24d306ccd84c78a9c1c009993604ae86446c93ad (diff) |
xwayland: Create the drag-and-drop window in weston_wm_dnd_init
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@gnome.org>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Diffstat (limited to 'xwayland')
-rw-r--r-- | xwayland/dnd.c | 70 |
1 files changed, 24 insertions, 46 deletions
diff --git a/xwayland/dnd.c b/xwayland/dnd.c index 41727b8c..bb3b8cc6 100644 --- a/xwayland/dnd.c +++ b/xwayland/dnd.c @@ -43,45 +43,6 @@ #include "cairo-util.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; @@ -234,12 +195,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; } @@ -267,7 +222,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 | @@ -275,4 +230,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); } |