| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -3694,7 +3694,7 @@ unsigned char *DecodeDataBase64(const unsigned char *data, int *outputSize) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Ref: https://github.com/raysan5/raylib/issues/686 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void OpenURL(const char *url) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Security check to (aprtially) avoid malicious code on PLATFORM_WEB | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Security check to (partially) avoid malicious code on PLATFORM_WEB | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (strchr(url, '\'') != NULL) TRACELOG(LOG_WARNING, "SYSTEM: Provided URL could be potentially malicious, avoid [\'] character"); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -4277,9 +4277,9 @@ static bool InitGraphicsDevice(int width, int height) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Profiles Hint: Only 3.3 and above! | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                                                                       // Values: GLFW_OPENGL_CORE_PROFILE, GLFW_OPENGL_ANY_PROFILE, GLFW_OPENGL_COMPAT_PROFILE | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(__APPLE__) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);  // OSX Requires fordward compatibility | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);  // OSX Requires forward compatibility | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_FALSE); // Fordward Compatibility Hint: Only 3.3 and above! | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_FALSE); // Forward Compatibility Hint: Only 3.3 and above! | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        //glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE); // Request OpenGL DEBUG context | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -5890,7 +5890,7 @@ static void AndroidCommandCallback(struct android_app *app, int32_t cmd) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } break; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        case APP_CMD_TERM_WINDOW: | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // Dettach OpenGL context and destroy display surface | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // Detach OpenGL context and destroy display surface | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // NOTE 1: This case is used when the user exits the app without closing it. We detach the context to ensure everything is recoverable upon resuming. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // NOTE 2: Detaching context before destroying display surface avoids losing our resources (textures, shaders, VBOs...) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // NOTE 3: In some cases (too many context loaded), OS could unload context automatically... :( | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -6575,7 +6575,7 @@ static void ConfigureEvdevDevice(char *device) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absBits)), absBits); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Check for absolute movement support (usualy touchscreens, but also joysticks) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Check for absolute movement support (usually touchscreens, but also joysticks) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        if (TEST_BIT(absBits, ABS_X) && TEST_BIT(absBits, ABS_Y)) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            hasAbs = true; | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -6589,7 +6589,7 @@ static void ConfigureEvdevDevice(char *device) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            worker->absRange.height = absinfo.maximum - absinfo.minimum; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Check for multiple absolute movement support (usualy multitouch touchscreens) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Check for multiple absolute movement support (usually multitouch touchscreens) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        if (TEST_BIT(absBits, ABS_MT_POSITION_X) && TEST_BIT(absBits, ABS_MT_POSITION_Y)) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            hasAbsMulti = true; | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -6604,7 +6604,7 @@ static void ConfigureEvdevDevice(char *device) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Check for relative movement support (usualy mouse) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Check for relative movement support (usually mouse) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (TEST_BIT(evBits, EV_REL)) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        ioctl(fd, EVIOCGBIT(EV_REL, sizeof(relBits)), relBits); | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -6612,7 +6612,7 @@ static void ConfigureEvdevDevice(char *device) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        if (TEST_BIT(relBits, REL_X) && TEST_BIT(relBits, REL_Y)) hasRel = true; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Check for button support to determine the device type(usualy on all input devices) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Check for button support to determine the device type(usually on all input devices) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (TEST_BIT(evBits, EV_KEY)) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keyBits)), keyBits); | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -6740,7 +6740,7 @@ static void PollKeyboardEvents(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // Keyboard button parsing | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if ((event.code >= 1) && (event.code <= 255))     //Keyboard keys appear for codes 1 to 255 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                keycode = keymapUS[event.code & 0xFF];     // The code we get is a scancode so we look up the apropriate keycode | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                keycode = keymapUS[event.code & 0xFF];     // The code we get is a scancode so we look up the appropriate keycode | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                // Make sure we got a valid keycode | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if ((keycode > 0) && (keycode < sizeof(CORE.Input.Keyboard.currentKeyState))) | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -6817,8 +6817,8 @@ static void *EventThread(void *arg) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                // Basic movement | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (event.code == ABS_X) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    CORE.Input.Mouse.currentPosition.x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width;    // Scale acording to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    CORE.Input.Touch.position[0].x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width;        // Scale acording to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    CORE.Input.Mouse.currentPosition.x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width;    // Scale according to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    CORE.Input.Touch.position[0].x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width;        // Scale according to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    touchAction = 2;    // TOUCH_ACTION_MOVE | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    gestureUpdate = true; | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -6826,8 +6826,8 @@ static void *EventThread(void *arg) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (event.code == ABS_Y) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    CORE.Input.Mouse.currentPosition.y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height;  // Scale acording to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    CORE.Input.Touch.position[0].y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height;      // Scale acording to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    CORE.Input.Mouse.currentPosition.y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height;  // Scale according to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    CORE.Input.Touch.position[0].y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height;      // Scale according to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    touchAction = 2;    // TOUCH_ACTION_MOVE | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    gestureUpdate = true; | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -6838,12 +6838,12 @@ static void *EventThread(void *arg) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (event.code == ABS_MT_POSITION_X) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    if (worker->touchSlot < MAX_TOUCH_POINTS) CORE.Input.Touch.position[worker->touchSlot].x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width;    // Scale acording to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    if (worker->touchSlot < MAX_TOUCH_POINTS) CORE.Input.Touch.position[worker->touchSlot].x = (event.value - worker->absRange.x)*CORE.Window.screen.width/worker->absRange.width;    // Scale according to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (event.code == ABS_MT_POSITION_Y) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    if (worker->touchSlot < MAX_TOUCH_POINTS) CORE.Input.Touch.position[worker->touchSlot].y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height;  // Scale acording to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    if (worker->touchSlot < MAX_TOUCH_POINTS) CORE.Input.Touch.position[worker->touchSlot].y = (event.value - worker->absRange.y)*CORE.Window.screen.height/worker->absRange.height;  // Scale according to absRange | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (event.code == ABS_MT_TRACKING_ID) | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |