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" ),