wayland: Always create the backing input store, even if there is no seat

Fixes a crash if no seat was available at initialization, but still allows for one to still be created later if an input device is added.

Manual backport of 84e47b4

(cherry picked from commit a8eeb181b68b2ee214e9c5f239278147ae0f5fbc)
This commit is contained in:
Frank Praznik 2024-01-22 12:49:05 -05:00
parent ef7261bc41
commit 467f1d52e4
2 changed files with 35 additions and 15 deletions

View file

@ -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);

View file

@ -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);
}
} 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);