equal
deleted
inserted
replaced
47 #endif |
47 #endif |
48 |
48 |
49 /* The translation table from a Microsoft VK keysym to a SDL keysym */ |
49 /* The translation table from a Microsoft VK keysym to a SDL keysym */ |
50 static SDLKey VK_keymap[SDLK_LAST]; |
50 static SDLKey VK_keymap[SDLK_LAST]; |
51 static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, int pressed); |
51 static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, int pressed); |
|
52 static BOOL prev_shiftstates[2]; |
52 |
53 |
53 /* Masks for processing the windows KEYDOWN and KEYUP messages */ |
54 /* Masks for processing the windows KEYDOWN and KEYUP messages */ |
54 #define REPEATED_KEYMASK (1<<30) |
55 #define REPEATED_KEYMASK (1<<30) |
55 #define EXTENDED_KEYMASK (1<<24) |
56 #define EXTENDED_KEYMASK (1<<24) |
56 |
57 |
80 else |
81 else |
81 wParam = VK_LCONTROL; |
82 wParam = VK_LCONTROL; |
82 break; |
83 break; |
83 case VK_SHIFT: |
84 case VK_SHIFT: |
84 /* EXTENDED trick doesn't work here */ |
85 /* EXTENDED trick doesn't work here */ |
85 if ( GetKeyState(VK_LSHIFT) & 0x8000 ) { |
86 if (!prev_shiftstates[0] && (GetKeyState(VK_LSHIFT) & 0x8000)) { |
86 wParam = VK_LSHIFT; |
87 wParam = VK_LSHIFT; |
87 } else if ( GetKeyState(VK_RSHIFT) & 0x8000 ) { |
88 prev_shiftstates[0] = TRUE; |
|
89 } else if (!prev_shiftstates[1] && (GetKeyState(VK_RSHIFT) & 0x8000)) { |
88 wParam = VK_RSHIFT; |
90 wParam = VK_RSHIFT; |
|
91 prev_shiftstates[1] = TRUE; |
89 } else { |
92 } else { |
90 /* Huh? */ |
93 /* Huh? */ |
91 } |
94 } |
92 break; |
95 break; |
93 case VK_MENU: |
96 case VK_MENU: |
133 else |
136 else |
134 wParam = VK_LCONTROL; |
137 wParam = VK_LCONTROL; |
135 break; |
138 break; |
136 case VK_SHIFT: |
139 case VK_SHIFT: |
137 /* EXTENDED trick doesn't work here */ |
140 /* EXTENDED trick doesn't work here */ |
138 wParam = VK_LSHIFT; |
141 if (prev_shiftstates[0] && !(GetKeyState(VK_LSHIFT) & 0x8000)) { |
|
142 wParam = VK_LSHIFT; |
|
143 prev_shiftstates[0] = FALSE; |
|
144 } else if (prev_shiftstates[1] && !(GetKeyState(VK_RSHIFT) & 0x8000)) { |
|
145 wParam = VK_RSHIFT; |
|
146 prev_shiftstates[1] = FALSE; |
|
147 } else { |
|
148 /* Huh? */ |
|
149 } |
139 break; |
150 break; |
140 case VK_MENU: |
151 case VK_MENU: |
141 if ( lParam&EXTENDED_KEYMASK ) |
152 if ( lParam&EXTENDED_KEYMASK ) |
142 wParam = VK_RMENU; |
153 wParam = VK_RMENU; |
143 else |
154 else |
309 VK_keymap[VK_PRINT] = SDLK_PRINT; |
320 VK_keymap[VK_PRINT] = SDLK_PRINT; |
310 #endif |
321 #endif |
311 VK_keymap[VK_SNAPSHOT] = SDLK_PRINT; |
322 VK_keymap[VK_SNAPSHOT] = SDLK_PRINT; |
312 VK_keymap[VK_CANCEL] = SDLK_BREAK; |
323 VK_keymap[VK_CANCEL] = SDLK_BREAK; |
313 VK_keymap[VK_APPS] = SDLK_MENU; |
324 VK_keymap[VK_APPS] = SDLK_MENU; |
|
325 |
|
326 prev_shiftstates[0] = FALSE; |
|
327 prev_shiftstates[1] = FALSE; |
314 } |
328 } |
315 |
329 |
316 static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, int pressed) |
330 static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, int pressed) |
317 { |
331 { |
318 /* Set the keysym information */ |
332 /* Set the keysym information */ |