osdep: separate out macos paths from path-unix.c

macOS really has completely different path conventions that mpv doesn't
take into account and it treats it just like any other old unix-like
system. This means mpv enforces certain conventions on it (like all the
XDG stuff) that doesn't really apply. Since we'd like to use more of
this but at the same time not distrupt mac users even more, let's just
copy and paste the current code to a new file, update the build and call
it a day. This way, the paths of these two platforms can more freely
diverge.
This commit is contained in:
Dudemanguy 2022-11-07 18:02:22 -06:00
parent a1580b6424
commit baa9d56481
6 changed files with 84 additions and 4 deletions

View File

@ -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 = {

View File

@ -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

66
osdep/path-darwin.c Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#include <pthread.h>
#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;
}

View File

@ -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);

View File

@ -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',

View File

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