mirror of
https://github.com/Ryujinx/SDL.git
synced 2025-01-03 15:55:31 +00:00
Don't map the top keyboard row to numbers when using the one-handed DVORAK layouts (thanks @tormol!)
Fixes https://github.com/libsdl-org/SDL/pull/5127
This commit is contained in:
parent
2001a891c4
commit
a2f4783e75
|
@ -40,7 +40,7 @@
|
||||||
* an SDLK_* constant for those keys that do not generate characters.
|
* an SDLK_* constant for those keys that do not generate characters.
|
||||||
*
|
*
|
||||||
* A special exception is the number keys at the top of the keyboard which
|
* A special exception is the number keys at the top of the keyboard which
|
||||||
* always map to SDLK_0...SDLK_9, regardless of layout.
|
* map to SDLK_0...SDLK_9 on AZERTY layouts.
|
||||||
*/
|
*/
|
||||||
typedef Sint32 SDL_Keycode;
|
typedef Sint32 SDL_Keycode;
|
||||||
|
|
||||||
|
|
|
@ -699,20 +699,41 @@ void SDL_SetKeymap(int start, const SDL_Keycode *keys, int length, SDL_bool send
|
||||||
SDL_Keyboard *keyboard = &SDL_keyboard;
|
SDL_Keyboard *keyboard = &SDL_keyboard;
|
||||||
SDL_Scancode scancode;
|
SDL_Scancode scancode;
|
||||||
SDL_Keycode normalized_keymap[SDL_NUM_SCANCODES];
|
SDL_Keycode normalized_keymap[SDL_NUM_SCANCODES];
|
||||||
|
SDL_bool is_azerty = SDL_FALSE;
|
||||||
|
|
||||||
if (start < 0 || start + length > SDL_NUM_SCANCODES) {
|
if (start < 0 || start + length > SDL_NUM_SCANCODES) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (start > 0) {
|
||||||
|
SDL_memcpy(&normalized_keymap[0], &keyboard->keymap[0], sizeof(*keys) * start);
|
||||||
|
}
|
||||||
|
|
||||||
SDL_memcpy(&normalized_keymap[start], keys, sizeof(*keys) * length);
|
SDL_memcpy(&normalized_keymap[start], keys, sizeof(*keys) * length);
|
||||||
|
|
||||||
/* The number key scancodes always map to the number key keycodes.
|
if (start + length < SDL_NUM_SCANCODES) {
|
||||||
* On AZERTY layouts these technically are symbols, but users (and games)
|
int offset = start + length;
|
||||||
* always think of them and view them in UI as number keys.
|
SDL_memcpy(&normalized_keymap[offset], &keyboard->keymap[offset], sizeof(*keys) * (SDL_NUM_SCANCODES - offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* On AZERTY layouts the number keys are technically symbols, but users (and games)
|
||||||
|
* always think of them and view them in UI as number keys, so remap them here.
|
||||||
*/
|
*/
|
||||||
normalized_keymap[SDL_SCANCODE_0] = SDLK_0;
|
if (normalized_keymap[SDL_SCANCODE_0] < SDLK_0 || normalized_keymap[SDL_SCANCODE_0] > SDLK_9) {
|
||||||
for (scancode = SDL_SCANCODE_1; scancode <= SDL_SCANCODE_9; ++scancode) {
|
is_azerty = SDL_TRUE;
|
||||||
normalized_keymap[scancode] = SDLK_1 + (scancode - SDL_SCANCODE_1);
|
for (scancode = SDL_SCANCODE_1; scancode <= SDL_SCANCODE_9; ++scancode) {
|
||||||
|
if (normalized_keymap[scancode] >= SDLK_0 && normalized_keymap[scancode] <= SDLK_9) {
|
||||||
|
/* There's a number on this row, it's not AZERTY */
|
||||||
|
is_azerty = SDL_FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_azerty) {
|
||||||
|
normalized_keymap[SDL_SCANCODE_0] = SDLK_0;
|
||||||
|
for (scancode = SDL_SCANCODE_1; scancode <= SDL_SCANCODE_9; ++scancode) {
|
||||||
|
normalized_keymap[scancode] = SDLK_1 + (scancode - SDL_SCANCODE_1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the mapping didn't really change, we're done here */
|
/* If the mapping didn't really change, we're done here */
|
||||||
|
|
|
@ -131,10 +131,8 @@ void WIN_UpdateKeymap(SDL_bool send_event)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If this key is one of the non-mappable keys, ignore it */
|
/* If this key is one of the non-mappable keys, ignore it */
|
||||||
/* Not mapping numbers fixes the French layout, giving numeric keycodes for the number keys, which is the expected behavior */
|
/* Uncomment the second part re-enable the behavior of not mapping the "`"(grave) key to the users actual keyboard layout */
|
||||||
if ((keymap[scancode] & SDLK_SCANCODE_MASK) ||
|
if ((keymap[scancode] & SDLK_SCANCODE_MASK) /*|| scancode == SDL_SCANCODE_GRAVE*/) {
|
||||||
/* scancode == SDL_SCANCODE_GRAVE || */ /* Uncomment this line to re-enable the behavior of not mapping the "`"(grave) key to the users actual keyboard layout */
|
|
||||||
(scancode >= SDL_SCANCODE_1 && scancode <= SDL_SCANCODE_0)) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue