Bläddra i källkod

windows: handle the Pause key sequence for raw keyboard input

Sam Lantinga 1 år sedan
förälder
incheckning
3eb8f35f3b
2 ändrade filer med 27 tillägg och 13 borttagningar
  1. 26 13
      src/video/windows/SDL_windowsevents.c
  2. 1 0
      src/video/windows/SDL_windowsvideo.h

+ 26 - 13
src/video/windows/SDL_windowsevents.c

@@ -601,9 +601,9 @@ static void WIN_HandleRawMouseInput(Uint64 timestamp, SDL_WindowData *data, HAND
                     }
                 } else {
                     /* Send relative motion if we didn't warp last frame (had good position data)
-                               We also sometimes get large deltas due to coalesced mouse motion and warping,
-                               so ignore those.
-                             */
+                       We also sometimes get large deltas due to coalesced mouse motion and warping,
+                       so ignore those.
+                     */
                     const int MAX_RELATIVE_MOTION = (h / 6);
                     if (SDL_abs(relX) < MAX_RELATIVE_MOTION &&
                         SDL_abs(relY) < MAX_RELATIVE_MOTION) {
@@ -635,18 +635,31 @@ static void WIN_HandleRawKeyboardInput(Uint64 timestamp, SDL_WindowData *data, H
         return;
     }
 
-    Uint8 state = (rawkeyboard->Flags & RI_KEY_BREAK) ? SDL_RELEASED : SDL_PRESSED;
-    Uint16 scanCode = rawkeyboard->MakeCode;
-    if (rawkeyboard->Flags & RI_KEY_E0) {
-        scanCode |= (0xE0 << 8);
-    } else if (rawkeyboard->Flags & RI_KEY_E1) {
-        scanCode |= (0xE1 << 8);
+    if (rawkeyboard->Flags & RI_KEY_E1) {
+        // First key in a Ctrl+{key} sequence
+        data->videodata->pending_E1_key_sequence = SDL_TRUE;
+        return;
     }
 
-    // Pack scan code into one byte to make the index
-    Uint8 index = LOBYTE(scanCode) | (HIBYTE(scanCode) ? 0x80 : 0x00);
-    SDL_Scancode code = windows_scancode_table[index];
-
+    Uint8 state = (rawkeyboard->Flags & RI_KEY_BREAK) ? SDL_RELEASED : SDL_PRESSED;
+    SDL_Scancode code;
+    if (data->videodata->pending_E1_key_sequence) {
+        if (rawkeyboard->MakeCode == 0x45) {
+            // Ctrl+NumLock == Pause
+            code = SDL_SCANCODE_PAUSE;
+        } else {
+            // Ctrl+ScrollLock == Break (no SDL scancode?)
+            code = SDL_SCANCODE_UNKNOWN;
+        }
+        data->videodata->pending_E1_key_sequence = SDL_FALSE;
+    } else {
+        // The code is in the lower 7 bits, the high bit is set for the E0 prefix
+        Uint8 index = (Uint8)rawkeyboard->MakeCode;
+        if (rawkeyboard->Flags & RI_KEY_E0) {
+            index |= 0x80;
+        }
+        code = windows_scancode_table[index];
+    }
     SDL_SendKeyboardKey(timestamp, keyboardID, state, code);
 }
 

+ 1 - 0
src/video/windows/SDL_windowsvideo.h

@@ -408,6 +408,7 @@ struct SDL_VideoData
 
     SDL_bool raw_mouse_enabled;
     SDL_bool raw_keyboard_enabled;
+    SDL_bool pending_E1_key_sequence;
     SDL_bool raw_input_enabled;
 
 #ifndef SDL_DISABLE_WINDOWS_IME