mirror of
https://github.com/Ryujinx/SDL.git
synced 2024-12-22 20:25:38 +00:00
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:
parent
ef7261bc41
commit
467f1d52e4
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue