char *mp_get_win_config_path(const char *filename) { wchar_t w_appdir[MAX_PATH + 1] = {0}; wchar_t w_exedir[MAX_PATH + 1] = {0}; char *res = NULL; void *tmp = talloc_new(NULL); #ifndef __CYGWIN__ if (SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA|CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, w_appdir) != S_OK) w_appdir[0] = '\0'; #endif get_exe_dir(w_exedir); if (filename && filename[0] && w_exedir[0]) { char *dir = mp_to_utf8(tmp, w_exedir); char *temp = mp_path_join(tmp, bstr0(dir), bstr0("mpv")); res = mp_path_join(NULL, bstr0(temp), bstr0(filename)); if (!mp_path_exists(res) || mp_path_isdir(res)) { talloc_free(res); res = NULL; } } if (!res && w_appdir[0]) { char *dir = mp_to_utf8(tmp, w_appdir); char *temp = mp_path_join(tmp, bstr0(dir), bstr0("mpv")); res = mp_path_join(NULL, bstr0(temp), bstr0(filename)); } talloc_free(tmp); return res; }
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 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; // 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; }
static char *mp_get_win_shell_dir(void *talloc_ctx, int folder) { wchar_t w_appdir[MAX_PATH + 1] = {0}; if (SHGetFolderPathW(NULL, folder|CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, w_appdir) != S_OK) return NULL; return mp_to_utf8(talloc_ctx, w_appdir); }
static char *mp_get_win_app_dir(void *talloc_ctx) { wchar_t w_appdir[MAX_PATH + 1] = {0}; if (SHGetFolderPathW(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, w_appdir) != S_OK) return NULL; return talloc_asprintf(talloc_ctx, "%s/mpv", mp_to_utf8(talloc_ctx, w_appdir)); }
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); }
static char *mp_get_win_exe_dir(void *talloc_ctx) { wchar_t w_exedir[MAX_PATH + 1] = {0}; int len = (int)GetModuleFileNameW(NULL, w_exedir, MAX_PATH); int imax = 0; for (int i = 0; i < len; i++) { if (w_exedir[i] == '\\') { w_exedir[i] = '/'; imax = i; } } w_exedir[imax] = '\0'; return mp_to_utf8(talloc_ctx, w_exedir); }