|
@@ -910,8 +910,6 @@ keyboard_input_get_text(char text[8], const struct SDL_WaylandInput *input, uint
|
|
SDL_WindowData *window = input->keyboard_focus;
|
|
SDL_WindowData *window = input->keyboard_focus;
|
|
const xkb_keysym_t *syms;
|
|
const xkb_keysym_t *syms;
|
|
xkb_keysym_t sym;
|
|
xkb_keysym_t sym;
|
|
- SDL_Keymod mod;
|
|
|
|
- SDL_bool caps;
|
|
|
|
|
|
|
|
if (!window || window->keyboard_device != input || !input->xkb.state) {
|
|
if (!window || window->keyboard_device != input || !input->xkb.state) {
|
|
return SDL_FALSE;
|
|
return SDL_FALSE;
|
|
@@ -923,24 +921,6 @@ keyboard_input_get_text(char text[8], const struct SDL_WaylandInput *input, uint
|
|
}
|
|
}
|
|
sym = syms[0];
|
|
sym = syms[0];
|
|
|
|
|
|
- /* Wayland is actually pretty cool and sends key codes based on presumed
|
|
|
|
- * caps lock state, problem is that it isn't totally accurate if the key
|
|
|
|
- * has been remapped, so we have to force caps for our purposes.
|
|
|
|
- * -flibit
|
|
|
|
- */
|
|
|
|
- mod = SDL_GetModState();
|
|
|
|
- caps = (
|
|
|
|
- /* Caps lock without shift... */
|
|
|
|
- ((mod & KMOD_CAPS) && !(mod & KMOD_SHIFT)) ||
|
|
|
|
- /* No caps lock with shift... */
|
|
|
|
- (!(mod & KMOD_CAPS) && (mod & KMOD_SHIFT))
|
|
|
|
- );
|
|
|
|
- if (caps) {
|
|
|
|
- sym = toupper(sym);
|
|
|
|
- } else {
|
|
|
|
- sym = tolower(sym);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
#ifdef SDL_USE_IME
|
|
#ifdef SDL_USE_IME
|
|
if (SDL_IME_ProcessKeyEvent(sym, key + 8)) {
|
|
if (SDL_IME_ProcessKeyEvent(sym, key + 8)) {
|
|
*handled_by_ime = SDL_TRUE;
|
|
*handled_by_ime = SDL_TRUE;
|
|
@@ -1076,10 +1056,26 @@ keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard,
|
|
{
|
|
{
|
|
struct SDL_WaylandInput *input = data;
|
|
struct SDL_WaylandInput *input = data;
|
|
Wayland_Keymap keymap;
|
|
Wayland_Keymap keymap;
|
|
|
|
+ xkb_mod_index_t shift, ctrl, alt, gui, num, caps;
|
|
|
|
+ uint32_t modstate = (mods_depressed | mods_latched | mods_locked);
|
|
|
|
+
|
|
|
|
+ shift = WAYLAND_xkb_keymap_mod_get_index(input->xkb.keymap, XKB_MOD_NAME_SHIFT);
|
|
|
|
+ ctrl = WAYLAND_xkb_keymap_mod_get_index(input->xkb.keymap, XKB_MOD_NAME_CTRL);
|
|
|
|
+ alt = WAYLAND_xkb_keymap_mod_get_index(input->xkb.keymap, XKB_MOD_NAME_ALT);
|
|
|
|
+ gui = WAYLAND_xkb_keymap_mod_get_index(input->xkb.keymap, XKB_MOD_NAME_LOGO);
|
|
|
|
+ num = WAYLAND_xkb_keymap_mod_get_index(input->xkb.keymap, XKB_MOD_NAME_NUM);
|
|
|
|
+ caps = WAYLAND_xkb_keymap_mod_get_index(input->xkb.keymap, XKB_MOD_NAME_CAPS);
|
|
|
|
|
|
WAYLAND_xkb_state_update_mask(input->xkb.state, mods_depressed, mods_latched,
|
|
WAYLAND_xkb_state_update_mask(input->xkb.state, mods_depressed, mods_latched,
|
|
mods_locked, 0, 0, group);
|
|
mods_locked, 0, 0, group);
|
|
|
|
|
|
|
|
+ SDL_ToggleModState(KMOD_SHIFT, modstate & (1 << shift));
|
|
|
|
+ SDL_ToggleModState(KMOD_CTRL, modstate & (1 << ctrl));
|
|
|
|
+ SDL_ToggleModState(KMOD_CAPS, modstate & (1 << alt));
|
|
|
|
+ SDL_ToggleModState(KMOD_GUI, modstate & (1 << gui));
|
|
|
|
+ SDL_ToggleModState(KMOD_NUM, modstate & (1 << num));
|
|
|
|
+ SDL_ToggleModState(KMOD_CAPS, modstate & (1 << caps));
|
|
|
|
+
|
|
keymap.layout = group;
|
|
keymap.layout = group;
|
|
SDL_GetDefaultKeymap(keymap.keymap);
|
|
SDL_GetDefaultKeymap(keymap.keymap);
|
|
WAYLAND_xkb_keymap_key_for_each(input->xkb.keymap,
|
|
WAYLAND_xkb_keymap_key_for_each(input->xkb.keymap,
|