summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-07-27 21:46:55 +0200
committerwm4 <wm4@nowhere>2015-07-27 21:48:30 +0200
commit3452f9aeac75a2134780b5bb4a1112d44de25d50 (patch)
tree4da685536c96e459152d1388fda81f7fcfe0715a
parent51ca8a4b3e87cf0ab8c5a7925de8739e29617f49 (diff)
downloadmpv-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).
-rw-r--r--DOCS/man/mpv.rst8
-rw-r--r--osdep/path-win.c39
2 files changed, 38 insertions, 9 deletions
diff --git a/DOCS/man/mpv.rst b/DOCS/man/mpv.rst
index 55da5d9b0a..84d72b070e 100644
--- a/DOCS/man/mpv.rst
+++ b/DOCS/man/mpv.rst
@@ -881,6 +881,14 @@ Other config files (such as ``input.conf``) are in the same directory. See the
The environment variable ``$MPV_HOME`` completely overrides these, like on
UNIX.
+If a directory named ``portable_config`` next to the mpv.exe exists, all
+config will be loaded from this directory only. Watch later config files are
+written to this directory as well. (This exists on Windows only and is redundant
+with ``$MPV_HOME``. However, since Windows is very scripting unfriendly, a
+wrapper script just setting ``$MPV_HOME``, like you could do it on other
+systems, won't work. ``portable_config`` is provided for convenience to get
+around this restriction.)
+
Config files located in the same directory as ``mpv.exe`` are loaded with
lower priority. Some config files are loaded only once, which means that
e.g. of 2 ``input.conf`` files located in two config directories, only the
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;