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
diff options
context:
space:
mode:
Diffstat (limited to 'intern/ghost/intern/GHOST_SystemPathsUnix.cpp')
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsUnix.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/intern/ghost/intern/GHOST_SystemPathsUnix.cpp b/intern/ghost/intern/GHOST_SystemPathsUnix.cpp
index ad3d490eb91..86f3a0a31fb 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,62 @@ 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 = "";
+ /* Pipe stderr to /dev/null to avoid error prints. We will fail gracefully still. */
+ string command = string("xdg-user-dir ") + type_str + " 2> /dev/null";
+
+ 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 path[0] ? (const GHOST_TUns8 *)path.c_str() : NULL;
+}
+
const GHOST_TUns8 *GHOST_SystemPathsUnix::getBinaryDir() const
{
return NULL;