Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Friggin' Windows remaps alphabetic keys based on keyboard layout.
Browse files Browse the repository at this point in the history
We try to figure out what the actual layout independent values are.
  • Loading branch information
slouken committed Feb 9, 2008
1 parent e797fef commit 6c38b27
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 17 deletions.
17 changes: 9 additions & 8 deletions src/video/win32/SDL_win32events.c
Expand Up @@ -54,17 +54,12 @@ RemapVKEY(WPARAM wParam, LPARAM lParam)
We try to provide USB scancodes, so undo this mapping.
*/
if (wParam >= 'A' && wParam <= 'Z') {
/* Alphabetic scancodes for PC keyboards */
static BYTE scancodes[26] = {
30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, 50, 49, 24,
25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44
};
BYTE scancode = (lParam >> 16) & 0xFF;
int i;

if (scancode != scancodes[wParam - 'A']) {
for (i = 0; i < SDL_arraysize(scancodes); ++i) {
if (scancode == scancodes[i]) {
if (scancode != alpha_scancodes[wParam - 'A']) {
for (i = 0; i < SDL_arraysize(alpha_scancodes); ++i) {
if (scancode == alpha_scancodes[i]) {
wParam = 'A' + i;
break;
}
Expand Down Expand Up @@ -448,6 +443,12 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
}
return (0);

case WM_INPUTLANGCHANGE:
{
WIN_UpdateKeymap(data->videodata->keyboard);
}
return (1);

case WM_GETMINMAXINFO:
{
MINMAXINFO *info;
Expand Down
45 changes: 37 additions & 8 deletions src/video/win32/SDL_win32keyboard.c
Expand Up @@ -26,27 +26,52 @@
#include "../../events/SDL_keyboard_c.h"
#include "../../events/scancodes_win32.h"

#ifndef MAPVK_VK_TO_VSC
#define MAPVK_VK_TO_VSC 0
#endif
#ifndef MAPVK_VSC_TO_VK
#define MAPVK_VSC_TO_VK 1
#endif
#ifndef MAPVK_VK_TO_CHAR
#define MAPVK_VK_TO_CHAR 2
#endif

/* Alphabetic scancodes for PC keyboards */
BYTE alpha_scancodes[26] = {
30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, 50, 49, 24,
25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44
};

void
WIN_InitKeyboard(_THIS)
{
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
SDL_Keyboard keyboard;
int i;

/* Make sure the alpha scancodes are correct. T isn't usually remapped */
if (MapVirtualKey('T', MAPVK_VK_TO_VSC) != alpha_scancodes['T'-'A']) {
printf("Fixing alpha scancode map, assuming US QWERTY layout!\nPlease send the following 26 lines of output to the SDL mailing list <sdl@libsdl.org>, including a description of your keyboard hardware.\n");
for (i = 0; i < SDL_arraysize(alpha_scancodes); ++i) {
alpha_scancodes[i] = MapVirtualKey('A'+i, MAPVK_VK_TO_VSC);
printf("%d = %d\n", i, alpha_scancodes[i]);
}
}

data->key_layout = win32_scancode_table;

SDL_zero(keyboard);
data->keyboard = SDL_AddKeyboard(&keyboard, -1);
WIN_UpdateKeymap(_this);
WIN_UpdateKeymap(data->keyboard);

SDL_SetScancodeName(SDL_SCANCODE_APPLICATION, "Menu");
SDL_SetScancodeName(SDL_SCANCODE_LGUI, "Left Windows");
SDL_SetScancodeName(SDL_SCANCODE_RGUI, "Right Windows");
}

void
WIN_UpdateKeymap(_THIS)
WIN_UpdateKeymap(int keyboard)
{
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
int i;
SDL_scancode scancode;
SDLKey keymap[SDL_NUM_SCANCODES];
Expand All @@ -61,12 +86,16 @@ WIN_UpdateKeymap(_THIS)
(keymap[scancode] & SDLK_SCANCODE_MASK)) {
continue;
}
#ifndef MAPVK_VK_TO_CHAR
#define MAPVK_VK_TO_CHAR 2
#endif
keymap[scancode] = (MapVirtualKey(i, MAPVK_VK_TO_CHAR) & 0x7FFF);

/* Alphabetic keys are handled specially, since Windows remaps them */
if (i >= 'A' && i <= 'Z') {
BYTE vsc = alpha_scancodes[i-'A'];
keymap[scancode] = MapVirtualKey(vsc, MAPVK_VSC_TO_VK) + 0x20;
} else {
keymap[scancode] = (MapVirtualKey(i, MAPVK_VK_TO_CHAR) & 0x7FFF);
}
}
SDL_SetKeymap(data->keyboard, 0, keymap, SDL_NUM_SCANCODES);
SDL_SetKeymap(keyboard, 0, keymap, SDL_NUM_SCANCODES);
}

void
Expand Down
4 changes: 3 additions & 1 deletion src/video/win32/SDL_win32keyboard.h
Expand Up @@ -24,8 +24,10 @@
#ifndef _SDL_win32keyboard_h
#define _SDL_win32keyboard_h

extern BYTE alpha_scancodes[26];

extern void WIN_InitKeyboard(_THIS);
extern void WIN_UpdateKeymap(_THIS);
extern void WIN_UpdateKeymap(int keyboard);
extern void WIN_QuitKeyboard(_THIS);

#endif /* _SDL_win32keyboard_h */
Expand Down

0 comments on commit 6c38b27

Please sign in to comment.