Преглед изворни кода

add api FIFO based character input. (#1012)

* add api FIFO based character input.

* rename input character functions

* replace tab to space x4 #1012
Ushio пре 5 година
родитељ
комит
ae301a1d23
2 измењених фајлова са 42 додато и 0 уклоњено
  1. 39 0
      src/core.c
  2. 3 0
      src/raylib.h

+ 39 - 0
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

+ 3 - 0
src/raylib.h

@@ -978,6 +978,9 @@ RLAPI bool IsKeyUp(int key);                                  // Detect if a key
 RLAPI int GetKeyPressed(void);                                // Get latest key pressed
 RLAPI void SetExitKey(int key);                               // Set a custom key to exit program (default is ESC)
 
+RLAPI bool IsCharAvailable();                                 // Check if input character exists at least one in the internal input character stream. The characters are produced by the operating system text input system.
+RLAPI unsigned int GetNextChar();                             // Pull a input character from the the internal input character stream
+
 // Input-related functions: gamepads
 RLAPI bool IsGamepadAvailable(int gamepad);                   // Detect if a gamepad is available
 RLAPI bool IsGamepadName(int gamepad, const char *name);      // Check gamepad name (if available)