Browse Source

fix onwindowattach/detach for mac

David Rose 16 years ago
parent
commit
db28251d40

+ 7 - 1
panda/src/display/graphicsStateGuardian.cxx

@@ -2385,11 +2385,17 @@ free_pointers() {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void GraphicsStateGuardian::
 void GraphicsStateGuardian::
 close_gsg() {
 close_gsg() {
+  // Protect from multiple calls, and also inform any other functions
+  // not to try to create new stuff while we're going down.
+  if (_closing_gsg) {
+    return;
+  }
+  _closing_gsg = true;
+
   if (display_cat.is_debug()) {
   if (display_cat.is_debug()) {
     display_cat.debug()
     display_cat.debug()
       << this << " close_gsg " << get_type() << "\n";
       << this << " close_gsg " << get_type() << "\n";
   }
   }
-  _closing_gsg = true;
   free_pointers();
   free_pointers();
 
 
   // As tempting as it may be to try to release all the textures and
   // As tempting as it may be to try to release all the textures and

+ 17 - 0
panda/src/display/subprocessWindow.cxx

@@ -345,6 +345,14 @@ internal_close_window() {
     _buffer = NULL;
     _buffer = NULL;
   }
   }
 
 
+  // Tell our parent window (if any) that we're no longer its child.
+  if (_window_handle != (WindowHandle *)NULL &&
+      _parent_window_handle != (WindowHandle *)NULL) {
+    _parent_window_handle->detach_child(_window_handle);
+  }
+
+  _window_handle = NULL;
+  _parent_window_handle = NULL;
   _is_valid = false;
   _is_valid = false;
 }
 }
 
 
@@ -395,6 +403,7 @@ internal_open_window() {
       }
       }
     }
     }
   }
   }
+  _parent_window_handle = window_handle;
 
 
   if (_filename.empty()) {
   if (_filename.empty()) {
     _is_valid = false;
     _is_valid = false;
@@ -422,6 +431,14 @@ internal_open_window() {
       << "SubprocessWindow reading " << _filename << "\n";
       << "SubprocessWindow reading " << _filename << "\n";
   }
   }
 
 
+  // Create a WindowHandle for ourselves
+  _window_handle = NativeWindowHandle::make_subprocess(_filename);
+
+  // And tell our parent window that we're now its child.
+  if (_parent_window_handle != (WindowHandle *)NULL) {
+    _parent_window_handle->attach_child(_window_handle);
+  }
+
   return true;
   return true;
 }
 }
 
 

+ 5 - 9
panda/src/display/subprocessWindowBuffer.cxx

@@ -157,11 +157,7 @@ destroy_buffer(int fd, size_t mmap_size, const string &filename,
   buffer->~SubprocessWindowBuffer();
   buffer->~SubprocessWindowBuffer();
   close_buffer(fd, mmap_size, filename, buffer);
   close_buffer(fd, mmap_size, filename, buffer);
 
 
-  // This isn't really necessary, since our child process should have
-  // unlinked it; but we do it anyway just for good measure (for
-  // instance, in case the child process never got started).  I
-  // suppose there is some risk that we will accidentally delete
-  // someone else's file this way, but the risk is small.
+  // Now we can unlink the file.
   unlink(filename.c_str());
   unlink(filename.c_str());
 }
 }
 
 
