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.
This commit is contained in:
James Ross-Gowan 2015-03-30 02:34:58 +11:00
parent 527911d2a2
commit 1e3aad5f87
1 changed files with 35 additions and 6 deletions

View File

@ -1,24 +1,53 @@
#include <windows.h>
#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();
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]);
// 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 ret = mpv_main(argc, argv_u8);
int argv_len = 0;
char **argv_u8 = NULL;
// 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(argv_len - 1, argv_u8);
talloc_free(argv_u8);
return ret;