diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c index f9397fd01..2f842e194 100644 --- a/src/video/wayland/SDL_waylandevents.c +++ b/src/video/wayland/SDL_waylandevents.c @@ -178,15 +178,23 @@ void Wayland_PumpEvents(_THIS) { SDL_VideoData *d = _this->driverdata; + int err; WAYLAND_wl_display_flush(d->display); if (SDL_IOReady(WAYLAND_wl_display_get_fd(d->display), SDL_FALSE, 0)) { - WAYLAND_wl_display_dispatch(d->display); + err = WAYLAND_wl_display_dispatch(d->display); + } else { + err = WAYLAND_wl_display_dispatch_pending(d->display); } - else - { - WAYLAND_wl_display_dispatch_pending(d->display); + if (err == -1 && !d->display_disconnected) { + /* Something has failed with the Wayland connection -- for example, + * the compositor may have shut down and closed its end of the socket, + * or there is a library-specific error. No recovery is possible. */ + d->display_disconnected = 1; + /* Only send a single quit message, as application shutdown might call + * SDL_PumpEvents */ + SDL_SendQuit(); } } diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c index b128bb84b..c85860614 100644 --- a/src/video/wayland/SDL_waylandvideo.c +++ b/src/video/wayland/SDL_waylandvideo.c @@ -412,10 +412,9 @@ static const struct wl_registry_listener registry_listener = { int Wayland_VideoInit(_THIS) { - SDL_VideoData *data = SDL_malloc(sizeof *data); + SDL_VideoData *data = SDL_calloc(1, sizeof(*data)); if (data == NULL) return SDL_OutOfMemory(); - memset(data, 0, sizeof *data); _this->driverdata = data; diff --git a/src/video/wayland/SDL_waylandvideo.h b/src/video/wayland/SDL_waylandvideo.h index b6499d000..127c8c082 100644 --- a/src/video/wayland/SDL_waylandvideo.h +++ b/src/video/wayland/SDL_waylandvideo.h @@ -48,6 +48,7 @@ struct qt_windowmanager; typedef struct { struct wl_display *display; + int display_disconnected; struct wl_registry *registry; struct wl_compositor *compositor; struct wl_shm *shm;