| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -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 ProcessKeyboard(void);                      // Process keyboard events | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			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 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			static void InitEvdevInput(void);                       // Evdev inputs initialization | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -537,7 +540,52 @@ struct android_app *GetAndroidApp(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return androidApp; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#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 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// 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) | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -621,6 +669,8 @@ void InitWindow(int width, int height, const char *title) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    InitGamepad();      // Gamepad init | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(SUPPORT_SSH_KEYBOARD_RPI) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    InitKeyboard();     // Keyboard init | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    InitTerminal();     // Terminal init | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -4731,6 +4781,7 @@ static void *EventThread(void *arg) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    // Make sure we got a valid keycode | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    if ((keycode > 0) && (keycode < sizeof(currentKeyState))) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        /* Disabled buffer !! | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        // Store the key information for raylib to later use | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        currentKeyStateEvdev[keycode] = event.value; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        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) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                            // 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); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                } | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -4995,4 +5061,4 @@ static void LogoAnimation(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    showLogo = false;  // Prevent for repeating when reloading window (Android) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} |