From dec7875a6e23212021e4d9080330a42832dfe02a Mon Sep 17 00:00:00 2001
From: Edward Rudd <urkle@outoforder.cc>
Date: Tue, 15 Jun 2021 01:40:19 +0000
Subject: [PATCH] update SDL soruce to 2.0.14
---
source/src/events/SDL_keyboard.c | 81 +++++++++++++++++++++++++++++++++++-----
1 files changed, 70 insertions(+), 11 deletions(-)
diff --git a/source/src/events/SDL_keyboard.c b/source/src/events/SDL_keyboard.c
index 502a771..16c1a29 100644
--- a/source/src/events/SDL_keyboard.c
+++ b/source/src/events/SDL_keyboard.c
@@ -25,13 +25,15 @@
#include "SDL_timer.h"
#include "SDL_events.h"
#include "SDL_events_c.h"
-#include "SDL_assert.h"
#include "../video/SDL_sysvideo.h"
/* #define DEBUG_KEYBOARD */
/* Global keyboard information */
+
+#define KEYBOARD_HARDWARE 0x01
+#define KEYBOARD_AUTORELEASE 0x02
typedef struct SDL_Keyboard SDL_Keyboard;
@@ -40,8 +42,10 @@
/* Data common to all keyboards */
SDL_Window *focus;
Uint16 modstate;
+ Uint8 keysource[SDL_NUM_SCANCODES];
Uint8 keystate[SDL_NUM_SCANCODES];
SDL_Keycode keymap[SDL_NUM_SCANCODES];
+ SDL_bool autorelease_pending;
};
static SDL_Keyboard SDL_keyboard;
@@ -675,19 +679,20 @@
}
}
-int
-SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
+static int
+SDL_SendKeyboardKeyInternal(Uint8 source, Uint8 state, SDL_Scancode scancode)
{
SDL_Keyboard *keyboard = &SDL_keyboard;
int posted;
SDL_Keymod modifier;
SDL_Keycode keycode;
Uint32 type;
- Uint8 repeat;
+ Uint8 repeat = SDL_FALSE;
- if (!scancode) {
+ if (scancode == SDL_SCANCODE_UNKNOWN) {
return 0;
}
+
#ifdef DEBUG_KEYBOARD
printf("The '%s' key has been %s\n", SDL_GetScancodeName(scancode),
state == SDL_PRESSED ? "pressed" : "released");
@@ -707,18 +712,30 @@
}
/* Drop events that don't change state */
- repeat = (state && keyboard->keystate[scancode]);
- if (keyboard->keystate[scancode] == state && !repeat) {
-#if 0
- printf("Keyboard event didn't change state - dropped!\n");
-#endif
- return 0;
+ if (state) {
+ if (keyboard->keystate[scancode]) {
+ if (!(keyboard->keysource[scancode] & source)) {
+ keyboard->keysource[scancode] |= source;
+ return 0;
+ }
+ repeat = SDL_TRUE;
+ }
+ keyboard->keysource[scancode] |= source;
+ } else {
+ if (!keyboard->keystate[scancode]) {
+ return 0;
+ }
+ keyboard->keysource[scancode] = 0;
}
/* Update internal keyboard state */
keyboard->keystate[scancode] = state;
keycode = keyboard->keymap[scancode];
+
+ if (source == KEYBOARD_AUTORELEASE) {
+ keyboard->autorelease_pending = SDL_TRUE;
+ }
/* Update modifiers state if applicable */
switch (keycode) {
@@ -786,6 +803,48 @@
}
int
+SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
+{
+ return SDL_SendKeyboardKeyInternal(KEYBOARD_HARDWARE, state, scancode);
+}
+
+int
+SDL_SendKeyboardKeyAutoRelease(SDL_Scancode scancode)
+{
+ return SDL_SendKeyboardKeyInternal(KEYBOARD_AUTORELEASE, SDL_PRESSED, scancode);
+}
+
+void
+SDL_ReleaseAutoReleaseKeys(void)
+{
+ SDL_Keyboard *keyboard = &SDL_keyboard;
+ SDL_Scancode scancode;
+
+ if (keyboard->autorelease_pending) {
+ for (scancode = SDL_SCANCODE_UNKNOWN; scancode < SDL_NUM_SCANCODES; ++scancode) {
+ if (keyboard->keysource[scancode] == KEYBOARD_AUTORELEASE) {
+ SDL_SendKeyboardKeyInternal(KEYBOARD_AUTORELEASE, SDL_RELEASED, scancode);
+ }
+ }
+ keyboard->autorelease_pending = SDL_FALSE;
+ }
+}
+
+SDL_bool
+SDL_HardwareKeyboardKeyPressed(void)
+{
+ SDL_Keyboard *keyboard = &SDL_keyboard;
+ SDL_Scancode scancode;
+
+ for (scancode = SDL_SCANCODE_UNKNOWN; scancode < SDL_NUM_SCANCODES; ++scancode) {
+ if ((keyboard->keysource[scancode] & KEYBOARD_HARDWARE) != 0) {
+ return SDL_TRUE;
+ }
+ }
+ return SDL_FALSE;
+}
+
+int
SDL_SendKeyboardText(const char *text)
{
SDL_Keyboard *keyboard = &SDL_keyboard;
--
Gitblit v1.9.3