From 1e3aad5f876b8e01dd3100e1bc6ecd6572f2f9bf Mon Sep 17 00:00:00 2001 From: James Ross-Gowan Date: Mon, 30 Mar 2015 02:34:58 +1100 Subject: win32: use pseudo-gui profile when started without stdio If mpv is started from Explorer or the Start Menu, it will have no console and no standard IO handles. In this case, it's fairly safe to enable the pseudo-gui profile. --- player/main-fn-win.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/player/main-fn-win.c b/player/main-fn-win.c index 9e46e4af5f..ad883dcba9 100644 --- a/player/main-fn-win.c +++ b/player/main-fn-win.c @@ -1,24 +1,53 @@ +#include + #include "config.h" -#include "core.h" + #include "osdep/io.h" #include "osdep/terminal.h" +#include "core.h" + int wmain(int argc, wchar_t *argv[]); // mpv does its own wildcard expansion in the option parser int _dowildcard = 0; +static bool is_valid_handle(HANDLE h) +{ + return h != INVALID_HANDLE_VALUE && h != NULL; +} + +static bool has_redirected_stdio(void) +{ + return is_valid_handle(GetStdHandle(STD_INPUT_HANDLE)) || + is_valid_handle(GetStdHandle(STD_OUTPUT_HANDLE)) || + is_valid_handle(GetStdHandle(STD_ERROR_HANDLE)); +} + int wmain(int argc, wchar_t *argv[]) { // If started from the console wrapper (see osdep/win32-console-wrapper.c), // attach to the console and set up the standard IO handles - terminal_try_attach(); + bool has_console = terminal_try_attach(); + + // If mpv is started from Explorer, the Run dialog or the Start Menu, it + // will have no console and no standard IO handles. In this case, the user + // is expecting mpv to show some UI, so enable the pseudo-GUI profile. + bool gui = !has_console && !has_redirected_stdio(); + + int argv_len = 0; + char **argv_u8 = NULL; - char **argv_u8 = talloc_zero_array(NULL, char*, argc + 1); - for (int i = 0; i < argc; i++) - argv_u8[i] = mp_to_utf8(argv_u8, argv[i]); + // Build mpv's UTF-8 argv, and add the pseudo-GUI profile if necessary + if (argv[0]) + MP_TARRAY_APPEND(NULL, argv_u8, argv_len, mp_to_utf8(argv_u8, argv[0])); + if (gui) + MP_TARRAY_APPEND(NULL, argv_u8, argv_len, "--profile=pseudo-gui"); + for (int i = 1; i < argc; i++) + MP_TARRAY_APPEND(NULL, argv_u8, argv_len, mp_to_utf8(argv_u8, argv[i])); + MP_TARRAY_APPEND(NULL, argv_u8, argv_len, NULL); - int ret = mpv_main(argc, argv_u8); + int ret = mpv_main(argv_len - 1, argv_u8); talloc_free(argv_u8); return ret; -- cgit v1.2.3