From 44ec3afb2789fad7c6d8aa762b8686e1275a5980 Mon Sep 17 00:00:00 2001 From: emersion Date: Sat, 16 Feb 2019 11:42:00 +0100 Subject: [PATCH] data-device: fix drag cleanup if not started --- types/data_device/wlr_drag.c | 46 +++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/types/data_device/wlr_drag.c b/types/data_device/wlr_drag.c index 3514a26c..bfdc04aa 100644 --- a/types/data_device/wlr_drag.c +++ b/types/data_device/wlr_drag.c @@ -103,7 +103,7 @@ static void drag_icon_set_mapped(struct wlr_drag_icon *icon, bool mapped) { static void drag_icon_destroy(struct wlr_drag_icon *icon); -static void drag_end(struct wlr_drag *drag) { +static void drag_destroy(struct wlr_drag *drag) { if (drag->cancelling) { return; } @@ -111,28 +111,30 @@ static void drag_end(struct wlr_drag *drag) { wlr_signal_emit_safe(&drag->events.destroy, drag); - wlr_seat_keyboard_end_grab(drag->seat); - switch (drag->grab_type) { - case WLR_DRAG_GRAB_KEYBOARD: - break; - case WLR_DRAG_GRAB_KEYBOARD_POINTER: - wlr_seat_pointer_end_grab(drag->seat); - break; - case WLR_DRAG_GRAB_KEYBOARD_TOUCH: - wlr_seat_touch_end_grab(drag->seat); - break; + if (drag->started) { + wlr_seat_keyboard_end_grab(drag->seat); + switch (drag->grab_type) { + case WLR_DRAG_GRAB_KEYBOARD: + break; + case WLR_DRAG_GRAB_KEYBOARD_POINTER: + wlr_seat_pointer_end_grab(drag->seat); + break; + case WLR_DRAG_GRAB_KEYBOARD_TOUCH: + wlr_seat_touch_end_grab(drag->seat); + break; + } + + drag_set_focus(drag, NULL, 0, 0); + + assert(drag->seat->drag == drag); + drag->seat->drag = NULL; } if (drag->source) { wl_list_remove(&drag->source_destroy.link); } - drag_set_focus(drag, NULL, 0, 0); drag_icon_destroy(drag->icon); - - assert(drag->seat->drag == drag); - drag->seat->drag = NULL; - free(drag); } @@ -191,7 +193,7 @@ static uint32_t drag_handle_pointer_button(struct wlr_seat_pointer_grab *grab, if (grab->seat->pointer_state.button_count == 0 && state == WL_POINTER_BUTTON_STATE_RELEASED) { - drag_end(drag); + drag_destroy(drag); } return 0; @@ -205,7 +207,7 @@ static void drag_handle_pointer_axis(struct wlr_seat_pointer_grab *grab, static void drag_handle_pointer_cancel(struct wlr_seat_pointer_grab *grab) { struct wlr_drag *drag = grab->data; - drag_end(drag); + drag_destroy(drag); } static const struct wlr_pointer_grab_interface @@ -237,7 +239,7 @@ static void drag_handle_touch_up(struct wlr_seat_touch_grab *grab, } } - drag_end(drag); + drag_destroy(drag); } static void drag_handle_touch_motion(struct wlr_seat_touch_grab *grab, @@ -261,7 +263,7 @@ static void drag_handle_touch_enter(struct wlr_seat_touch_grab *grab, static void drag_handle_touch_cancel(struct wlr_seat_touch_grab *grab) { struct wlr_drag *drag = grab->data; - drag_end(drag); + drag_destroy(drag); } static const struct wlr_touch_grab_interface @@ -293,7 +295,7 @@ static void drag_handle_keyboard_modifiers(struct wlr_seat_keyboard_grab *grab, static void drag_handle_keyboard_cancel(struct wlr_seat_keyboard_grab *grab) { struct wlr_drag *drag = grab->data; - drag_end(drag); + drag_destroy(drag); } static const struct wlr_keyboard_grab_interface @@ -312,7 +314,7 @@ static void drag_handle_icon_destroy(struct wl_listener *listener, void *data) { static void drag_handle_drag_source_destroy(struct wl_listener *listener, void *data) { struct wlr_drag *drag = wl_container_of(listener, drag, source_destroy); - drag_end(drag); + drag_destroy(drag); }