| 
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -121,6 +121,7 @@ | 
															
														
														
													
														
															
																 | 
																 | 
																    // Old device inputs system | 
																 | 
																 | 
																    // Old device inputs system | 
															
														
														
													
														
															
																 | 
																 | 
																    #define DEFAULT_KEYBOARD_DEV      STDIN_FILENO              // Standard input | 
																 | 
																 | 
																    #define DEFAULT_KEYBOARD_DEV      STDIN_FILENO              // Standard input | 
															
														
														
													
														
															
																 | 
																 | 
																    #define DEFAULT_MOUSE_DEV         "/dev/input/mouse0"       // Mouse input | 
																 | 
																 | 
																    #define DEFAULT_MOUSE_DEV         "/dev/input/mouse0"       // Mouse input | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    #define DEFAULT_TOUCH_DEV         "/dev/input/event4"       // Touch input virtual device (created by ts_uinput) | 
															
														
														
													
														
															
																 | 
																 | 
																    #define DEFAULT_GAMEPAD_DEV       "/dev/input/js"           // Gamepad input (base dev for all gamepads: js0, js1, ...) | 
																 | 
																 | 
																    #define DEFAULT_GAMEPAD_DEV       "/dev/input/js"           // Gamepad input (base dev for all gamepads: js0, js1, ...) | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																    // New device input events (evdev) (must be detected) | 
																 | 
																 | 
																    // New device input events (evdev) (must be detected) | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -174,6 +175,11 @@ static int mouseStream = -1;                    // Mouse device file descriptor | 
															
														
														
													
														
															
																 | 
																 | 
																static bool mouseReady = false;                 // Flag to know if mouse is ready | 
																 | 
																 | 
																static bool mouseReady = false;                 // Flag to know if mouse is ready | 
															
														
														
													
														
															
																 | 
																 | 
																static pthread_t mouseThreadId;                 // Mouse reading thread id | 
																 | 
																 | 
																static pthread_t mouseThreadId;                 // Mouse reading thread id | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																// Touch input variables | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static int touchStream = -1;                    // Touch device file descriptor | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static bool touchReady = false;                 // Flag to know if touch interface is ready | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static pthread_t touchThreadId;                 // Touch reading thread id | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																// Gamepad input variables | 
																 | 
																 | 
																// Gamepad input variables | 
															
														
														
													
														
															
																 | 
																 | 
																static int gamepadStream[MAX_GAMEPADS] = { -1 };// Gamepad device file descriptor | 
																 | 
																 | 
																static int gamepadStream[MAX_GAMEPADS] = { -1 };// Gamepad device file descriptor | 
															
														
														
													
														
															
																 | 
																 | 
																static pthread_t gamepadThreadId;               // Gamepad reading thread id | 
																 | 
																 | 
																static pthread_t gamepadThreadId;               // Gamepad reading thread id | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -301,6 +307,8 @@ static void ProcessKeyboard(void);                      // Process keyboard even | 
															
														
														
													
														
															
																 | 
																 | 
																static void RestoreKeyboard(void);                      // Restore keyboard system | 
																 | 
																 | 
																static void RestoreKeyboard(void);                      // Restore keyboard system | 
															
														
														
													
														
															
																 | 
																 | 
																static void InitMouse(void);                            // Mouse initialization (including mouse thread) | 
																 | 
																 | 
																static void InitMouse(void);                            // Mouse initialization (including mouse thread) | 
															
														
														
													
														
															
																 | 
																 | 
																static void *MouseThread(void *arg);                    // Mouse reading thread | 
																 | 
																 | 
																static void *MouseThread(void *arg);                    // Mouse reading thread | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static void InitTouch(void);                            // Touch device initialization (including touch thread) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static void *TouchThread(void *arg);                    // Touch device reading thread | 
															
														
														
													
														
															
																 | 
																 | 
																static void InitGamepad(void);                          // Init raw gamepad input | 
																 | 
																 | 
																static void InitGamepad(void);                          // Init raw gamepad input | 
															
														
														
													
														
															
																 | 
																 | 
																static void *GamepadThread(void *arg);                  // Mouse reading thread | 
																 | 
																 | 
																static void *GamepadThread(void *arg);                  // Mouse reading thread | 
															
														
														
													
														
															
																 | 
																 | 
																#endif | 
																 | 
																 | 
																#endif | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -332,6 +340,7 @@ void InitWindow(int width, int height, const char *title) | 
															
														
														
													
														
															
																 | 
																 | 
																#if defined(PLATFORM_RPI) | 
																 | 
																 | 
																#if defined(PLATFORM_RPI) | 
															
														
														
													
														
															
																 | 
																 | 
																    // Init raw input system | 
																 | 
																 | 
																    // Init raw input system | 
															
														
														
													
														
															
																 | 
																 | 
																    InitMouse();        // Mouse init | 
																 | 
																 | 
																    InitMouse();        // Mouse init | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    InitTouch();        // Touch init | 
															
														
														
													
														
															
																 | 
																 | 
																    InitKeyboard();     // Keyboard init | 
																 | 
																 | 
																    InitKeyboard();     // Keyboard init | 
															
														
														
													
														
															
																 | 
																 | 
																    InitGamepad();      // Gamepad init | 
																 | 
																 | 
																    InitGamepad();      // Gamepad init | 
															
														
														
													
														
															
																 | 
																 | 
																#endif | 
																 | 
																 | 
																#endif | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -473,6 +482,7 @@ void CloseWindow(void) | 
															
														
														
													
														
															
																 | 
																 | 
																    windowShouldClose = true;   // Added to force threads to exit when the close window is called | 
																 | 
																 | 
																    windowShouldClose = true;   // Added to force threads to exit when the close window is called | 
															
														
														
													
														
															
																 | 
																 | 
																     | 
																 | 
																 | 
																     | 
															
														
														
													
														
															
																 | 
																 | 
																    pthread_join(mouseThreadId, NULL); | 
																 | 
																 | 
																    pthread_join(mouseThreadId, NULL); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    pthread_join(touchThreadId, NULL); | 
															
														
														
													
														
															
																 | 
																 | 
																    pthread_join(gamepadThreadId, NULL); | 
																 | 
																 | 
																    pthread_join(gamepadThreadId, NULL); | 
															
														
														
													
														
															
																 | 
																 | 
																#endif | 
																 | 
																 | 
																#endif | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -2874,6 +2884,55 @@ static void *MouseThread(void *arg) | 
															
														
														
													
														
															
																 | 
																 | 
																    return NULL; | 
																 | 
																 | 
																    return NULL; | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																// Touch initialization (including touch thread) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static void InitTouch(void) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																{ | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    if ((touchStream = open(DEFAULT_TOUCH_DEV, O_RDONLY|O_NONBLOCK)) < 0) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        TraceLog(WARNING, "Touch device could not be opened, no touchscreen available"); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    else | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        touchReady = true; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        int error = pthread_create(&touchThreadId, NULL, &TouchThread, NULL); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (error != 0) TraceLog(WARNING, "Error creating touch input event thread"); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        else TraceLog(INFO, "Touch device initialized successfully"); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																// Touch reading thread. | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																// This reads from a Virtual Input Event /dev/input/event4 which is  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																// created by the ts_uinput daemon. This takes, filters and scales | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																// raw input from the Touchscreen (which appears in /dev/input/event3) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																// based on the Calibration data referenced by tslib. | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static void *TouchThread(void *arg) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																{ | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    struct input_event ev; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    while (!windowShouldClose) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (read(touchStream, &ev, sizeof(ev)) == (int)sizeof(ev)) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            // if pressure > 0 then simulate left mouse button click | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            if (ev.type == EV_ABS && ev.code == 24 && ev.value == 0) currentMouseState[0] = 0;  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            if (ev.type == EV_ABS && ev.code == 24 && ev.value > 0) currentMouseState[0] = 1;  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            // x & y values supplied by event4 have been scaled & de-jittered using tslib calibration data | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            if (ev.type == EV_ABS && ev.code == 0) mousePosition.x = ev.value;			 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            if (ev.type == EV_ABS && ev.code == 1) mousePosition.y = ev.value;			 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            if (mousePosition.x < 0) mousePosition.x = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            if (mousePosition.y < 0) mousePosition.y = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            if (mousePosition.x > screenWidth) mousePosition.x = screenWidth; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            if (mousePosition.y > screenHeight) mousePosition.y = screenHeight; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    return NULL; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																// Init gamepad system | 
																 | 
																 | 
																// Init gamepad system | 
															
														
														
													
														
															
																 | 
																 | 
																static void InitGamepad(void) | 
																 | 
																 | 
																static void InitGamepad(void) | 
															
														
														
													
														
															
																 | 
																 | 
																{ | 
																 | 
																 | 
																{ | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																	
																 | 
																
 |