aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorNick Diego Yamane <nickdiego@igalia.com>2020-07-06 17:17:04 -0400
committerSimon Ser <contact@emersion.fr>2020-07-07 00:05:35 +0200
commite5954f321f76c9337efaf9c5f66140bfba2bae77 (patch)
treed3ad2b6b85e942079a3b5407ca7085bcba9866fc /sway
parentbac9559665bc908e4f61a6405a6ce5109956f4a3 (diff)
seat/dnd: support null drag icon surfaces
As per the Wayland spec [1]: > The icon surface is an optional (can be NULL) surface that provides an > icon to be moved around with the cursor. However, as of now Sway "start_drag" signal handler does not starts the DND session unless a non-NULL drag icons is provided. This patch fixes it by skipping handling of the drag icon if it is null. Fixes #5509 [1] https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_data_device Signed-off-by: Nick Diego Yamane <nickdiego@igalia.com>
Diffstat (limited to 'sway')
-rw-r--r--sway/input/seat.c42
1 files changed, 20 insertions, 22 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c
index 656e3e7e..bcf01962 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -470,31 +470,29 @@ static void handle_start_drag(struct wl_listener *listener, void *data) {
wl_signal_add(&wlr_drag->events.destroy, &drag->destroy);
struct wlr_drag_icon *wlr_drag_icon = wlr_drag->icon;
- if (wlr_drag_icon == NULL) {
- return;
- }
-
- struct sway_drag_icon *icon = calloc(1, sizeof(struct sway_drag_icon));
- if (icon == NULL) {
- sway_log(SWAY_ERROR, "Allocation failed");
- return;
- }
- icon->seat = seat;
- icon->wlr_drag_icon = wlr_drag_icon;
- wlr_drag_icon->data = icon;
+ if (wlr_drag_icon != NULL) {
+ struct sway_drag_icon *icon = calloc(1, sizeof(struct sway_drag_icon));
+ if (icon == NULL) {
+ sway_log(SWAY_ERROR, "Allocation failed");
+ return;
+ }
+ icon->seat = seat;
+ icon->wlr_drag_icon = wlr_drag_icon;
+ wlr_drag_icon->data = icon;
- icon->surface_commit.notify = drag_icon_handle_surface_commit;
- wl_signal_add(&wlr_drag_icon->surface->events.commit, &icon->surface_commit);
- icon->unmap.notify = drag_icon_handle_unmap;
- wl_signal_add(&wlr_drag_icon->events.unmap, &icon->unmap);
- icon->map.notify = drag_icon_handle_map;
- wl_signal_add(&wlr_drag_icon->events.map, &icon->map);
- icon->destroy.notify = drag_icon_handle_destroy;
- wl_signal_add(&wlr_drag_icon->events.destroy, &icon->destroy);
+ icon->surface_commit.notify = drag_icon_handle_surface_commit;
+ wl_signal_add(&wlr_drag_icon->surface->events.commit, &icon->surface_commit);
+ icon->unmap.notify = drag_icon_handle_unmap;
+ wl_signal_add(&wlr_drag_icon->events.unmap, &icon->unmap);
+ icon->map.notify = drag_icon_handle_map;
+ wl_signal_add(&wlr_drag_icon->events.map, &icon->map);
+ icon->destroy.notify = drag_icon_handle_destroy;
+ wl_signal_add(&wlr_drag_icon->events.destroy, &icon->destroy);
- wl_list_insert(&root->drag_icons, &icon->link);
+ wl_list_insert(&root->drag_icons, &icon->link);
- drag_icon_update_position(icon);
+ drag_icon_update_position(icon);
+ }
seatop_begin_default(seat);
}