summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Ross-Gowan <rossymiles@gmail.com>2015-03-29 22:36:46 +1100
committerJames Ross-Gowan <rossymiles@gmail.com>2015-04-11 14:27:25 +1000
commitac7ecbe30cdec598955471d2ed012f36296b78de (patch)
treecd62299e8df947fa73787a857e5019277ed5d952
parent6f46bafbd06e6a107e55f35860744ed66c1b8426 (diff)
downloadmpv-ac7ecbe30cdec598955471d2ed012f36296b78de.tar.bz2
mpv-ac7ecbe30cdec598955471d2ed012f36296b78de.tar.xz
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.
-rw-r--r--old-makefile2
-rw-r--r--osdep/io.c26
-rw-r--r--osdep/io.h2
-rw-r--r--player/main-fn-unix.c (renamed from player/main_fn.c)0
-rw-r--r--player/main-fn-win.c20
-rw-r--r--player/main.c12
-rw-r--r--waftools/detections/compiler.py4
-rw-r--r--wscript_build.py6
8 files changed, 32 insertions, 40 deletions
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 <fcntl.h>
#include <pthread.h>
-//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 <sys/stat.h>
#include <fcntl.h>
-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.c b/player/main-fn-unix.c
index 23a047b4dc..23a047b4dc 100644
--- a/player/main_fn.c
+++ b/player/main-fn-unix.c
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/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",