From ae301a1d233d9fcde676e0572cc2eab9206a8ad2 Mon Sep 17 00:00:00 2001 From: Ushio Date: Sun, 24 Nov 2019 20:46:00 +0900 Subject: add api FIFO based character input. (#1012) * add api FIFO based character input. * rename input character functions * replace tab to space x4 #1012 --- src/core.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/core.c') diff --git a/src/core.c b/src/core.c index 518472e2..5d258a3a 100644 --- a/src/core.c +++ b/src/core.c @@ -353,6 +353,9 @@ static char currentKeyState[512] = { 0 }; // Registers current frame key s static int lastKeyPressed = -1; // Register last key pressed static int exitKey = KEY_ESCAPE; // Default exit key (ESC) +static unsigned int inputCharacterQueue[16] = { 0 }; // Input characters stream queue as produced by the operating system text input system +static int inputCharacterQueueCount = 0; // Input characters stream queue count + #if defined(PLATFORM_RPI) // NOTE: For keyboard we will use the standard input (but reconfigured...) static struct termios defaultKeyboardSettings; // Used to store default keyboard settings @@ -2226,6 +2229,32 @@ int GetKeyPressed(void) return lastKeyPressed; } +bool IsCharAvailable() +{ + return 0 < inputCharacterQueueCount; +} +unsigned int GetNextChar() +{ + if (inputCharacterQueueCount <= 0) + { + return 0; + } + // take a character from the head + unsigned int c = inputCharacterQueue[0]; + + // shift elements 1 step toward the head. + inputCharacterQueueCount--; + for (int i = 0; i < inputCharacterQueueCount; i++) + { + inputCharacterQueue[i] = inputCharacterQueue[i + 1]; + } + + // this is not required, but this can keep clean memory + inputCharacterQueue[inputCharacterQueueCount] = 0; + + return c; +} + // Set a custom key to exit program // NOTE: default exitKey is ESCAPE void SetExitKey(int key) @@ -3932,6 +3961,16 @@ static void CharCallback(GLFWwindow *window, unsigned int key) // http://www.glfw.org/docs/latest/input_guide.html#input_char lastKeyPressed = key; + + // If the capacity over, is will waste the old one. + static const int CAPACITY = sizeof(inputCharacterQueue) / sizeof(inputCharacterQueue[0]); + if (CAPACITY <= inputCharacterQueueCount) + { + GetNextChar(); + } + + // add to queue + inputCharacterQueue[inputCharacterQueueCount++] = key; } // GLFW3 CursorEnter Callback, when cursor enters the window -- cgit v1.2.3