From e9f577eb9a81cea09209bbf4eb910f89caa63b02 Mon Sep 17 00:00:00 2001 From: Martin Herkt Date: Sat, 28 Dec 2013 04:45:52 +0100 Subject: Windows: use the GUI subsystem, attach to console This is necessary to start mpv without forcing a console window, but also breaks console usability. A workaround is to call mpv from a wrapper process that uses the console subsystem and helps redirecting the standard streams and WriteConsole output to where they belong. --- osdep/io.c | 22 ++++++++++++++++++++++ osdep/io.h | 1 + player/main.c | 1 + waftools/detections/compiler.py | 2 +- 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/osdep/io.c b/osdep/io.c index 2e2603eb7f..b348890533 100644 --- a/osdep/io.c +++ b/osdep/io.c @@ -327,4 +327,26 @@ char *mp_getenv(const char *name) return NULL; } +void mp_attach_console(void) +{ + if (AttachConsole(ATTACH_PARENT_PROCESS)) { + // We have been started by something with a console window. + // Redirect output streams to that console's low-level handles, + // so we can actually use WriteConsole later on. + + int hConHandle; + intptr_t hStdio; + + hStdio = (intptr_t)GetStdHandle(STD_OUTPUT_HANDLE); + hConHandle = _open_osfhandle(hStdio, _O_TEXT); + *stdout = *_fdopen(hConHandle, "w"); + setvbuf(stdout, NULL, _IONBF, 0); + + hStdio = (intptr_t)GetStdHandle(STD_ERROR_HANDLE); + hConHandle = _open_osfhandle(hStdio, _O_TEXT); + *stderr = *_fdopen(hConHandle, "w"); + setvbuf(stderr, NULL, _IONBF, 0); + } +} + #endif // __MINGW32__ diff --git a/osdep/io.h b/osdep/io.h index 9f715d904e..7c20d262b0 100644 --- a/osdep/io.h +++ b/osdep/io.h @@ -77,6 +77,7 @@ struct dirent *mp_readdir(DIR *dir); int mp_closedir(DIR *dir); int mp_mkdir(const char *path, int mode); char *mp_getenv(const char *name); +void mp_attach_console(void); // NOTE: stat is not overridden with mp_stat, because MinGW-w64 defines it as // macro. diff --git a/player/main.c b/player/main.c index 40715d382e..afb3db46ea 100644 --- a/player/main.c +++ b/player/main.c @@ -249,6 +249,7 @@ static void osdep_preinit(int *p_argc, char ***p_argv) talloc_enable_leak_report(); #ifdef __MINGW32__ + mp_attach_console(); mp_get_converted_argv(p_argc, p_argv); #endif diff --git a/waftools/detections/compiler.py b/waftools/detections/compiler.py index ab658b8ce3..a3ad2835d2 100644 --- a/waftools/detections/compiler.py +++ b/waftools/detections/compiler.py @@ -36,7 +36,7 @@ def __add_mingw_flags__(ctx): ctx.env.CFLAGS += ['-DBYTE_ORDER=1234'] ctx.env.CFLAGS += ['-DLITLE_ENDIAN=1234'] ctx.env.CFLAGS += ['-DBIG_ENDIAN=4321'] - ctx.env.LAST_LINKFLAGS += ['-mconsole'] + ctx.env.LAST_LINKFLAGS += ['-mwindows'] def __add_cygwin_flags__(ctx): ctx.env.CFLAGS += ['-mwin32'] -- cgit v1.2.3