From ac7ecbe30cdec598955471d2ed012f36296b78de Mon Sep 17 00:00:00 2001 From: James Ross-Gowan Date: Sun, 29 Mar 2015 22:36:46 +1100 Subject: win32: use a platform-specific unicode entry-point Add a platform-specific entry-point for Windows. This will allow some platform-specific initialization to be added without the need for ugly ifdeffery in main.c. As an immediate advantage, mpv can now use a unicode entry-point and convert the command line arguments to UTF-8 before passing them to mpv_main, so osdep_preinit can be simplified a little bit. --- old-makefile | 2 +- osdep/io.c | 26 -------------------------- osdep/io.h | 2 -- player/main-fn-unix.c | 15 +++++++++++++++ player/main-fn-win.c | 20 ++++++++++++++++++++ player/main.c | 12 ++++-------- player/main_fn.c | 15 --------------- waftools/detections/compiler.py | 4 ++-- wscript_build.py | 6 +++++- 9 files changed, 47 insertions(+), 55 deletions(-) create mode 100644 player/main-fn-unix.c create mode 100644 player/main-fn-win.c delete mode 100644 player/main_fn.c diff --git a/old-makefile b/old-makefile index 25f92cec61..2ec33455d3 100644 --- a/old-makefile +++ b/old-makefile @@ -334,7 +334,7 @@ all: $(ALL_TARGETS) %.o: %.c $(CC) $(DEPFLAGS) $(CFLAGS) -c -o $@ $< -mpv: $(OBJECTS) player/main_fn.o +mpv: $(OBJECTS) player/main-fn-unix.o $(CC) -o $@ $^ $(EXTRALIBS) input/input.c: input/input_conf.h diff --git a/osdep/io.c b/osdep/io.c index e63509a4f8..00cba27017 100644 --- a/osdep/io.c +++ b/osdep/io.c @@ -121,32 +121,6 @@ char *mp_to_utf8(void *talloc_ctx, const wchar_t *s) #include #include -//http://git.libav.org/?p=libav.git;a=blob;f=cmdutils.c;h=ade3f10ce2fc030e32e375a85fbd06c26d43a433#l161 - -static char** win32_argv_utf8; -static int win32_argc; - -void mp_get_converted_argv(int *argc, char ***argv) -{ - if (!win32_argv_utf8) { - win32_argc = 0; - wchar_t **argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc); - if (win32_argc <= 0 || !argv_w) - return; - - win32_argv_utf8 = talloc_zero_array(NULL, char*, win32_argc + 1); - - for (int i = 0; i < win32_argc; i++) { - win32_argv_utf8[i] = mp_to_utf8(NULL, argv_w[i]); - } - - LocalFree(argv_w); - } - - *argc = win32_argc; - *argv = win32_argv_utf8; -} - static void copy_stat(struct mp_stat *dst, struct _stat64 *src) { dst->st_dev = src->st_dev; diff --git a/osdep/io.h b/osdep/io.h index 0348d3d1a3..a116f3e566 100644 --- a/osdep/io.h +++ b/osdep/io.h @@ -65,8 +65,6 @@ char *mp_to_utf8(void *talloc_ctx, const wchar_t *s); #include #include -void mp_get_converted_argv(int *argc, char ***argv); - int mp_printf(const char *format, ...); int mp_fprintf(FILE *stream, const char *format, ...); int mp_open(const char *filename, int oflag, ...); diff --git a/player/main-fn-unix.c b/player/main-fn-unix.c new file mode 100644 index 0000000000..23a047b4dc --- /dev/null +++ b/player/main-fn-unix.c @@ -0,0 +1,15 @@ +#include "config.h" +#include "core.h" + +#if HAVE_COCOA_APPLICATION +#include "osdep/macosx_application.h" +#endif + +int main(int argc, char *argv[]) +{ +#if HAVE_COCOA_APPLICATION + return cocoa_main(mpv_main, argc, argv); +#else + return mpv_main(argc, argv); +#endif +} diff --git a/player/main-fn-win.c b/player/main-fn-win.c new file mode 100644 index 0000000000..125b4116f8 --- /dev/null +++ b/player/main-fn-win.c @@ -0,0 +1,20 @@ +#include "config.h" +#include "core.h" +#include "osdep/io.h" + +int wmain(int argc, wchar_t *argv[]); + +// mpv does its own wildcard expansion in the option parser +int _dowildcard = 0; + +int wmain(int argc, wchar_t *argv[]) +{ + 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]); + + int ret = mpv_main(argc, argv_u8); + + talloc_free(argv_u8); + return ret; +} diff --git a/player/main.c b/player/main.c index c517e871f6..55f5ff623b 100644 --- a/player/main.c +++ b/player/main.c @@ -275,19 +275,15 @@ static bool handle_help_options(struct MPContext *mpctx) return opt_exit; } -static void osdep_preinit(int *p_argc, char ***p_argv) +static void osdep_preinit(int argc, char **argv) { char *enable_talloc = getenv("MPV_LEAK_REPORT"); - if (*p_argc > 1 && (strcmp((*p_argv)[1], "-leak-report") == 0 || - strcmp((*p_argv)[1], "--leak-report") == 0)) + if (argc > 1 && (strcmp(argv[1], "-leak-report") == 0 || + strcmp(argv[1], "--leak-report") == 0)) enable_talloc = "1"; if (enable_talloc && strcmp(enable_talloc, "1") == 0) talloc_enable_leak_report(); -#ifdef __MINGW32__ - mp_get_converted_argv(p_argc, p_argv); -#endif - #ifdef _WIN32 // stop Windows from showing all kinds of annoying error dialogs SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); @@ -514,7 +510,7 @@ int mp_initialize(struct MPContext *mpctx, char **options) int mpv_main(int argc, char *argv[]) { - osdep_preinit(&argc, &argv); + osdep_preinit(argc, argv); struct MPContext *mpctx = mp_create(); struct MPOpts *opts = mpctx->opts; diff --git a/player/main_fn.c b/player/main_fn.c deleted file mode 100644 index 23a047b4dc..0000000000 --- a/player/main_fn.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "config.h" -#include "core.h" - -#if HAVE_COCOA_APPLICATION -#include "osdep/macosx_application.h" -#endif - -int main(int argc, char *argv[]) -{ -#if HAVE_COCOA_APPLICATION - return cocoa_main(mpv_main, argc, argv); -#else - return mpv_main(argc, argv); -#endif -} diff --git a/waftools/detections/compiler.py b/waftools/detections/compiler.py index fa7986683f..7cae75e4dc 100644 --- a/waftools/detections/compiler.py +++ b/waftools/detections/compiler.py @@ -53,8 +53,8 @@ def __add_mswin_flags__(ctx): def __add_mingw_flags__(ctx): __add_mswin_flags__(ctx) - ctx.env.CFLAGS += ['-D__USE_MINGW_ANSI_STDIO=1'] - ctx.env.LAST_LINKFLAGS += ['-mwindows'] + ctx.env.CFLAGS += ['-municode', '-D__USE_MINGW_ANSI_STDIO=1'] + ctx.env.LAST_LINKFLAGS += ['-municode', '-mwindows'] def __add_cygwin_flags__(ctx): __add_mswin_flags__(ctx) diff --git a/wscript_build.py b/wscript_build.py index 20a2633d99..4478725596 100644 --- a/wscript_build.py +++ b/wscript_build.py @@ -71,6 +71,10 @@ def build(ctx): source = "demux/ebml.c", target = "ebml_defs.c") + main_fn_c = { + 'win32': 'player/main-fn-win.c', + }.get(ctx.env.DEST_OS, "player/main-fn-unix.c") + getch2_c = { 'win32': 'osdep/terminal-win.c', }.get(ctx.env.DEST_OS, "osdep/terminal-unix.c") @@ -418,7 +422,7 @@ def build(ctx): if ctx.dependency_satisfied('cplayer'): ctx( target = "mpv", - source = "player/main_fn.c", + source = main_fn_c, use = ctx.dependencies_use() + ['objects'], includes = _all_includes(ctx), features = "c cprogram", -- cgit v1.2.3