x11: Fail gracefully on keymap creation failure
This commit is contained in:
@@ -307,8 +307,7 @@ static unsigned int X11_GetXkbVirtualModifierMask(SDL_VideoDevice *_this, const
|
|||||||
SDL_VideoData *videodata = _this->internal;
|
SDL_VideoData *videodata = _this->internal;
|
||||||
unsigned int mod_mask = 0;
|
unsigned int mod_mask = 0;
|
||||||
|
|
||||||
if (videodata->keyboard.xkb_enabled) {
|
const Atom vmod = X11_XInternAtom(videodata->display, vmod_name, True);
|
||||||
Atom vmod = X11_XInternAtom(videodata->display, vmod_name, True);
|
|
||||||
if (vmod != None) {
|
if (vmod != None) {
|
||||||
for (int i = 0; i < XkbNumVirtualMods; ++i) {
|
for (int i = 0; i < XkbNumVirtualMods; ++i) {
|
||||||
if (vmod == videodata->keyboard.xkb.desc_ptr->names->vmods[i]) {
|
if (vmod == videodata->keyboard.xkb.desc_ptr->names->vmods[i]) {
|
||||||
@@ -317,7 +316,6 @@ static unsigned int X11_GetXkbVirtualModifierMask(SDL_VideoDevice *_this, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return mod_mask;
|
return mod_mask;
|
||||||
}
|
}
|
||||||
@@ -382,7 +380,7 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event)
|
|||||||
|
|
||||||
for (unsigned int i = 0; i < XkbNumKbdGroups; ++i) {
|
for (unsigned int i = 0; i < XkbNumKbdGroups; ++i) {
|
||||||
SDL_DestroyKeymap(data->keyboard.xkb.keymaps[i]);
|
SDL_DestroyKeymap(data->keyboard.xkb.keymaps[i]);
|
||||||
data->keyboard.xkb.keymaps[i] = SDL_CreateKeymap(false);
|
data->keyboard.xkb.keymaps[i] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
X11_XkbGetNames(data->display, XkbVirtualModNamesMask, data->keyboard.xkb.desc_ptr);
|
X11_XkbGetNames(data->display, XkbVirtualModNamesMask, data->keyboard.xkb.desc_ptr);
|
||||||
@@ -402,6 +400,18 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event)
|
|||||||
data->keyboard.numlock_mask = X11_GetXkbVirtualModifierMask(_this, "NumLock");
|
data->keyboard.numlock_mask = X11_GetXkbVirtualModifierMask(_this, "NumLock");
|
||||||
data->keyboard.scrolllock_mask = X11_GetXkbVirtualModifierMask(_this, "ScrollLock");
|
data->keyboard.scrolllock_mask = X11_GetXkbVirtualModifierMask(_this, "ScrollLock");
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < XkbNumKbdGroups; ++i) {
|
||||||
|
data->keyboard.xkb.keymaps[i] = SDL_CreateKeymap(false);
|
||||||
|
if (!data->keyboard.xkb.keymaps[i]) {
|
||||||
|
for (unsigned int j = 0; j < i; ++j) {
|
||||||
|
SDL_DestroyKeymap(data->keyboard.xkb.keymaps[i]);
|
||||||
|
data->keyboard.xkb.keymaps[j] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const Uint32 valid_mod_mask = ShiftMask | LockMask | data->keyboard.alt_mask | data->keyboard.level3_mask | data->keyboard.level5_mask;
|
const Uint32 valid_mod_mask = ShiftMask | LockMask | data->keyboard.alt_mask | data->keyboard.level3_mask | data->keyboard.level5_mask;
|
||||||
|
|
||||||
for (Uint32 xkeycode = data->keyboard.xkb.desc_ptr->min_key_code; xkeycode < data->keyboard.xkb.desc_ptr->max_key_code; ++xkeycode) {
|
for (Uint32 xkeycode = data->keyboard.xkb.desc_ptr->min_key_code; xkeycode < data->keyboard.xkb.desc_ptr->max_key_code; ++xkeycode) {
|
||||||
@@ -474,6 +484,9 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
SDL_Keymap *keymap = SDL_CreateKeymap(true);
|
SDL_Keymap *keymap = SDL_CreateKeymap(true);
|
||||||
|
if (!keymap) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (send_event) {
|
if (send_event) {
|
||||||
if (data->keyboard.core.keysym_map) {
|
if (data->keyboard.core.keysym_map) {
|
||||||
|
|||||||
Reference in New Issue
Block a user