|
@@ -3065,12 +3065,14 @@ static void data_device_handle_selection(void *data, struct wl_data_device *wl_d
|
|
|
SDL_LogTrace(SDL_LOG_CATEGORY_INPUT,
|
|
SDL_LogTrace(SDL_LOG_CATEGORY_INPUT,
|
|
|
". In data_device_listener . data_device_handle_selection on data_offer 0x%08x",
|
|
". In data_device_listener . data_device_handle_selection on data_offer 0x%08x",
|
|
|
(id ? WAYLAND_wl_proxy_get_id((struct wl_proxy *)id) : -1));
|
|
(id ? WAYLAND_wl_proxy_get_id((struct wl_proxy *)id) : -1));
|
|
|
- if (data_device->selection_offer != offer) {
|
|
|
|
|
- Wayland_data_offer_destroy(data_device->selection_offer);
|
|
|
|
|
- data_device->selection_offer = offer;
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- Wayland_data_offer_notify_from_mimes(offer, true);
|
|
|
|
|
|
|
+ // Don't notify when clearing the old selection offer if doing so will inadvertently clear the selection source.
|
|
|
|
|
+ const bool notify = offer || (!offer && data_device->selection_offer && (!data_device->selection_offer->callback || !data_device->selection_source));
|
|
|
|
|
+ Wayland_data_offer_destroy(data_device->selection_offer);
|
|
|
|
|
+ data_device->selection_offer = offer;
|
|
|
|
|
+ if (notify) {
|
|
|
|
|
+ Wayland_data_offer_notify_from_mimes(offer, true);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static const struct wl_data_device_listener data_device_listener = {
|
|
static const struct wl_data_device_listener data_device_listener = {
|