Browse Source

Merge pull request #879 from DarkElvenAngel/Keyboard-patch

Keyboard patch
pull/892/head
Ray 5 years ago
committed by GitHub
parent
commit
5fec3ef895
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 68 additions and 2 deletions
  1. +68
    -2
      src/core.c

+ 68
- 2
src/core.c View File

@ -498,6 +498,9 @@ static EM_BOOL EmscriptenGamepadCallback(int eventType, const EmscriptenGamepadE
static void InitKeyboard(void); // Init raw keyboard system (standard input reading) static void InitKeyboard(void); // Init raw keyboard system (standard input reading)
static void ProcessKeyboard(void); // Process keyboard events static void ProcessKeyboard(void); // Process keyboard events
static void RestoreKeyboard(void); // Restore keyboard system static void RestoreKeyboard(void); // Restore keyboard system
#else
static void InitTerminal(void); // Init terminal (block echo and signal short cuts)
static void RestoreTerminal(void); // Restore terminal
#endif #endif
static void InitEvdevInput(void); // Evdev inputs initialization static void InitEvdevInput(void); // Evdev inputs initialization
@ -537,7 +540,52 @@ struct android_app *GetAndroidApp(void)
return androidApp; return androidApp;
} }
#endif #endif
#if defined(PLATFORM_RPI) && !defined(SUPPORT_SSH_KEYBOARD_RPI)
// Init terminal (block echo and signal short cuts)
static void InitTerminal(void)
{
TraceLog(LOG_INFO, "Reconfigure Terminal ...");
// Save terminal keyboard settings and reconfigure terminal with new settings
struct termios keyboardNewSettings;
tcgetattr(STDIN_FILENO, &defaultKeyboardSettings); // Get current keyboard settings
keyboardNewSettings = defaultKeyboardSettings;
// New terminal settings for keyboard: turn off buffering (non-canonical mode), echo
// NOTE: ISIG controls if ^C and ^Z generate break signals or not
keyboardNewSettings.c_lflag &= ~(ICANON | ECHO | ISIG);
keyboardNewSettings.c_cc[VMIN] = 1;
keyboardNewSettings.c_cc[VTIME] = 0;
// Set new keyboard settings (change occurs immediately)
tcsetattr(STDIN_FILENO, TCSANOW, &keyboardNewSettings);
// Save old keyboard mode to restore it at the end
if (ioctl(STDIN_FILENO, KDGKBMODE, &defaultKeyboardMode) < 0)
{
// NOTE: It could mean we are using a remote keyboard through ssh or from the desktop
TraceLog(LOG_WARNING, "Could not change keyboard mode (Not a local Terminal)");
}
else
{
ioctl(STDIN_FILENO, KDSKBMODE, K_XLATE);
}
// Register terminal restore when program finishes
atexit(RestoreTerminal);
}
// Restore terminal
static void RestoreTerminal(void)
{
TraceLog(LOG_INFO, "Restore Terminal ...");
// Reset to default keyboard settings
tcsetattr(STDIN_FILENO, TCSANOW, &defaultKeyboardSettings);
// Reconfigure keyboard to default mode
ioctl(STDIN_FILENO, KDSKBMODE, defaultKeyboardMode);
}
#endif
// Initialize window and OpenGL context // Initialize window and OpenGL context
// NOTE: data parameter could be used to pass any kind of required data to the initialization // NOTE: data parameter could be used to pass any kind of required data to the initialization
void InitWindow(int width, int height, const char *title) void InitWindow(int width, int height, const char *title)
@ -621,6 +669,8 @@ void InitWindow(int width, int height, const char *title)
InitGamepad(); // Gamepad init InitGamepad(); // Gamepad init
#if defined(SUPPORT_SSH_KEYBOARD_RPI) #if defined(SUPPORT_SSH_KEYBOARD_RPI)
InitKeyboard(); // Keyboard init InitKeyboard(); // Keyboard init
#else
InitTerminal(); // Terminal init
#endif #endif
#endif #endif
@ -4731,6 +4781,7 @@ static void *EventThread(void *arg)
// Make sure we got a valid keycode // Make sure we got a valid keycode
if ((keycode > 0) && (keycode < sizeof(currentKeyState))) if ((keycode > 0) && (keycode < sizeof(currentKeyState)))
{ {
/* Disabled buffer !!
// Store the key information for raylib to later use // Store the key information for raylib to later use
currentKeyStateEvdev[keycode] = event.value; currentKeyStateEvdev[keycode] = event.value;
if (event.value > 0) if (event.value > 0)
@ -4740,7 +4791,22 @@ static void *EventThread(void *arg)
lastKeyPressedEvdev.Head = (lastKeyPressedEvdev.Head + 1) & 0x07; // Increment the head pointer forwards and binary wraparound after 7 (fifo is 8 elements long) lastKeyPressedEvdev.Head = (lastKeyPressedEvdev.Head + 1) & 0x07; // Increment the head pointer forwards and binary wraparound after 7 (fifo is 8 elements long)
// TODO: This fifo is not fully threadsafe with multiple writers, so multiple keyboards hitting a key at the exact same time could miss a key (double write to head before it was incremented) // TODO: This fifo is not fully threadsafe with multiple writers, so multiple keyboards hitting a key at the exact same time could miss a key (double write to head before it was incremented)
} }
*/
currentKeyState[keycode] = event.value;
if (event.value == 1) lastKeyPressed = keycode; // Register last key pressed
#if defined(SUPPORT_SCREEN_CAPTURE)
// Check screen capture key (raylib key: KEY_F12)
if (currentKeyState[301] == 1)
{
TakeScreenshot(FormatText("screenshot%03i.png", screenshotCounter));
screenshotCounter++;
}
#endif
if (currentKeyState[exitKey] == 1) windowShouldClose = true;
TraceLog(LOG_DEBUG, "KEY%s ScanCode: %4i KeyCode: %4i",event.value == 0 ? "UP":"DOWN", event.code, keycode); TraceLog(LOG_DEBUG, "KEY%s ScanCode: %4i KeyCode: %4i",event.value == 0 ? "UP":"DOWN", event.code, keycode);
} }
} }
@ -4995,4 +5061,4 @@ static void LogoAnimation(void)
#endif #endif
showLogo = false; // Prevent for repeating when reloading window (Android) showLogo = false; // Prevent for repeating when reloading window (Android)
}
}

Loading…
Cancel
Save