@@ -243,7 +239,10 @@ open_buffer(int &fd, size_t &mmap_size, const string &filename) {
 
 
   // Now that we've successfully opened and mapped the file, we can
   // Now that we've successfully opened and mapped the file, we can
   // safely delete it from the file system.
   // safely delete it from the file system.
-  unlink(filename.c_str());
+
+  // Actually, unlinking it now prevents us from detaching and
+  // reattaching to the same file later.  Boo.
+  //  unlink(filename.c_str());
 
 
   SubprocessWindowBuffer *buffer = (SubprocessWindowBuffer *)shared_mem;
   SubprocessWindowBuffer *buffer = (SubprocessWindowBuffer *)shared_mem;
   assert(buffer->_mmap_size == mmap_size);
   assert(buffer->_mmap_size == mmap_size);
@@ -263,9 +262,6 @@ close_buffer(int fd, size_t mmap_size, const string &filename,
              SubprocessWindowBuffer *buffer) {
              SubprocessWindowBuffer *buffer) {
   munmap((void *)buffer, mmap_size);
   munmap((void *)buffer, mmap_size);
   close(fd);
   close(fd);
-
-  // Guess we shouldn't unlink() the file here, since we already did
-  // in open_buffer().
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 1 - 0
panda/src/osxdisplay/osxGraphicsStateGuardian.cxx

@@ -75,6 +75,7 @@ osxGraphicsStateGuardian(GraphicsEngine *engine, GraphicsPipe *pipe,
 osxGraphicsStateGuardian::
 osxGraphicsStateGuardian::
 ~osxGraphicsStateGuardian() {
 ~osxGraphicsStateGuardian() {
   if (_aglcontext != (AGLContext)NULL) {
   if (_aglcontext != (AGLContext)NULL) {
+    aglSetCurrentContext(NULL);
     aglDestroyContext(_aglcontext);
     aglDestroyContext(_aglcontext);
     report_agl_error("aglDestroyContext");
     report_agl_error("aglDestroyContext");
     _aglcontext = (AGLContext)NULL;
     _aglcontext = (AGLContext)NULL;

+ 16 - 13
panda/src/osxdisplay/osxGraphicsWindow.mm

@@ -403,9 +403,16 @@ do_resize() {
         << " " << viewRect.size.height << "\n";
         << " " << viewRect.size.height << "\n";
     }
     }
 
 
-    // ping gl
-    aglUpdateContext(aglGetCurrentContext());
-    report_agl_error("aglUpdateContext .. This is a Resize..");
+    AGLContext context = get_gsg_context();
+    if (context != (AGLContext)NULL) {
+      // ping gl
+      if (!aglSetCurrentContext(context)) {
+        report_agl_error("aglSetCurrentContext");
+      }
+      aglUpdateContext(context);
+      report_agl_error("aglUpdateContext .. This is a Resize..");
+    }
+
     if (osxdisplay_cat.is_debug()) {
     if (osxdisplay_cat.is_debug()) {
       osxdisplay_cat.debug() 
       osxdisplay_cat.debug() 
         << "Resize Complete.....\n";
         << "Resize Complete.....\n";
@@ -849,23 +856,19 @@ begin_frame(FrameMode mode, Thread *current_thread) {
   if (_is_fullscreen) {
   if (_is_fullscreen) {
     aglSetFullScreen(get_gsg_context(),0,0,0,0);
     aglSetFullScreen(get_gsg_context(),0,0,0,0);
     report_agl_error ("aglSetFullScreen"); 
     report_agl_error ("aglSetFullScreen"); 
-    
-    if (!aglSetCurrentContext(get_gsg_context())) {
-      report_agl_error ("aglSetCurrentContext"); 
-    }
-    
+   
   } else {
   } else {
     if (full_screen_window != NULL) {
     if (full_screen_window != NULL) {
       return false;
       return false;
     }
     }
     
     
-    if (!aglSetDrawable (get_gsg_context(), GetWindowPort (_osx_window))) {
+    if (!aglSetDrawable(get_gsg_context(), GetWindowPort (_osx_window))) {
       report_agl_error("aglSetDrawable");
       report_agl_error("aglSetDrawable");
     }
     }
-    
-    if (!aglSetCurrentContext(get_gsg_context())) {
-      report_agl_error ("aglSetCurrentContext");
-    } 
+  }
+
+  if (!aglSetCurrentContext(get_gsg_context())) {
+    report_agl_error ("aglSetCurrentContext"); 
   }
   }
  
  
   _gsg->reset_if_new();
   _gsg->reset_if_new();