mirror of https://github.com/mpv-player/mpv
osx: improve bundle handling
we have two problems here. first when mpv is started from the bundle it uses its own environment variables and possibly can't find for example the youtube-dl binary for our youtube-dl hook. second we couldn't reliable determine when mpv was started from the bundle, which led to the pseudo-gui usage even when the binary was invoked from a shell. to prevent this we will wrap the bundle binary with a shell script, which will only be called when we start mpv from the bundle. this way we can get the same environment variables, like $PATH, for our bundle and additional we can set the pseudo-gui only when started through this script. it is also possible to detect the bundle usage properly and accurately through the usage of another environment var. Fixes #2061
This commit is contained in:
parent
fdd1ef6028
commit
a5b97104cf
|
@ -173,7 +173,7 @@
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>mpv</string>
|
<string>mpv-wrapper.sh</string>
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
<string>icon</string>
|
<string>icon</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
export MPVBUNDLE="true"
|
||||||
|
$SHELL -l -c "$(dirname "$0")/mpv --player-operation-mode=pseudo-gui"
|
|
@ -1 +0,0 @@
|
||||||
player-operation-mode=pseudo-gui
|
|
|
@ -310,53 +310,12 @@ static void macosx_redirect_output_to_logfile(const char *filename)
|
||||||
[pool release];
|
[pool release];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_system_version(int* major, int* minor, int* bugfix)
|
static bool bundle_started_from_finder()
|
||||||
{
|
{
|
||||||
static dispatch_once_t once_token;
|
NSDictionary *env = [[NSProcessInfo processInfo] environment];
|
||||||
static int s_major = 0;
|
NSString *is_bundle = [env objectForKey:@"MPVBUNDLE"];
|
||||||
static int s_minor = 0;
|
|
||||||
static int s_bugfix = 0;
|
|
||||||
dispatch_once(&once_token, ^{
|
|
||||||
NSString *version_plist =
|
|
||||||
@"/System/Library/CoreServices/SystemVersion.plist";
|
|
||||||
NSString *version_string =
|
|
||||||
[NSDictionary dictionaryWithContentsOfFile:version_plist]
|
|
||||||
[@"ProductVersion"];
|
|
||||||
NSArray* versions = [version_string componentsSeparatedByString:@"."];
|
|
||||||
int count = [versions count];
|
|
||||||
if (count >= 1)
|
|
||||||
s_major = [versions[0] intValue];
|
|
||||||
if (count >= 2)
|
|
||||||
s_minor = [versions[1] intValue];
|
|
||||||
if (count >= 3)
|
|
||||||
s_bugfix = [versions[2] intValue];
|
|
||||||
});
|
|
||||||
*major = s_major;
|
|
||||||
*minor = s_minor;
|
|
||||||
*bugfix = s_bugfix;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool is_psn_argument(char *psn_arg_to_check)
|
return is_bundle ? [is_bundle boolValue] : false;
|
||||||
{
|
|
||||||
NSString *psn_arg = [NSString stringWithUTF8String:psn_arg_to_check];
|
|
||||||
return [psn_arg hasPrefix:@"-psn_"];
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool bundle_started_from_finder(int argc, char **argv)
|
|
||||||
{
|
|
||||||
bool bundle_detected = [[NSBundle mainBundle] bundleIdentifier];
|
|
||||||
int major, minor, bugfix;
|
|
||||||
get_system_version(&major, &minor, &bugfix);
|
|
||||||
bool without_psn = bundle_detected && argc==1;
|
|
||||||
bool with_psn = bundle_detected && argc==2 && is_psn_argument(argv[1]);
|
|
||||||
|
|
||||||
if ((major == 10) && (minor >= 9)) {
|
|
||||||
// Looks like opening quarantined files from the finder inserts the
|
|
||||||
// -psn argument while normal files do not. Hurr.
|
|
||||||
return with_psn || without_psn;
|
|
||||||
} else {
|
|
||||||
return with_psn;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int cocoa_main(int argc, char *argv[])
|
int cocoa_main(int argc, char *argv[])
|
||||||
|
@ -368,11 +327,7 @@ int cocoa_main(int argc, char *argv[])
|
||||||
ctx.argc = &argc;
|
ctx.argc = &argc;
|
||||||
ctx.argv = &argv;
|
ctx.argv = &argv;
|
||||||
|
|
||||||
if (bundle_started_from_finder(argc, argv)) {
|
if (bundle_started_from_finder()) {
|
||||||
if (argc > 1) {
|
|
||||||
argc = 1; // clears out -psn argument if present
|
|
||||||
argv[1] = NULL;
|
|
||||||
}
|
|
||||||
macosx_redirect_output_to_logfile("mpv");
|
macosx_redirect_output_to_logfile("mpv");
|
||||||
init_cocoa_application(true);
|
init_cocoa_application(true);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue