Skip to content

Commit 8c4e048

Browse files
committed
x11: Fail gracefully on keymap creation failure
1 parent 2a0e751 commit 8c4e048

File tree

1 file changed

+24
-11
lines changed

1 file changed

+24
-11
lines changed

src/video/x11/SDL_x11keyboard.c

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -307,14 +307,12 @@ static unsigned int X11_GetXkbVirtualModifierMask(SDL_VideoDevice *_this, const
307307
SDL_VideoData *videodata = _this->internal;
308308
unsigned int mod_mask = 0;
309309

310-
if (videodata->keyboard.xkb_enabled) {
311-
Atom vmod = X11_XInternAtom(videodata->display, vmod_name, True);
312-
if (vmod != None) {
313-
for (int i = 0; i < XkbNumVirtualMods; ++i) {
314-
if (vmod == videodata->keyboard.xkb.desc_ptr->names->vmods[i]) {
315-
mod_mask = videodata->keyboard.xkb.desc_ptr->server->vmods[i];
316-
break;
317-
}
310+
const Atom vmod = X11_XInternAtom(videodata->display, vmod_name, True);
311+
if (vmod != None) {
312+
for (int i = 0; i < XkbNumVirtualMods; ++i) {
313+
if (vmod == videodata->keyboard.xkb.desc_ptr->names->vmods[i]) {
314+
mod_mask = videodata->keyboard.xkb.desc_ptr->server->vmods[i];
315+
break;
318316
}
319317
}
320318
}
@@ -382,7 +380,7 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event)
382380

383381
for (unsigned int i = 0; i < XkbNumKbdGroups; ++i) {
384382
SDL_DestroyKeymap(data->keyboard.xkb.keymaps[i]);
385-
data->keyboard.xkb.keymaps[i] = SDL_CreateKeymap(false);
383+
data->keyboard.xkb.keymaps[i] = NULL;
386384
}
387385

388386
X11_XkbGetNames(data->display, XkbVirtualModNamesMask, data->keyboard.xkb.desc_ptr);
@@ -402,6 +400,18 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event)
402400
data->keyboard.numlock_mask = X11_GetXkbVirtualModifierMask(_this, "NumLock");
403401
data->keyboard.scrolllock_mask = X11_GetXkbVirtualModifierMask(_this, "ScrollLock");
404402

403+
for (unsigned int i = 0; i < XkbNumKbdGroups; ++i) {
404+
data->keyboard.xkb.keymaps[i] = SDL_CreateKeymap(false);
405+
if (!data->keyboard.xkb.keymaps[i]) {
406+
for (unsigned int j = 0; j < i; ++j) {
407+
SDL_DestroyKeymap(data->keyboard.xkb.keymaps[i]);
408+
data->keyboard.xkb.keymaps[j] = NULL;
409+
}
410+
411+
return;
412+
}
413+
}
414+
405415
const Uint32 valid_mod_mask = ShiftMask | LockMask | data->keyboard.alt_mask | data->keyboard.level3_mask | data->keyboard.level5_mask;
406416

407417
for (Uint32 xkeycode = data->keyboard.xkb.desc_ptr->min_key_code; xkeycode < data->keyboard.xkb.desc_ptr->max_key_code; ++xkeycode) {
@@ -474,15 +484,18 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event)
474484
#endif
475485
{
476486
SDL_Keymap *keymap = SDL_CreateKeymap(true);
487+
if (!keymap) {
488+
return;
489+
}
477490

478491
if (send_event) {
479492
if (data->keyboard.core.keysym_map) {
480493
X11_XFree(data->keyboard.core.keysym_map);
481494
}
482495
X11_XDisplayKeycodes(data->display, &data->keyboard.core.min_keycode, &data->keyboard.core.max_keycode);
483496
data->keyboard.core.keysym_map = X11_XGetKeyboardMapping(data->display, data->keyboard.core.min_keycode,
484-
data->keyboard.core.max_keycode - data->keyboard.core.min_keycode,
485-
&data->keyboard.core.keysyms_per_key);
497+
data->keyboard.core.max_keycode - data->keyboard.core.min_keycode,
498+
&data->keyboard.core.keysyms_per_key);
486499
}
487500

488501
for (Uint32 xkeycode = data->keyboard.core.min_keycode; xkeycode <= data->keyboard.core.max_keycode; ++xkeycode) {

0 commit comments

Comments
 (0)