Browse Source

support wx main loop in p3d system too

David Rose 14 years ago
parent
commit
279b3a8aeb
2 changed files with 24 additions and 5 deletions
  1. 21 0
      direct/src/showbase/ShowBase.py
  2. 3 5
      panda/src/event/asyncTaskChain.cxx

+ 21 - 0
direct/src/showbase/ShowBase.py

@@ -2717,6 +2717,11 @@ class ShowBase(DirectObject.DirectObject):
                 self.spawnWxLoop()
 
     def spawnWxLoop(self):
+        """ Call this method to hand the main loop over to wxPython.
+        This sets up a wxTimer callback so that Panda still gets
+        updated, but wxPython owns the main loop (which seems to make
+        it happier than the other way around). """
+        
         if self.wxApp:
             # Don't do this twice.
             return
@@ -2734,11 +2739,27 @@ class ShowBase(DirectObject.DirectObject):
         self.run = self.wxRun
         self.taskMgr.run = self.wxRun
         __builtin__.run = self.wxRun
+        if self.appRunner:
+            self.appRunner.run = self.wxRun
 
     def __wxTimerCallback(self, event):
+        if Thread.getCurrentThread().getCurrentTask():
+            # This happens when the wxTimer expires while igLoop is
+            # rendering.  Ignore it.
+            return
+        
         self.taskMgr.step()
 
     def wxRun(self):
+        """ This method replaces base.run() after we have called
+        spawnWxLoop().  Since at this point wxPython now owns the main
+        loop, this method is a call to wxApp.MainLoop(). """
+        
+        if Thread.getCurrentThread().getCurrentTask():
+            # This happens in the p3d environment during startup.
+            # Ignore it.
+            return
+        
         self.wxApp.MainLoop()
 
     def startTk(self, fWantTk = True):

+ 3 - 5
panda/src/event/asyncTaskChain.cxx

@@ -1269,11 +1269,9 @@ do_poll() {
   }
 
   if (_num_busy_threads != 0) {
-    // We are recursively nested within another task.  Return quietly.
-    if (task_cat.is_debug()) {
-      task_cat.debug()
-        << "Ignoring recursive poll() within another task.\n";
-    }
+    // We are recursively nested within another task.  Return, with a warning.
+    task_cat.warning()
+      << "Ignoring recursive poll() within another task.\n";
     return;
   }