diff options
Diffstat (limited to 'src/osd/osdcore.cpp')
-rw-r--r-- | src/osd/osdcore.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/osd/osdcore.cpp b/src/osd/osdcore.cpp index 58bb1157674..4da081e2111 100644 --- a/src/osd/osdcore.cpp +++ b/src/osd/osdcore.cpp @@ -8,6 +8,14 @@ #if defined(SDLMAME_ANDROID) #include <SDL2/SDL.h> #endif + +#ifdef _WIN32 +#include <windows.h> +#include <stdio.h> +#include <shellapi.h> +#include "strconv.h" +#endif + static const int MAXSTACK = 10; static osd_output *m_stack[MAXSTACK]; static int m_ptr = -1; @@ -194,3 +202,43 @@ void osd_sleep(osd_ticks_t duration) { std::this_thread::sleep_for(std::chrono::high_resolution_clock::duration(duration)); } + + +//============================================================ +// osd_get_command_line - returns command line arguments +// in an std::vector<std::string> in UTF-8 +// +// The real purpose of this call is to hide details necessary +// on Windows (provided that one wants to avoid using wmain) +//============================================================ + +std::vector<std::string> osd_get_command_line(int argc, char *argv[]) +{ + std::vector<std::string> results; +#ifdef WIN32 + { + // Get the command line from Windows + int count; + LPWSTR *wide_args = CommandLineToArgvW(GetCommandLineW(), &count); + + // Convert the returned command line arguments to UTF8 std::vector<std::string> + results.reserve(count); + for (int i = 0; i < count; i++) + { + std::string arg = osd::text::from_wstring(wide_args[i]); + results.push_back(std::move(arg)); + } + + LocalFree(wide_args); + } +#else // !WIN32 + { + // for non Windows platforms, we are assuming that arguments are + // already UTF-8; we just need to convert to std::vector<std::string> + results.reserve(argc); + for (int i = 0; i < argc; i++) + results.emplace_back(argv[i]); + } +#endif // WIN32 + return results; +} |