diff --git a/meson.build b/meson.build
index 30cb219a5b..bc7361af2f 100644
--- a/meson.build
+++ b/meson.build
@@ -293,6 +293,8 @@ endif
darwin = host_machine.system() == 'darwin'
win32 = host_machine.system() == 'cygwin' or host_machine.system() == 'windows'
posix = not win32
+
+features += {'darwin': darwin}
features += {'posix': posix}
features += {'dos-paths': win32, 'win32': win32}
@@ -407,11 +409,14 @@ if posix and not features['cocoa']
endif
if darwin
- sources += files('osdep/timer-darwin.c')
+ path_source = files('osdep/path-darwin.c')
+ sources += path_source + files('osdep/timer-darwin.c')
+
endif
if posix and not darwin
- sources += files('osdep/timer-linux.c')
+ sources += files('osdep/path-unix.c',
+ 'osdep/timer-linux.c')
endif
cd_devices = {
diff --git a/options/path.c b/options/path.c
index 504adb7c84..4dfe36bd2d 100644
--- a/options/path.c
+++ b/options/path.c
@@ -44,7 +44,9 @@ static const mp_get_platform_path_cb path_resolvers[] = {
#if HAVE_COCOA
mp_get_platform_path_osx,
#endif
-#if !defined(_WIN32) || defined(__CYGWIN__)
+#if HAVE_DARWIN
+ mp_get_platform_path_darwin,
+#elif !defined(_WIN32) || defined(__CYGWIN__)
mp_get_platform_path_unix,
#endif
#if HAVE_UWP
diff --git a/osdep/path-darwin.c b/osdep/path-darwin.c
new file mode 100644
index 0000000000..da8285182d
--- /dev/null
+++ b/osdep/path-darwin.c
@@ -0,0 +1,66 @@
+/*
+ * This file is part of mpv.
+ *
+ * mpv is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * mpv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with mpv. If not, see .
+ */
+
+#include
+#include
+
+#include "options/path.h"
+#include "path.h"
+
+#include "config.h"
+
+static pthread_once_t path_init_once = PTHREAD_ONCE_INIT;
+
+static char mpv_home[512];
+static char old_home[512];
+
+static void path_init(void)
+{
+ char *home = getenv("HOME");
+ char *xdg_dir = getenv("XDG_CONFIG_HOME");
+
+ if (xdg_dir && xdg_dir[0]) {
+ snprintf(mpv_home, sizeof(mpv_home), "%s/mpv", xdg_dir);
+ } else if (home && home[0]) {
+ snprintf(mpv_home, sizeof(mpv_home), "%s/.config/mpv", home);
+ }
+
+ // Maintain compatibility with old ~/.mpv
+ if (home && home[0])
+ snprintf(old_home, sizeof(old_home), "%s/.mpv", home);
+
+ // If the old ~/.mpv exists, and the XDG config dir doesn't, use the old
+ // config dir only.
+ if (mp_path_exists(old_home) && !mp_path_exists(mpv_home)) {
+ snprintf(mpv_home, sizeof(mpv_home), "%s", old_home);
+ old_home[0] = '\0';
+ }
+}
+
+const char *mp_get_platform_path_darwin(void *talloc_ctx, const char *type)
+{
+ pthread_once(&path_init_once, path_init);
+ if (strcmp(type, "home") == 0)
+ return mpv_home;
+ if (strcmp(type, "old_home") == 0)
+ return old_home;
+ if (strcmp(type, "global") == 0)
+ return MPV_CONFDIR;
+ if (strcmp(type, "desktop") == 0)
+ return getenv("HOME");
+ return NULL;
+}
diff --git a/osdep/path.h b/osdep/path.h
index c082c1ee16..43b9d63bbe 100644
--- a/osdep/path.h
+++ b/osdep/path.h
@@ -16,6 +16,7 @@
typedef const char *(*mp_get_platform_path_cb)(void *talloc_ctx, const char *type);
// Conforming to mp_get_platform_path_cb.
+const char *mp_get_platform_path_darwin(void *talloc_ctx, const char *type);
const char *mp_get_platform_path_uwp(void *talloc_ctx, const char *type);
const char *mp_get_platform_path_win(void *talloc_ctx, const char *type);
const char *mp_get_platform_path_osx(void *talloc_ctx, const char *type);
diff --git a/wscript b/wscript
index 2f97bb660a..25578e7235 100644
--- a/wscript
+++ b/wscript
@@ -155,6 +155,11 @@ main_dependencies = [
'name': 'posix',
'desc': 'POSIX environment',
'func': check_statement(['unistd.h'], 'long x = _POSIX_VERSION'),
+ }, {
+ 'name': 'darwin',
+ 'desc': 'Darwin environment',
+ 'deps': 'os-darwin',
+ 'func': check_true,
}, {
'name': '--android',
'desc': 'Android environment',
diff --git a/wscript_build.py b/wscript_build.py
index c8056aad63..51f6351960 100644
--- a/wscript_build.py
+++ b/wscript_build.py
@@ -587,8 +587,9 @@ def build(ctx):
( "osdep/macosx_menubar.m", "cocoa" ),
( "osdep/macosx_touchbar.m", "macos-touchbar" ),
( "osdep/mpv.rc", "win32-executable" ),
+ ( "osdep/path-darwin.c", "os-darwin"),
( "osdep/path-macosx.m", "cocoa" ),
- ( "osdep/path-unix.c"),
+ ( "osdep/path-unix.c", "posix && !os-darwin" ),
( "osdep/path-uwp.c", "uwp" ),
( "osdep/path-win.c", "win32-desktop" ),
( "osdep/semaphore_osx.c" ),