@@ -307,14 +307,12 @@ static unsigned int X11_GetXkbVirtualModifierMask(SDL_VideoDevice *_this, const
307
307
SDL_VideoData * videodata = _this -> internal ;
308
308
unsigned int mod_mask = 0 ;
309
309
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 ;
318
316
}
319
317
}
320
318
}
@@ -382,7 +380,7 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event)
382
380
383
381
for (unsigned int i = 0 ; i < XkbNumKbdGroups ; ++ i ) {
384
382
SDL_DestroyKeymap (data -> keyboard .xkb .keymaps [i ]);
385
- data -> keyboard .xkb .keymaps [i ] = SDL_CreateKeymap (false) ;
383
+ data -> keyboard .xkb .keymaps [i ] = NULL ;
386
384
}
387
385
388
386
X11_XkbGetNames (data -> display , XkbVirtualModNamesMask , data -> keyboard .xkb .desc_ptr );
@@ -402,6 +400,18 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event)
402
400
data -> keyboard .numlock_mask = X11_GetXkbVirtualModifierMask (_this , "NumLock" );
403
401
data -> keyboard .scrolllock_mask = X11_GetXkbVirtualModifierMask (_this , "ScrollLock" );
404
402
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
+
405
415
const Uint32 valid_mod_mask = ShiftMask | LockMask | data -> keyboard .alt_mask | data -> keyboard .level3_mask | data -> keyboard .level5_mask ;
406
416
407
417
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)
474
484
#endif
475
485
{
476
486
SDL_Keymap * keymap = SDL_CreateKeymap (true);
487
+ if (!keymap ) {
488
+ return ;
489
+ }
477
490
478
491
if (send_event ) {
479
492
if (data -> keyboard .core .keysym_map ) {
480
493
X11_XFree (data -> keyboard .core .keysym_map );
481
494
}
482
495
X11_XDisplayKeycodes (data -> display , & data -> keyboard .core .min_keycode , & data -> keyboard .core .max_keycode );
483
496
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 );
486
499
}
487
500
488
501
for (Uint32 xkeycode = data -> keyboard .core .min_keycode ; xkeycode <= data -> keyboard .core .max_keycode ; ++ xkeycode ) {
0 commit comments