Skip to content

Commit

Permalink
windows: handle the Pause key sequence for raw keyboard input
Browse files Browse the repository at this point in the history
  • Loading branch information
slouken committed Mar 26, 2024
1 parent 4562b41 commit 3eb8f35
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 13 deletions.
39 changes: 26 additions & 13 deletions src/video/windows/SDL_windowsevents.c
Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
}

Expand Down
1 change: 1 addition & 0 deletions src/video/windows/SDL_windowsvideo.h
Expand Up @@ -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
Expand Down

0 comments on commit 3eb8f35

Please sign in to comment.