David Rose 16 年之前
父节点
当前提交
27f9b545de
共有 2 个文件被更改,包括 73 次插入2 次删除
  1. 70 0
      direct/src/plugin/p3dPythonMain.cxx
  2. 3 2
      direct/src/plugin/p3dSession.cxx

+ 70 - 0
direct/src/plugin/p3dPythonMain.cxx

@@ -16,6 +16,10 @@
 
 #include <iostream>
 #include <sstream>
+#include <string>
+#include <vector>
+#include <assert.h>
+#include <ctype.h>
 #include <string.h>  // 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<char *> 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

+ 3 - 2
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,