OSX: populate file dialog system & bookmark defaults paths with the finder's ones
authorDamien Plisson <damien.plisson@yahoo.fr>
Thu, 17 Dec 2009 09:23:47 +0000 (09:23 +0000)
committerDamien Plisson <damien.plisson@yahoo.fr>
Thu, 17 Dec 2009 09:23:47 +0000 (09:23 +0000)
Former implementation was to populate the "system" paths with the mounted paths. The issue is that OSX mounts some paths that are of no use such as /home (The home dirs reside in /Users).

When compiled with 10.5 SDK, it retrieves the folders you have in the finder and OSX standard open/save dialog.
When compiled with older SDKs, it assumes these folders are the default ones (home, Desktop, Documents, Pictures, Music, Movies).

source/blender/editors/space_file/fsmenu.c

index b45b57c6be9ef5262fb194bae2db5689a5d89f9b..bd39a10f661327add41df210b1f8c23f771a0b76 100644 (file)
@@ -284,8 +284,10 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename)
 #else
 #ifdef __APPLE__
        {
+#if (MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4)
                OSErr err=noErr;
                int i;
+               char *home;
                
                /* loop through all the OS X Volumes, and add them to the SYSTEM section */
                for (i=1; err!=nsvErr; i++)
@@ -298,8 +300,109 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename)
                                continue;
                        
                        FSRefMakePath(&dir, path, FILE_MAXDIR+FILE_MAXFILE);
-                       fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, (char *)path, 1, 0);
+                       if (strcmp((char*)path, "/home") && strcmp((char*)path, "/net"))
+                       { /* /net and /home are meaningless on OSX, home folders are stored in /Users */
+                               fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, (char *)path, 1, 0);
+                       }
+               }
+
+               /* As 10.4 doesn't provide proper API to retrieve the favorite places,
+                assume they are the standard ones 
+                TODO : replace hardcoded paths with proper BLI_get_folder calls */
+               home = BLI_gethome();
+               if(home) {
+                       BLI_snprintf(line, 256, "%s/", home);
+                       fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0);
+                       BLI_snprintf(line, 256, "%s/Desktop/", home);
+                       if (BLI_exists(line)) {
+                               fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0);
+                       }
+                       BLI_snprintf(line, 256, "%s/Documents/", home);
+                       if (BLI_exists(line)) {
+                               fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0);
+                       }
+                       BLI_snprintf(line, 256, "%s/Pictures/", home);
+                       if (BLI_exists(line)) {
+                               fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0);
+                       }
+                       BLI_snprintf(line, 256, "%s/Music/", home);
+                       if (BLI_exists(line)) {
+                               fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0);
+                       }
+                       BLI_snprintf(line, 256, "%s/Movies/", home);
+                       if (BLI_exists(line)) {
+                               fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0);
+                       }
+               }
+#else
+               /* 10.5 provides ability to retrieve Finder favorite places */
+               UInt32 seed;
+               OSErr err = noErr;
+               CFArrayRef pathesArray;
+               LSSharedFileListRef list;
+               LSSharedFileListItemRef itemRef;
+               CFIndex i, pathesCount;
+               CFURLRef cfURL = NULL;
+               CFStringRef pathString = NULL;
+               
+               /* First get mounted volumes */
+               list = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteVolumes, NULL);
+               pathesArray = LSSharedFileListCopySnapshot(list, &seed);
+               pathesCount = CFArrayGetCount(pathesArray);
+               
+               for (i=0; i<pathesCount; i++)
+               {
+                       itemRef = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(pathesArray, i);
+                       
+                       err = LSSharedFileListItemResolve(itemRef, 
+                                                                                         kLSSharedFileListNoUserInteraction
+                                                                                         | kLSSharedFileListDoNotMountVolumes, 
+                                                                                         &cfURL, NULL);
+                       if (err != noErr)
+                               continue;
+                       
+                       pathString = CFURLCopyFileSystemPath(cfURL, kCFURLPOSIXPathStyle);
+                       
+                       if (!CFStringGetCString(pathString,line,256,kCFStringEncodingASCII))
+                               continue;
+                       fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, line, 1, 0);
+                       
+                       CFRelease(pathString);
+                       CFRelease(cfURL);
                }
+               
+               CFRelease(pathesArray);
+               CFRelease(list);
+               
+               /* Then get user favorite places */
+               list = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL);
+               pathesArray = LSSharedFileListCopySnapshot(list, &seed);
+               pathesCount = CFArrayGetCount(pathesArray);
+               
+               for (i=0; i<pathesCount; i++)
+               {
+                       itemRef = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(pathesArray, i);
+                       
+                       err = LSSharedFileListItemResolve(itemRef, 
+                                                                                         kLSSharedFileListNoUserInteraction
+                                                                                         | kLSSharedFileListDoNotMountVolumes, 
+                                                                                         &cfURL, NULL);
+                       if (err != noErr)
+                               continue;
+                       
+                       pathString = CFURLCopyFileSystemPath(cfURL, kCFURLPOSIXPathStyle);
+                       
+                       if (!CFStringGetCString(pathString,line,256,kCFStringEncodingASCII))
+                               continue;
+                       fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0);
+                       
+                       CFRelease(pathString);
+                       CFRelease(cfURL);
+               }
+               
+               CFRelease(pathesArray);
+               CFRelease(list);
+#endif /* OSX 10.5+ */
        }
 #else
        /* unix */