From a0bb2f82ec0684dfa36664ceb5c0f89ed6142d4d Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Wed, 11 Nov 2020 03:33:41 +0100 Subject: [PATCH 2/2] wayland: Don't crash when the properties of already existing wl_output change --- src/video/wayland/SDL_waylandvideo.c | 9 ++++++--- src/video/wayland/SDL_waylandvideo.h | 1 + src/video/wayland/SDL_waylandwindow.c | 8 ++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c index 6fafe1880..becf67628 100644 --- a/src/video/wayland/SDL_waylandvideo.c +++ b/src/video/wayland/SDL_waylandvideo.c @@ -273,10 +273,14 @@ static void display_handle_done(void *data, struct wl_output *output) { - /* !!! FIXME: this will fail on any further property changes! */ SDL_VideoDisplay *display = data; SDL_WaylandOutputData* driverdata = display->driverdata; SDL_DisplayMode mode; + + if (driverdata->mode) + return; + + driverdata->mode = SDL_TRUE; SDL_zero(mode); mode.format = SDL_PIXELFORMAT_RGB888; @@ -293,9 +297,7 @@ display_handle_done(void *data, display->desktop_mode = mode; SDL_AddVideoDisplay(display, SDL_FALSE); - wl_output_set_user_data(output, display->driverdata); SDL_free(display->name); - SDL_free(display); } static void @@ -335,6 +337,7 @@ Wayland_add_display(SDL_VideoData *d, uint32_t id) data = SDL_malloc(sizeof *data); data->output = output; data->scale_factor = 1.0; + data->done = SDL_FALSE; display->driverdata = data; wl_output_add_listener(output, &output_listener, display); diff --git a/src/video/wayland/SDL_waylandvideo.h b/src/video/wayland/SDL_waylandvideo.h index 04083bff2..79544a79b 100644 --- a/src/video/wayland/SDL_waylandvideo.h +++ b/src/video/wayland/SDL_waylandvideo.h @@ -91,6 +91,7 @@ typedef struct { struct wl_output *output; float scale_factor; int width, height, refresh, transform; + SDL_bool done; } SDL_WaylandOutputData; #endif /* SDL_waylandvideo_h_ */ diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c index e20ed40ee..559b61aba 100644 --- a/src/video/wayland/SDL_waylandwindow.c +++ b/src/video/wayland/SDL_waylandwindow.c @@ -414,11 +414,15 @@ update_scale_factor(SDL_WindowData *window) { } if (FULLSCREEN_VISIBLE(window->sdlwindow) && window->sdlwindow->fullscreen_mode.driverdata) { - new_factor = ((SDL_WaylandOutputData*)(wl_output_get_user_data(window->sdlwindow->fullscreen_mode.driverdata)))->scale_factor; + SDL_VideoDisplay *display = wl_output_get_user_data(window->sdlwindow->fullscreen_mode.driverdata); + SDL_WaylandOutputData* driverdata = display->driverdata; + new_factor = driverdata->scale_factor; } for (i = 0; i < window->num_outputs; i++) { - float factor = ((SDL_WaylandOutputData*)(wl_output_get_user_data(window->outputs[i])))->scale_factor; + SDL_VideoDisplay *display = wl_output_get_user_data(window->outputs[i]); + SDL_WaylandOutputData* driverdata = display->driverdata; + float factor = driverdata->scale_factor; if (factor > new_factor) { new_factor = factor; } -- 2.30.0