diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c index a636096e0..a8382812a 100644 --- a/src/video/wayland/SDL_waylandevents.c +++ b/src/video/wayland/SDL_waylandevents.c @@ -2004,6 +2004,11 @@ static void Wayland_create_data_device(SDL_VideoData *d) { SDL_WaylandDataDevice *data_device = NULL; + if (!d->input->seat) { + /* No seat yet, will be initialized later. */ + return; + } + data_device = SDL_calloc(1, sizeof(*data_device)); if (!data_device) { return; @@ -2027,6 +2032,11 @@ static void Wayland_create_primary_selection_device(SDL_VideoData *d) { SDL_WaylandPrimarySelectionDevice *primary_selection_device = NULL; + if (!d->input->seat) { + /* No seat yet, will be initialized later. */ + return; + } + primary_selection_device = SDL_calloc(1, sizeof(*primary_selection_device)); if (!primary_selection_device) { return; @@ -2051,6 +2061,11 @@ static void Wayland_create_text_input(SDL_VideoData *d) { SDL_WaylandTextInput *text_input = NULL; + if (!d->input->seat) { + /* No seat yet, will be initialized later. */ + return; + } + text_input = SDL_calloc(1, sizeof(*text_input)); if (!text_input) { return; @@ -2392,7 +2407,7 @@ void Wayland_input_add_tablet(struct SDL_WaylandInput *input, struct SDL_Wayland { struct SDL_WaylandTabletInput *tablet_input; - if (!tablet_manager || !input || !input->seat) { + if (!tablet_manager || !input->seat) { return; } @@ -2427,19 +2442,9 @@ void Wayland_input_destroy_tablet(struct SDL_WaylandInput *input) void Wayland_display_add_input(SDL_VideoData *d, uint32_t id, uint32_t version) { - struct SDL_WaylandInput *input; + struct SDL_WaylandInput *input = d->input; - input = SDL_calloc(1, sizeof(*input)); - if (!input) { - return; - } - - input->display = d; input->seat = wl_registry_bind(d->registry, id, &wl_seat_interface, SDL_min(SDL_WL_SEAT_VERSION, version)); - input->sx_w = wl_fixed_from_int(0); - input->sy_w = wl_fixed_from_int(0); - input->xkb.current_group = XKB_GROUP_INVALID; - d->input = input; if (d->data_device_manager) { Wayland_create_data_device(d); diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c index 3620da2e9..cbbb0bb76 100644 --- a/src/video/wayland/SDL_waylandvideo.c +++ b/src/video/wayland/SDL_waylandvideo.c @@ -171,6 +171,7 @@ static SDL_VideoDevice *Wayland_CreateDevice(void) { SDL_VideoDevice *device; SDL_VideoData *data; + struct SDL_WaylandInput *input; struct wl_display *display; /* Are we trying to connect to or are currently in a Wayland session? */ @@ -199,13 +200,29 @@ static SDL_VideoDevice *Wayland_CreateDevice(void) return NULL; } + input = SDL_calloc(1, sizeof(*input)); + if (!input) { + SDL_free(data); + WAYLAND_wl_display_disconnect(display); + SDL_WAYLAND_UnloadSymbols(); + SDL_OutOfMemory(); + return NULL; + } + + input->display = data; + input->sx_w = wl_fixed_from_int(0); + input->sy_w = wl_fixed_from_int(0); + input->xkb.current_group = XKB_GROUP_INVALID; + data->initializing = SDL_TRUE; data->display = display; + data->input = input; /* Initialize all variables that we clean on shutdown */ device = SDL_calloc(1, sizeof(SDL_VideoDevice)); if (!device) { SDL_free(data); + SDL_free(input); WAYLAND_wl_display_disconnect(display); SDL_WAYLAND_UnloadSymbols(); SDL_OutOfMemory(); @@ -849,9 +866,7 @@ static void display_handle_global(void *data, struct wl_registry *registry, uint d->decoration_manager = wl_registry_bind(d->registry, id, &zxdg_decoration_manager_v1_interface, 1); } else if (SDL_strcmp(interface, "zwp_tablet_manager_v2") == 0) { d->tablet_manager = wl_registry_bind(d->registry, id, &zwp_tablet_manager_v2_interface, 1); - if (d->input) { - Wayland_input_add_tablet(d->input, d->tablet_manager); - } + Wayland_input_add_tablet(d->input, d->tablet_manager); } else if (SDL_strcmp(interface, "zxdg_output_manager_v1") == 0) { version = SDL_min(version, 3); /* Versions 1 through 3 are supported. */ d->xdg_output_manager = wl_registry_bind(d->registry, id, &zxdg_output_manager_v1_interface, version);