wayland: Rollback the round trip when reading data offers

The bug this appeared to fix turned out to be randomly occurring and has other causes, and the read pipe is already polled for readiness, so this extra overhead isn't necessary.
This commit is contained in:
Frank Praznik 2025-03-07 12:51:28 -05:00
parent fc35107854
commit 84d047cc11
No known key found for this signature in database
2 changed files with 2 additions and 13 deletions

View File

@ -370,15 +370,10 @@ void *Wayland_data_offer_receive(SDL_WaylandDataOffer *offer,
} else if (pipe2(pipefd, O_CLOEXEC | O_NONBLOCK) == -1) {
SDL_SetError("Could not read pipe");
} else {
struct wl_event_queue *queue = WAYLAND_wl_display_create_queue(data_device->video_data->display);
WAYLAND_wl_proxy_set_queue((struct wl_proxy *)offer->offer, queue);
wl_data_offer_receive(offer->offer, mime_type, pipefd[1]);
close(pipefd[1]);
WAYLAND_wl_display_roundtrip_queue(data_device->video_data->display, queue);
WAYLAND_wl_proxy_set_queue((struct wl_proxy *)offer->offer, NULL);
WAYLAND_wl_event_queue_destroy(queue);
WAYLAND_wl_display_flush(data_device->video_data->display);
while (read_pipe(pipefd[0], &buffer, length) > 0) {
}
@ -409,15 +404,10 @@ void *Wayland_primary_selection_offer_receive(SDL_WaylandPrimarySelectionOffer *
} else if (pipe2(pipefd, O_CLOEXEC | O_NONBLOCK) == -1) {
SDL_SetError("Could not read pipe");
} else {
struct wl_event_queue *queue = WAYLAND_wl_display_create_queue(primary_selection_device->video_data->display);
WAYLAND_wl_proxy_set_queue((struct wl_proxy *)offer->offer, queue);
zwp_primary_selection_offer_v1_receive(offer->offer, mime_type, pipefd[1]);
close(pipefd[1]);
WAYLAND_wl_display_roundtrip_queue(primary_selection_device->video_data->display, queue);
WAYLAND_wl_proxy_set_queue((struct wl_proxy *)offer->offer, NULL);
WAYLAND_wl_event_queue_destroy(queue);
WAYLAND_wl_display_flush(primary_selection_device->video_data->display);
while (read_pipe(pipefd[0], &buffer, length) > 0) {
}

View File

@ -65,7 +65,6 @@ SDL_WAYLAND_SYM(void, wl_display_cancel_read, (struct wl_display *))
SDL_WAYLAND_SYM(int, wl_display_get_error, (struct wl_display *))
SDL_WAYLAND_SYM(int, wl_display_flush, (struct wl_display *))
SDL_WAYLAND_SYM(int, wl_display_roundtrip, (struct wl_display *))
SDL_WAYLAND_SYM(int, wl_display_roundtrip_queue, (struct wl_display *, struct wl_event_queue *))
SDL_WAYLAND_SYM(struct wl_event_queue *, wl_display_create_queue, (struct wl_display *))
SDL_WAYLAND_SYM(void, wl_event_queue_destroy, (struct wl_event_queue *))
SDL_WAYLAND_SYM(void, wl_log_set_handler_client, (wl_log_func_t))