diff --git a/src/video/wayland/SDL_waylandopengles.c b/src/video/wayland/SDL_waylandopengles.c index 959ebc8fa..c6d565910 100644 --- a/src/video/wayland/SDL_waylandopengles.c +++ b/src/video/wayland/SDL_waylandopengles.c @@ -138,7 +138,7 @@ Wayland_GLES_SwapWindow(_THIS, SDL_Window *window) /* !!! FIXME: this is just the crucial piece of Wayland_PumpEvents */ WAYLAND_wl_display_flush(display); - if (WAYLAND_wl_display_dispatch_pending(display) > 0) { + if (WAYLAND_wl_display_dispatch_queue_pending(display, data->frame_event_queue) > 0) { /* We dispatched some pending events. Check if the frame callback happened. */ continue; } @@ -161,7 +161,7 @@ Wayland_GLES_SwapWindow(_THIS, SDL_Window *window) break; } - WAYLAND_wl_display_dispatch(display); + WAYLAND_wl_display_dispatch_queue(display, data->frame_event_queue); SDL_UnlockMutex(videodata->display_dispatch_lock); } SDL_AtomicSet(&data->swap_interval_ready, 0); diff --git a/src/video/wayland/SDL_waylandsym.h b/src/video/wayland/SDL_waylandsym.h index 40e6c99a1..37c4b42dd 100644 --- a/src/video/wayland/SDL_waylandsym.h +++ b/src/video/wayland/SDL_waylandsym.h @@ -46,6 +46,8 @@ SDL_WAYLAND_SYM(uint32_t, wl_proxy_get_version, (struct wl_proxy *)) SDL_WAYLAND_SYM(uint32_t, wl_proxy_get_id, (struct wl_proxy *)) SDL_WAYLAND_SYM(const char *, wl_proxy_get_class, (struct wl_proxy *)) SDL_WAYLAND_SYM(void, wl_proxy_set_queue, (struct wl_proxy *, struct wl_event_queue *)) +SDL_WAYLAND_SYM(void *, wl_proxy_create_wrapper, (void *)) +SDL_WAYLAND_SYM(void, wl_proxy_wrapper_destroy, (void *)) SDL_WAYLAND_SYM(struct wl_display *, wl_display_connect, (const char *)) SDL_WAYLAND_SYM(struct wl_display *, wl_display_connect_to_fd, (int)) SDL_WAYLAND_SYM(void, wl_display_disconnect, (struct wl_display *)) @@ -58,6 +60,7 @@ 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(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)) SDL_WAYLAND_SYM(void, wl_list_init, (struct wl_list *)) SDL_WAYLAND_SYM(void, wl_list_insert, (struct wl_list *, struct wl_list *) ) diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c index f12c14255..02443ec4e 100644 --- a/src/video/wayland/SDL_waylandwindow.c +++ b/src/video/wayland/SDL_waylandwindow.c @@ -146,7 +146,7 @@ handle_surface_frame_done(void *data, struct wl_callback *cb, uint32_t time) SDL_AtomicSet(&wind->swap_interval_ready, 1); /* mark window as ready to present again. */ /* reset this callback to fire again once a new frame was presented and compositor wants the next one. */ - wind->frame_callback = wl_surface_frame(wind->surface); + wind->frame_callback = wl_surface_frame(wind->frame_surface_wrapper); wl_callback_destroy(cb); wl_callback_add_listener(wind->frame_callback, &surface_frame_listener, data); } @@ -1237,7 +1237,10 @@ int Wayland_CreateWindow(_THIS, SDL_Window *window) * window isn't visible. */ if (window->flags & SDL_WINDOW_OPENGL) { - data->frame_callback = wl_surface_frame(data->surface); + data->frame_event_queue = WAYLAND_wl_display_create_queue(data->waylandData->display); + data->frame_surface_wrapper = WAYLAND_wl_proxy_create_wrapper(data->surface); + WAYLAND_wl_proxy_set_queue((struct wl_proxy *)data->frame_surface_wrapper, data->frame_event_queue); + data->frame_callback = wl_surface_frame(data->frame_surface_wrapper); wl_callback_add_listener(data->frame_callback, &surface_frame_listener, data); } @@ -1477,6 +1480,8 @@ void Wayland_DestroyWindow(_THIS, SDL_Window *window) SDL_free(wind->outputs); if (wind->frame_callback) { + WAYLAND_wl_event_queue_destroy(wind->frame_event_queue); + WAYLAND_wl_proxy_wrapper_destroy(wind->frame_surface_wrapper); wl_callback_destroy(wind->frame_callback); } diff --git a/src/video/wayland/SDL_waylandwindow.h b/src/video/wayland/SDL_waylandwindow.h index 852a8dc0a..1aaa64521 100644 --- a/src/video/wayland/SDL_waylandwindow.h +++ b/src/video/wayland/SDL_waylandwindow.h @@ -53,6 +53,8 @@ typedef struct { SDL_VideoData *waylandData; struct wl_surface *surface; struct wl_callback *frame_callback; + struct wl_event_queue *frame_event_queue; + struct wl_surface *frame_surface_wrapper; union { #ifdef HAVE_LIBDECOR_H SDL_libdecor_surface libdecor;