diff options
author | wm4 <wm4@nowhere> | 2015-07-27 21:46:55 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-07-27 21:48:30 +0200 |
commit | 3452f9aeac75a2134780b5bb4a1112d44de25d50 (patch) | |
tree | 4da685536c96e459152d1388fda81f7fcfe0715a /osdep | |
parent | 51ca8a4b3e87cf0ab8c5a7925de8739e29617f49 (diff) | |
download | mpv-3452f9aeac75a2134780b5bb4a1112d44de25d50.tar.bz2 mpv-3452f9aeac75a2134780b5bb4a1112d44de25d50.tar.xz |
win32: add portable config mode
See manpage additions.
The main reason for adding this is that we can't guess whether the user
wants his config in his Windows profile or not. The user basically has
to tell mpv what should be done, and the "portable_config" directory
does this implicitly.
Fixes #2042 (approximately).
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/path-win.c | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/osdep/path-win.c b/osdep/path-win.c index d0c29556d1..a735fad069 100644 --- a/osdep/path-win.c +++ b/osdep/path-win.c @@ -17,6 +17,7 @@ #include <windows.h> #include <shlobj.h> +#include <pthread.h> #include "osdep/path.h" #include "osdep/io.h" @@ -24,6 +25,10 @@ // Warning: do not use PATH_MAX. Cygwin messed it up. +static pthread_once_t path_init_once = PTHREAD_ONCE_INIT; + +static char *portable_path; + static char *mp_get_win_exe_dir(void *talloc_ctx) { wchar_t w_exedir[MAX_PATH + 1] = {0}; @@ -42,9 +47,9 @@ static char *mp_get_win_exe_dir(void *talloc_ctx) return mp_to_utf8(talloc_ctx, w_exedir); } -static char *mp_get_win_exe_subdir(void *talloc_ctx) +static char *mp_get_win_exe_subdir(void *ta_ctx, const char *name) { - return talloc_asprintf(talloc_ctx, "%s/mpv", mp_get_win_exe_dir(talloc_ctx)); + return talloc_asprintf(ta_ctx, "%s/%s", mp_get_win_exe_dir(ta_ctx), name); } static char *mp_get_win_shell_dir(void *talloc_ctx, int folder) @@ -64,15 +69,31 @@ static char *mp_get_win_app_dir(void *talloc_ctx) return path ? mp_path_join(talloc_ctx, path, "mpv") : NULL; } + +static void path_init(void) +{ + void *tmp = talloc_new(NULL); + char *path = mp_get_win_exe_subdir(tmp, "portable_config"); + if (path && mp_path_exists(path)) + portable_path = talloc_strdup(NULL, path); + talloc_free(tmp); +} + const char *mp_get_platform_path_win(void *talloc_ctx, const char *type) { - if (strcmp(type, "home") == 0) - return mp_get_win_app_dir(talloc_ctx); - if (strcmp(type, "old_home") == 0) - return mp_get_win_exe_dir(talloc_ctx); - // Not really true, but serves as a way to return a lowest-priority dir. - if (strcmp(type, "global") == 0) - return mp_get_win_exe_subdir(talloc_ctx); + pthread_once(&path_init_once, path_init); + if (portable_path) { + if (strcmp(type, "home") == 0) + return portable_path; + } else { + if (strcmp(type, "home") == 0) + return mp_get_win_app_dir(talloc_ctx); + if (strcmp(type, "old_home") == 0) + return mp_get_win_exe_dir(talloc_ctx); + // Not really true, but serves as a way to return a lowest-priority dir. + if (strcmp(type, "global") == 0) + return mp_get_win_exe_subdir(talloc_ctx, "mpv"); + } if (strcmp(type, "desktop") == 0) return mp_get_win_shell_dir(talloc_ctx, CSIDL_DESKTOPDIRECTORY); return NULL; |