| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -298,6 +298,9 @@ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define DEFAULT_EVDEV_PATH       "/dev/input/"  // Path to the linux input events | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#ifndef MAX_FILEPATH_CAPACITY | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define MAX_FILEPATH_CAPACITY       8192        // Maximum capacity for filepath | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#ifndef MAX_FILEPATH_LENGTH | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define MAX_FILEPATH_LENGTH         4096        // Maximum length for filepaths (Linux PATH_MAX default value) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -1181,7 +1184,6 @@ bool IsWindowState(unsigned int flag) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void ToggleFullscreen(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(PLATFORM_DESKTOP) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // TODO: glfwSetWindowMonitor() doesn't work properly (bugs) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (!CORE.Window.fullscreen) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Store previous window position (in case we exit fullscreen) | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -3142,8 +3144,9 @@ FilePathList LoadDirectoryFiles(const char *dirPath) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Memory allocation for dirFileCount | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        files.paths = (char **)RL_MALLOC(fileCounter*sizeof(char *)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        for (int i = 0; i < fileCounter; i++) files.paths[i] = (char *)RL_MALLOC(MAX_FILEPATH_LENGTH*sizeof(char)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        files.capacity = fileCounter; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        files.paths = (char **)RL_MALLOC(files.capacity*sizeof(char *)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        for (int i = 0; i < files.capacity; i++) files.paths[i] = (char *)RL_MALLOC(MAX_FILEPATH_LENGTH*sizeof(char)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        closedir(dir); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			         | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -3152,31 +3155,26 @@ FilePathList LoadDirectoryFiles(const char *dirPath) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        ScanDirectoryFiles(dirPath, &files, NULL); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			         | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Security check: read files.count should match fileCounter | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        if (files.count != fileCounter) TRACELOG(LOG_WARNING, "FILEIO: Read files count do not match memory allocated"); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        if (files.count != files.capacity) TRACELOG(LOG_WARNING, "FILEIO: Read files count do not match capacity allocated"); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    else TRACELOG(LOG_WARNING, "FILEIO: Failed to open requested directory");  // Maybe it's a file... | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return files; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Load directory filepaths with extension filtering and recursive directory scan | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: On recursive loading we do not pre-scan for file count, we use MAX_FILEPATH_CAPACITY | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			FilePathList LoadDirectoryFilesEx(const char *basePath, const char *filter, bool scanSubdirs) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define MAX_FILEPATH_COUNT         8192     // Maximum file paths scanned | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    FilePathList files = { 0 }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    files.paths = (char **)RL_CALLOC(MAX_FILEPATH_COUNT, sizeof(char *)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    for (int i = 0; i < MAX_FILEPATH_COUNT; i++) files.paths[i] = (char *)RL_CALLOC(MAX_FILEPATH_LENGTH, sizeof(char)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    files.capacity = MAX_FILEPATH_CAPACITY; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    files.paths = (char **)RL_CALLOC(files.capacity, sizeof(char *)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    for (int i = 0; i < files.capacity; i++) files.paths[i] = (char *)RL_CALLOC(MAX_FILEPATH_LENGTH, sizeof(char)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // WARNING: basePath is always prepended to scanned paths | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (scanSubdirs) ScanDirectoryFilesRecursively(basePath, &files, filter); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    else ScanDirectoryFiles(basePath, &files, filter); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // TODO: Filepath filtering | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //if (IsFileExtension(files.paths[i], filter)) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return files; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -3184,9 +3182,9 @@ FilePathList LoadDirectoryFilesEx(const char *basePath, const char *filter, bool | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Unload directory filepaths | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void UnloadDirectoryFiles(FilePathList files) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (files.count > 0) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (files.capacity > 0) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        for (int i = 0; i < files.count; i++) RL_FREE(files.paths[i]); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        for (int i = 0; i < files.capacity; i++) RL_FREE(files.paths[i]); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        RL_FREE(files.paths); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -5283,7 +5281,7 @@ static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *fi | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (dir != NULL) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        while ((dp = readdir(dir)) != NULL) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        while ((p">(dp = readdir(dir)) != NULL) && (files->count < files->capacity)) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if ((strcmp(dp->d_name, ".") != 0) && (strcmp(dp->d_name, "..") != 0)) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            { | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -5305,6 +5303,12 @@ static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *fi | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        strcpy(files->paths[files->count], path); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        files->count++; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    if (files->count >= files->capacity) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        TRACELOG(LOG_WARNING, "FILEIO: Maximum filepath scan capacity reached (%i files)", files->capacity); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        break; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                else ScanDirectoryFilesRecursively(path, files, filter); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            } | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -5806,7 +5810,7 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Register fullscreen change events | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			static EM_BOOL EmscriptenFullscreenChangeCallback(int eventType, const EmscriptenFullscreenChangeEvent *event, void *userData) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // ">TODO. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // l">TODO: Implement EmscriptenFullscreenChangeCallback()? | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return 1;   // The event was consumed by the callback handler | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -5814,7 +5818,7 @@ static EM_BOOL EmscriptenFullscreenChangeCallback(int eventType, const Emscripte | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Register window resize event | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			static EM_BOOL EmscriptenWindowResizedCallback(int eventType, const EmscriptenUiEvent *event, void *userData) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // ">TODO. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // l">TODO: Implement EmscriptenWindowResizedCallback()? | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return 1;   // The event was consumed by the callback handler | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -6202,7 +6206,6 @@ static void ConfigureEvdevDevice(char *device) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    worker->fd = fd; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Grab number on the end of the devices name "event<N>" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // TODO: Grab number on the end of the device name "mouse<N>" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    int devNum = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    char *ptrDevName = strrchr(device, 't'); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    worker->eventNum = -1; | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -6211,7 +6214,7 @@ static void ConfigureEvdevDevice(char *device) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        if (sscanf(ptrDevName, "t%d", &devNum) == 1) worker->eventNum = devNum; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    else worker->eventNum = 0;      // HACK for mouse0 device! | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    else worker->eventNum = 0;      // l">TODO: HACK: Grab number for mouse0 device! | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // At this point we have a connection to the device, but we don't yet know what the device is. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // It could be many things, even as simple as a power button... | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |