We are currently migrating Bugzilla to GitHub issues.
Any changes made to the bug tracker now will be lost, so please do not post new bugs or make changes to them.
When we're done, all bug URLs will redirect to their equivalent location on the new bug tracker.

Bug 164

Summary: windib returns locale dependent SDLK_ codes
Product: SDL Reporter: John Popplewell <john>
Component: eventsAssignee: Ryan C. Gordon <icculus>
Status: RESOLVED FIXED QA Contact: Sam Lantinga <slouken>
Severity: normal    
Priority: P2    
Version: HG 1.2   
Hardware: x86   
OS: Windows (All)   
URL: http://www.libsdl.org/pipermail/sdl/2006-March/073321.html
Attachments: Always uses US keymap to create VK_ virtual key codes
Proposed patch for windib keyboard handling
Revised patch with scancodes mostly removed

Description John Popplewell 2006-03-14 13:37:19 UTC
Running checkkeys.c with a Swedish keyboard layout produces inconsistent results when using the windib and directx backends. The key at the top-left of the keyboard, SDLK_BACKQUOTE is reported as being SDLK_BACKSLASH. This is caused by Windows returning a different VK_ code for this key when a Swedish keyboard layout is in use. This VK_ code clashes with the VK_ code returned for a different (physical) key on a UK keyboard.

So far, only reported on WinXP SP2.

Orignally reported by Tomas Jakobsson. In the referenced posting I use the term scancode, when I should have said SDLK_ code.
Comment 1 John Popplewell 2006-03-14 15:49:25 UTC
Created attachment 80 [details]
Always uses US keymap to create VK_ virtual key codes

To get your imaginations fired up, here's a hack that makes all keyboards look like a US keyboard so that it can return a language independent SDLK_ code.
Only tested on XP so far. Please tell me there is a better solution than this.
Comment 2 John Popplewell 2006-03-15 06:17:02 UTC
Comment on attachment 80 [details]
Always uses US keymap to create VK_ virtual key codes

Demonstrates the concept, but is badly broken.
Comment 3 John Popplewell 2006-03-15 06:29:41 UTC
Christian Walth has pointed this out to me: http://thread.gmane.org/gmane.comp.lib.sdl/24697

So I guess I'm exploring the possibility of making windib consistant with directx and into option 1.

Interestingly, whilst testing, I noticed that with the directx backend I get the same SDLK_ code for the #~ key (SDLK_BACKSLASH) and the \| key on my UK keyboard, but this could be fixed by changing:

...
DIK_keymap[DIK_BACKSLASH] = SDLK_BACKSLASH;
DIK_keymap[DIK_OEM_102] = SDLK_BACKSLASH;  <-- SDLK_LESS
...
Comment 4 John Popplewell 2006-03-15 22:34:37 UTC
Created attachment 83 [details]
Proposed patch for windib keyboard handling

Current bugs with windib keyboard support (testing with checkkeys.c):
 1. SDLK_ codes change with the keyboard mapping (dx doesn't)
 2. keypad SDLK_ codes change based on num lock (dx doesn't)
 3. return and keypad enter give the same SDLK_RETURN code (dx doesn't)
 4. on Win9x shift keys ignored in cvs, but used to give 'unknown scancode'

The behaviour of caps-lock and num-lock is documented, the behaviour of print-screen and pause (press/release sent once on keydown, nothing on keyup) is, I think, documented, and I haven't been able to do better this.

I've attached a patch for the numbered problems, but it has issues with the use of keyboard scancodes for the keypad and shift-keys (2&4).

It also fixes a cock-up (mine, I think) in the directx driver that causes two of the keys to have the same SDLK_ code.

Notes:
1. is resolved by always using a US keyboard map to generate the SDLK_ code, but the MS function MapVirtualKeyEx() seems to be reliable only for 'printable' keys, so it's a bit messy.

2. Uses scancodes, but could use VK_ codes instead, would still produce SDLK_ codes dependent on num-lock though. Required because MapVirtualKeyEx() doesn't handle the keypad properly.

3. Should work fine everywhere.

4. Uses scancodes, but would be reliable with a list of scancodes for each shift-key, as the VK_SHIFT code *is* reliable. Defaults to making both shift keys appear to be VK_LSHIFT.
Comment 5 John Popplewell 2006-03-16 05:25:31 UTC
Couple of other windib keyboard handling bugs:
 5. shift keys don't roll-over, if you hold one down the other is ignored.
 6. right-alt generates left-ctrl down, right-alt down/right-alt up, left-ctrl up. 

I don't know how to fix these. Number 6 seems to be something to do with right-alt being used as a shift key on e.g. French keyboard.
Comment 6 John Popplewell 2006-03-16 08:22:39 UTC
Created attachment 84 [details]
Revised patch with scancodes mostly removed

Removed need for the majority of the scancodes. Just the ones for left/right shift on Win9x remain. Defaults to VK_LSHIFT if no match, and anyway, the left-right shift and ctrl keys aren't properly independent.

The code hurts the eyes less :) Tested on WinXP, Win2K, Win98SE.
Comment 7 Ryan C. Gordon 2006-05-17 23:24:17 UTC
This patch is now in Subversion (revision #2477). Thanks!

--ryan.

Comment 8 Sam Lantinga 2006-06-24 00:39:33 UTC
By the way, this behavior will change in SDL 1.3 - the intended behavior is that the SDL keysyms reflect the key printed on the keyboard.  This allows the end user to know what the 'z' key is, for example, without having to consult a picture of a US keyboard.  Games which are indended to have the same layout in multiple locales should have different key maps for each keyboard layout.