wayland: Cleanup and return if keymap allocation fails
This commit is contained in:
@@ -1591,9 +1591,18 @@ static void keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
|
|||||||
seat->keyboard.xkb.num_layouts = WAYLAND_xkb_keymap_num_layouts(seat->keyboard.xkb.keymap);
|
seat->keyboard.xkb.num_layouts = WAYLAND_xkb_keymap_num_layouts(seat->keyboard.xkb.keymap);
|
||||||
if (seat->keyboard.xkb.num_layouts) {
|
if (seat->keyboard.xkb.num_layouts) {
|
||||||
seat->keyboard.sdl_keymap = SDL_calloc(seat->keyboard.xkb.num_layouts, sizeof(SDL_Keymap *));
|
seat->keyboard.sdl_keymap = SDL_calloc(seat->keyboard.xkb.num_layouts, sizeof(SDL_Keymap *));
|
||||||
|
if (!seat->keyboard.sdl_keymap) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (xkb_layout_index_t i = 0; i < seat->keyboard.xkb.num_layouts; ++i) {
|
for (xkb_layout_index_t i = 0; i < seat->keyboard.xkb.num_layouts; ++i) {
|
||||||
seat->keyboard.sdl_keymap[i] = SDL_CreateKeymap(false);
|
seat->keyboard.sdl_keymap[i] = SDL_CreateKeymap(false);
|
||||||
if (!seat->keyboard.sdl_keymap) {
|
if (!seat->keyboard.sdl_keymap[i]) {
|
||||||
|
for (xkb_layout_index_t j = 0; j < i; ++j) {
|
||||||
|
SDL_DestroyKeymap(seat->keyboard.sdl_keymap[j]);
|
||||||
|
}
|
||||||
|
SDL_free(seat->keyboard.sdl_keymap);
|
||||||
|
seat->keyboard.sdl_keymap = NULL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2095,7 +2104,7 @@ static void keyboard_handle_key(void *data, struct wl_keyboard *keyboard,
|
|||||||
Wayland_HandleModifierKeys(seat, scancode, state == WL_KEYBOARD_KEY_STATE_PRESSED);
|
Wayland_HandleModifierKeys(seat, scancode, state == WL_KEYBOARD_KEY_STATE_PRESSED);
|
||||||
|
|
||||||
// If we have a key with unknown scancode, check if the keysym corresponds to a valid Unicode value, and assign it a reserved scancode.
|
// If we have a key with unknown scancode, check if the keysym corresponds to a valid Unicode value, and assign it a reserved scancode.
|
||||||
if (scancode == SDL_SCANCODE_UNKNOWN && syms) {
|
if (scancode == SDL_SCANCODE_UNKNOWN && syms && seat->keyboard.sdl_keymap) {
|
||||||
const SDL_Keycode keycode = (SDL_Keycode)SDL_KeySymToUcs4(syms[0]);
|
const SDL_Keycode keycode = (SDL_Keycode)SDL_KeySymToUcs4(syms[0]);
|
||||||
if (keycode != SDLK_UNKNOWN) {
|
if (keycode != SDLK_UNKNOWN) {
|
||||||
SDL_Keymod modstate = SDL_KMOD_NONE;
|
SDL_Keymod modstate = SDL_KMOD_NONE;
|
||||||
|
|||||||
Reference in New Issue
Block a user