wayland: Don't add keys with the super/GUI modifier to the keymap

SDL normalizes the super/GUI modifier away, so adding a key with this modifier will overwrite the base, unmodified value.
This commit is contained in:
Frank Praznik
2026-03-02 18:10:41 -05:00
parent 2e3300e872
commit 8c8efd4ccd
2 changed files with 4 additions and 3 deletions

View File

@@ -1602,13 +1602,14 @@ static void Wayland_KeymapIterator(struct xkb_keymap *keymap, xkb_keycode_t key,
{
SDL_WaylandSeat *seat = (SDL_WaylandSeat *)data;
const xkb_keysym_t *syms;
SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN;
// Only the shift, alt, level 3, level 5 and caps lock modifiers affect SDL keymaps.
const xkb_mod_mask_t xkb_valid_mod_mask = seat->keyboard.xkb.shift_mask |
seat->keyboard.xkb.alt_mask |
seat->keyboard.xkb.gui_mask |
seat->keyboard.xkb.level3_mask |
seat->keyboard.xkb.level5_mask |
seat->keyboard.xkb.caps_mask;
SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN;
// Look up the scancode for hardware keyboards. Virtual keyboards get the scancode from the keysym.
if (!seat->keyboard.is_virtual) {
@@ -1647,7 +1648,6 @@ static void Wayland_KeymapIterator(struct xkb_keymap *keymap, xkb_keycode_t key,
const SDL_Keymod sdl_mod = (xkb_mod_masks[mask] & seat->keyboard.xkb.shift_mask ? SDL_KMOD_SHIFT : 0) |
(xkb_mod_masks[mask] & seat->keyboard.xkb.alt_mask ? SDL_KMOD_ALT : 0) |
(xkb_mod_masks[mask] & seat->keyboard.xkb.gui_mask ? SDL_KMOD_GUI : 0) |
(xkb_mod_masks[mask] & seat->keyboard.xkb.level3_mask ? SDL_KMOD_MODE : 0) |
(xkb_mod_masks[mask] & seat->keyboard.xkb.level5_mask ? SDL_KMOD_LEVEL5 : 0) |
(xkb_mod_masks[mask] & seat->keyboard.xkb.caps_mask ? SDL_KMOD_CAPS : 0);

View File

@@ -408,6 +408,7 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, bool send_event)
}
}
// Only the shift, alt, level 3, level 5 and caps lock modifiers affect SDL keymaps.
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) {