diff --git a/direct/src/plugin/p3dPythonMain.cxx b/direct/src/plugin/p3dPythonMain.cxx index fd26a17dc0..8231291c96 100644 --- a/direct/src/plugin/p3dPythonMain.cxx +++ b/direct/src/plugin/p3dPythonMain.cxx @@ -16,6 +16,10 @@ #include #include +#include +#include +#include +#include #include // strrchr using namespace std; @@ -24,6 +28,72 @@ using namespace std; extern "C" { void CPSEnableForegroundOperation(ProcessSerialNumber* psn); } #endif +#ifdef _WIN32 +// Windows requires WinMain() for proper access to the console window. +// We'll wrap the main() function with our own startup WinMain(). +#define main local_main +int main(int argc, char *argv[]); + +// Returns a newly-allocated string representing the quoted argument +// beginning at p. Advances p to the first character following the +// close quote. +char * +parse_quoted_arg(char *&p) { + char quote = *p; + ++p; + string result; + + while (*p != '\0' && *p != quote) { + // TODO: handle escape characters? Not sure if we need to. + result += *p; + ++p; + } + if (*p == quote) { + ++p; + } + return strdup(result.c_str()); +} + +// Returns a newly-allocated string representing the unquoted argument +// beginning at p. Advances p to the first whitespace following the +// argument. +char * +parse_unquoted_arg(char *&p) { + string result; + while (*p != '\0' && !isspace(*p)) { + result += *p; + ++p; + } + return strdup(result.c_str()); +} + +WINAPI +WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { + char *command_line = GetCommandLine(); + + vector argv; + + char *p = command_line; + while (*p != '\0') { + if (*p == '"') { + char *arg = parse_quoted_arg(p); + argv.push_back(arg); + } else { + char *arg = parse_unquoted_arg(p); + argv.push_back(arg); + } + + // Skip whitespace. + while (*p != '\0' && isspace(*p)) { + ++p; + } + } + + assert(!argv.empty()); + return main(argv.size(), &argv[0]); +} +#endif // _WIN32 + //////////////////////////////////////////////////////////////////// // Function: main // Description: This is a trivial main() function that invokes diff --git a/direct/src/plugin/p3dSession.cxx b/direct/src/plugin/p3dSession.cxx index 7cf32cc290..6fee40fb26 100644 --- a/direct/src/plugin/p3dSession.cxx +++ b/direct/src/plugin/p3dSession.cxx @@ -1223,8 +1223,9 @@ win_create_process() { startup_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE); startup_info.dwFlags |= STARTF_USESTDHANDLES; - // Make sure the "python" console window is hidden. - startup_info.wShowWindow = SW_HIDE; + // Since p3dpython is now a Windows graphical app, we want its + // window to be shown. + startup_info.wShowWindow = SW_SHOW; startup_info.dwFlags |= STARTF_USESHOWWINDOW; // If _keep_user_env, meaning not to change the current directory,