Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
Diffstat (limited to 'intern')
-rw-r--r--intern/ghost/GHOST_ISystemPaths.h6
-rw-r--r--intern/ghost/GHOST_Path-api.h6
-rw-r--r--intern/ghost/GHOST_Types.h10
-rw-r--r--intern/ghost/intern/GHOST_Path-api.cpp6
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsCocoa.h6
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsCocoa.mm52
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsUnix.cpp58
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsUnix.h6
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsWin32.cpp45
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsWin32.h6
10 files changed, 201 insertions, 0 deletions
diff --git a/intern/ghost/GHOST_ISystemPaths.h b/intern/ghost/GHOST_ISystemPaths.h
index b47d14984d8..e7ac752d322 100644
--- a/intern/ghost/GHOST_ISystemPaths.h
+++ b/intern/ghost/GHOST_ISystemPaths.h
@@ -78,6 +78,12 @@ class GHOST_ISystemPaths {
virtual const GHOST_TUns8 *getUserDir(int version, const char *versionstr) const = 0;
/**
+ * Determine a special ("well known") and easy to reach user directory.
+ * \return Unsigned char string pointing to user dir (eg `~/Documents/`).
+ */
+ virtual const GHOST_TUns8 *getUserSpecialDir(GHOST_TUserSpecialDirTypes type) const = 0;
+
+ /**
* Determine the directory of the current binary
* \return Unsigned char string pointing to the binary dir
*/
diff --git a/intern/ghost/GHOST_Path-api.h b/intern/ghost/GHOST_Path-api.h
index 4cc232be6b6..36ea70838ca 100644
--- a/intern/ghost/GHOST_Path-api.h
+++ b/intern/ghost/GHOST_Path-api.h
@@ -57,6 +57,12 @@ extern const GHOST_TUns8 *GHOST_getSystemDir(int version, const char *versionstr
extern const GHOST_TUns8 *GHOST_getUserDir(int version, const char *versionstr);
/**
+ * Determine a special ("well known") and easy to reach user directory.
+ * \return Unsigned char string pointing to user dir (eg `~/Documents/`).
+ */
+extern const GHOST_TUns8 *GHOST_getUserSpecialDir(GHOST_TUserSpecialDirTypes type);
+
+/**
* Determine the dir in which the binary file is found.
* \return Unsigned char string pointing to binary dir (eg ~/usr/local/bin/).
*/
diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h
index a03b59d14b0..8bce064ce63 100644
--- a/intern/ghost/GHOST_Types.h
+++ b/intern/ghost/GHOST_Types.h
@@ -565,6 +565,16 @@ typedef struct {
char is_repeat;
} GHOST_TEventKeyData;
+typedef enum {
+ GHOST_kUserSpecialDirDesktop,
+ GHOST_kUserSpecialDirDocuments,
+ GHOST_kUserSpecialDirDownloads,
+ GHOST_kUserSpecialDirMusic,
+ GHOST_kUserSpecialDirPictures,
+ GHOST_kUserSpecialDirVideos,
+ /* Can be extended as needed. */
+} GHOST_TUserSpecialDirTypes;
+
typedef struct {
/** Number of pixels on a line. */
GHOST_TUns32 xPixels;
diff --git a/intern/ghost/intern/GHOST_Path-api.cpp b/intern/ghost/intern/GHOST_Path-api.cpp
index df3592fb5e5..c82e9819f3c 100644
--- a/intern/ghost/intern/GHOST_Path-api.cpp
+++ b/intern/ghost/intern/GHOST_Path-api.cpp
@@ -50,6 +50,12 @@ const GHOST_TUns8 *GHOST_getUserDir(int version, const char *versionstr)
return systemPaths ? systemPaths->getUserDir(version, versionstr) : NULL; /* shouldn't be NULL */
}
+const GHOST_TUns8 *GHOST_getUserSpecialDir(GHOST_TUserSpecialDirTypes type)
+{
+ GHOST_ISystemPaths *systemPaths = GHOST_ISystemPaths::get();
+ return systemPaths ? systemPaths->getUserSpecialDir(type) : NULL; /* shouldn't be NULL */
+}
+
const GHOST_TUns8 *GHOST_getBinaryDir()
{
GHOST_ISystemPaths *systemPaths = GHOST_ISystemPaths::get();
diff --git a/intern/ghost/intern/GHOST_SystemPathsCocoa.h b/intern/ghost/intern/GHOST_SystemPathsCocoa.h
index 188f6f02286..14633d46f03 100644
--- a/intern/ghost/intern/GHOST_SystemPathsCocoa.h
+++ b/intern/ghost/intern/GHOST_SystemPathsCocoa.h
@@ -56,6 +56,12 @@ class GHOST_SystemPathsCocoa : public GHOST_SystemPaths {
const GHOST_TUns8 *getUserDir(int version, const char *versionstr) const;
/**
+ * Determine a special ("well known") and easy to reach user directory.
+ * \return Unsigned char string pointing to user dir (eg `~/Documents/`).
+ */
+ const GHOST_TUns8 *getUserSpecialDir(GHOST_TUserSpecialDirTypes type) const;
+
+ /**
* Determine the directory of the current binary
* \return Unsigned char string pointing to the binary dir
*/
diff --git a/intern/ghost/intern/GHOST_SystemPathsCocoa.mm b/intern/ghost/intern/GHOST_SystemPathsCocoa.mm
index 830d58ba42c..7c6184837bf 100644
--- a/intern/ghost/intern/GHOST_SystemPathsCocoa.mm
+++ b/intern/ghost/intern/GHOST_SystemPathsCocoa.mm
@@ -21,6 +21,7 @@
#import <Foundation/Foundation.h>
+#include "GHOST_Debug.h"
#include "GHOST_SystemPathsCocoa.h"
#pragma mark initialization/finalization
@@ -89,6 +90,57 @@ const GHOST_TUns8 *GHOST_SystemPathsCocoa::getUserDir(int, const char *versionst
return (GHOST_TUns8 *)tempPath;
}
+const GHOST_TUns8 *GHOST_SystemPathsCocoa::getUserSpecialDir(GHOST_TUserSpecialDirTypes type) const
+{
+ static char tempPath[512] = "";
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ NSString *basePath;
+ NSArray *paths;
+ NSSearchPathDirectory ns_directory;
+
+ switch (type) {
+ case GHOST_kUserSpecialDirDesktop:
+ ns_directory = NSDesktopDirectory;
+ break;
+ case GHOST_kUserSpecialDirDocuments:
+ ns_directory = NSDocumentDirectory;
+ break;
+ case GHOST_kUserSpecialDirDownloads:
+ ns_directory = NSDownloadsDirectory;
+ break;
+ case GHOST_kUserSpecialDirMusic:
+ ns_directory = NSMusicDirectory;
+ break;
+ case GHOST_kUserSpecialDirPictures:
+ ns_directory = NSPicturesDirectory;
+ break;
+ case GHOST_kUserSpecialDirVideos:
+ ns_directory = NSMoviesDirectory;
+ break;
+ default:
+ GHOST_ASSERT(
+ false,
+ "GHOST_SystemPathsCocoa::getUserSpecialDir(): Invalid enum value for type parameter");
+ [pool drain];
+ return NULL;
+ }
+
+ paths = NSSearchPathForDirectoriesInDomains(ns_directory, NSUserDomainMask, YES);
+
+ if ([paths count] > 0)
+ basePath = [paths objectAtIndex:0];
+ else {
+ [pool drain];
+ return NULL;
+ }
+
+ strncpy(
+ (char *)tempPath, [basePath cStringUsingEncoding:NSASCIIStringEncoding], sizeof(tempPath));
+
+ [pool drain];
+ return (GHOST_TUns8 *)tempPath;
+}
+
const GHOST_TUns8 *GHOST_SystemPathsCocoa::getBinaryDir() const
{
static GHOST_TUns8 tempPath[512] = "";
diff --git a/intern/ghost/intern/GHOST_SystemPathsUnix.cpp b/intern/ghost/intern/GHOST_SystemPathsUnix.cpp
index ad3d490eb91..16b092a9e5e 100644
--- a/intern/ghost/intern/GHOST_SystemPathsUnix.cpp
+++ b/intern/ghost/intern/GHOST_SystemPathsUnix.cpp
@@ -21,6 +21,9 @@
* \ingroup GHOST
*/
+#include <cstdio>
+#include <sstream>
+
#include "GHOST_SystemPathsUnix.h"
#include "GHOST_Debug.h"
@@ -108,6 +111,61 @@ const GHOST_TUns8 *GHOST_SystemPathsUnix::getUserDir(int version, const char *ve
}
}
+const GHOST_TUns8 *GHOST_SystemPathsUnix::getUserSpecialDir(GHOST_TUserSpecialDirTypes type) const
+{
+ const char *type_str;
+
+ switch (type) {
+ case GHOST_kUserSpecialDirDesktop:
+ type_str = "DESKTOP";
+ break;
+ case GHOST_kUserSpecialDirDocuments:
+ type_str = "DOCUMENTS";
+ break;
+ case GHOST_kUserSpecialDirDownloads:
+ type_str = "DOWNLOAD";
+ break;
+ case GHOST_kUserSpecialDirMusic:
+ type_str = "MUSIC";
+ break;
+ case GHOST_kUserSpecialDirPictures:
+ type_str = "PICTURES";
+ break;
+ case GHOST_kUserSpecialDirVideos:
+ type_str = "VIDEOS";
+ break;
+ default:
+ GHOST_ASSERT(
+ false,
+ "GHOST_SystemPathsUnix::getUserSpecialDir(): Invalid enum value for type parameter");
+ return NULL;
+ }
+
+ static string path = "";
+ string command = string("xdg-user-dir ") + type_str;
+
+ FILE *fstream = popen(command.c_str(), "r");
+ if (fstream == NULL) {
+ return NULL;
+ }
+ std::stringstream path_stream;
+ while (!feof(fstream)) {
+ char c = fgetc(fstream);
+ /* xdg-user-dir ends the path with '\n'. */
+ if (c == '\n') {
+ break;
+ }
+ path_stream << c;
+ }
+ if (pclose(fstream) == -1) {
+ perror("GHOST_SystemPathsUnix::getUserSpecialDir failed at pclose()");
+ return NULL;
+ }
+
+ path = path_stream.str();
+ return (const GHOST_TUns8 *)path.c_str();
+}
+
const GHOST_TUns8 *GHOST_SystemPathsUnix::getBinaryDir() const
{
return NULL;
diff --git a/intern/ghost/intern/GHOST_SystemPathsUnix.h b/intern/ghost/intern/GHOST_SystemPathsUnix.h
index 8d2f26a28aa..bc9272ecd8f 100644
--- a/intern/ghost/intern/GHOST_SystemPathsUnix.h
+++ b/intern/ghost/intern/GHOST_SystemPathsUnix.h
@@ -54,6 +54,12 @@ class GHOST_SystemPathsUnix : public GHOST_SystemPaths {
const GHOST_TUns8 *getUserDir(int version, const char *versionstr) const;
/**
+ * Determine a special ("well known") and easy to reach user directory.
+ * \return Unsigned char string pointing to user dir (eg `~/Documents/`).
+ */
+ const GHOST_TUns8 *getUserSpecialDir(GHOST_TUserSpecialDirTypes type) const;
+
+ /**
* Determine the directory of the current binary
* \return Unsigned char string pointing to the binary dir
*/
diff --git a/intern/ghost/intern/GHOST_SystemPathsWin32.cpp b/intern/ghost/intern/GHOST_SystemPathsWin32.cpp
index 673cbcad97e..193633b5c3e 100644
--- a/intern/ghost/intern/GHOST_SystemPathsWin32.cpp
+++ b/intern/ghost/intern/GHOST_SystemPathsWin32.cpp
@@ -22,6 +22,7 @@
*/
#include "GHOST_SystemPathsWin32.h"
+#include "GHOST_Debug.h"
#ifndef _WIN32_IE
# define _WIN32_IE 0x0501
@@ -76,6 +77,50 @@ const GHOST_TUns8 *GHOST_SystemPathsWin32::getUserDir(int, const char *versionst
return NULL;
}
+const GHOST_TUns8 *GHOST_SystemPathsWin32::getUserSpecialDir(GHOST_TUserSpecialDirTypes type) const
+{
+ GUID folderid;
+
+ switch (type) {
+ case GHOST_kUserSpecialDirDesktop:
+ folderid = FOLDERID_Desktop;
+ break;
+ case GHOST_kUserSpecialDirDocuments:
+ folderid = FOLDERID_Documents;
+ break;
+ case GHOST_kUserSpecialDirDownloads:
+ folderid = FOLDERID_Downloads;
+ break;
+ case GHOST_kUserSpecialDirMusic:
+ folderid = FOLDERID_Music;
+ break;
+ case GHOST_kUserSpecialDirPictures:
+ folderid = FOLDERID_Pictures;
+ break;
+ case GHOST_kUserSpecialDirVideos:
+ folderid = FOLDERID_Videos;
+ break;
+ default:
+ GHOST_ASSERT(
+ false,
+ "GHOST_SystemPathsWin32::getUserSpecialDir(): Invalid enum value for type parameter");
+ return NULL;
+ }
+
+ static char knownpath[MAX_PATH * 3] = {0};
+ PWSTR knownpath_16 = NULL;
+ HRESULT hResult = SHGetKnownFolderPath(folderid, KF_FLAG_DEFAULT, NULL, &knownpath_16);
+
+ if (hResult == S_OK) {
+ conv_utf_16_to_8(knownpath_16, knownpath, MAX_PATH * 3);
+ CoTaskMemFree(knownpath_16);
+ return (GHOST_TUns8 *)knownpath;
+ }
+
+ CoTaskMemFree(knownpath_16);
+ return NULL;
+}
+
const GHOST_TUns8 *GHOST_SystemPathsWin32::getBinaryDir() const
{
static char fullname[MAX_PATH * 3] = {0};
diff --git a/intern/ghost/intern/GHOST_SystemPathsWin32.h b/intern/ghost/intern/GHOST_SystemPathsWin32.h
index 1a1eab21bad..45e03e744a5 100644
--- a/intern/ghost/intern/GHOST_SystemPathsWin32.h
+++ b/intern/ghost/intern/GHOST_SystemPathsWin32.h
@@ -63,6 +63,12 @@ class GHOST_SystemPathsWin32 : public GHOST_SystemPaths {
const GHOST_TUns8 *getUserDir(int version, const char *versionstr) const;
/**
+ * Determine a special ("well known") and easy to reach user directory.
+ * \return Unsigned char string pointing to user dir (eg `~/Documents/`).
+ */
+ const GHOST_TUns8 *getUserSpecialDir(GHOST_TUserSpecialDirTypes type) const;
+
+ /**
* Determine the directory of the current binary
* \return Unsigned char string pointing to the binary dir
*/