Browse Source

*** empty log message ***

gephilipp 18 years ago
parent
commit
cc5b1125fc
1 changed files with 129 additions and 121 deletions
  1. 129 121
      panda/src/osxdisplay/osxGraphicsWindow.mm

+ 129 - 121
panda/src/osxdisplay/osxGraphicsWindow.mm

@@ -44,14 +44,10 @@ osxGraphicsWindow  * osxGraphicsWindow::FullScreenWindow = NULL;
 //  Description: How to find the active window for events  on osx..
 //
 ////////////////////////////////////////////////////////////////////
-osxGraphicsWindow * osxGraphicsWindow::GetCurrentOSxWindow (WindowRef window)
+osxGraphicsWindow* osxGraphicsWindow::GetCurrentOSxWindow(WindowRef window)
 {
 	if(FullScreenWindow != NULL)
-	{
-//	 cerr << " Full Screen \n";
 	   return FullScreenWindow;
-   }
-//	 cerr << "Not Full Screen \n";
 
 	if (NULL == window)  // HID use this path
 	{
@@ -63,7 +59,7 @@ osxGraphicsWindow * osxGraphicsWindow::GetCurrentOSxWindow (WindowRef window)
 	}
 		
 	if (window)
-		return (osxGraphicsWindow *) GetWRefCon (window);
+		return (osxGraphicsWindow *)GetWRefCon (window);
 	else
 		return NULL;
 }
@@ -74,7 +70,7 @@ osxGraphicsWindow * osxGraphicsWindow::GetCurrentOSxWindow (WindowRef window)
 //  Description: Helper function for AGL error message and Grabing error code if any
 //
 ////////////////////////////////////////////////////////////////////
-OSStatus aglReportError ( const std::string  &comment)
+OSStatus aglReportError(const std::string &comment)
 {
 	GLenum err = aglGetError();
 	if (err != AGL_NO_ERROR ) 
@@ -83,8 +79,9 @@ OSStatus aglReportError ( const std::string  &comment)
 	if (err == AGL_NO_ERROR)
 		return noErr;
 	else
-		return (OSStatus) err;
+		return (OSStatus)err;
 }
+
 ////////////////////////////////////////////////////////////////////
 //     Function: InvertGLImage
 //       Access: file scopre, static
@@ -95,14 +92,17 @@ static void InvertGLImage( char *imageData, size_t imageSize, size_t rowBytes )
 {
 	size_t i, j;
 	char *tBuffer = (char*) malloc (rowBytes);
-	if (NULL == tBuffer) return;
+	if (NULL == tBuffer)
+		return;
 		
 	// Copy by rows through temp buffer
-	for (i = 0, j = imageSize - rowBytes; i < imageSize >> 1; i += rowBytes, j -= rowBytes) {
+	for (i = 0, j = imageSize - rowBytes; i < imageSize >> 1; i += rowBytes, j -= rowBytes)
+	{
 		memcpy( tBuffer, &imageData[i], rowBytes );
 		memcpy( &imageData[i], &imageData[j], rowBytes );
 		memcpy( &imageData[j], tBuffer, rowBytes );
 	}
+
 	free(tBuffer);
 }
 
@@ -114,23 +114,26 @@ static void InvertGLImage( char *imageData, size_t imageSize, size_t rowBytes )
 ////////////////////////////////////////////////////////////////////
 static void CompositeGLBufferIntoWindow (AGLContext ctx, Rect *bufferRect, GrafPtr out_port)
 {
-	GWorldPtr pGWorld;
-	QDErr err;
+	GWorldPtr	pGWorld;
+	QDErr		err;
+	
 	// blit OpenGL content into window backing store
 	// allocate buffer to hold pane image
 	long width  = (bufferRect->right - bufferRect->left);
 	long height  = (bufferRect->bottom - bufferRect->top);
 	
-	
 	Rect src_rect = {0, 0, height, width};
 	Rect ddrc_rect = {0, 0, height, width};
 	long rowBytes = width * 4;
 	long imageSize = rowBytes * height;
 	char *image = (char *) NewPtr (imageSize);
-	if (!image) {
+
+	if (!image)
+	{
 		osxdisplay_cat.error() << "Out of memory in CompositeGLBufferIntoWindow()!\n";
 		return;		// no harm in continuing
 	}
+	
 	// pull GL content down to our image buffer
 	aglSetCurrentContext( ctx );
 	glReadPixels (0, 0, width, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image);
@@ -140,13 +143,14 @@ static void CompositeGLBufferIntoWindow (AGLContext ctx, Rect *bufferRect, GrafP
 
 	// create a GWorld containing our image
 	err = NewGWorldFromPtr (&pGWorld, k32ARGBPixelFormat, &src_rect, 0, 0, 0, image, rowBytes);
-	if (err != noErr) {
+	if (err != noErr)
+	{
 		osxdisplay_cat.error() << " error in NewGWorldFromPtr, called from CompositeGLBufferIntoWindow()\n";
-		free( image );
+		free(image);
 		return;
 	}
 
-	GrafPtr portSave 	= NULL;
+	GrafPtr portSave 	=	NULL;
 	Boolean	portChanged	=	QDSwapPort(out_port, &portSave);
 
 	CopyBits( GetPortBitMapForCopyBits (pGWorld), GetPortBitMapForCopyBits (out_port), &src_rect, &ddrc_rect, srcCopy, 0 );
@@ -166,74 +170,73 @@ static void CompositeGLBufferIntoWindow (AGLContext ctx, Rect *bufferRect, GrafP
 ////////////////////////////////////////////////////////////////////
 OSStatus osxGraphicsWindow::event_handler(EventHandlerCallRef myHandler, EventRef event)
 {
-  OSStatus result = eventNotHandledErr;
-  UInt32 the_class = GetEventClass(event);
-  UInt32 kind = GetEventKind(event);
+	OSStatus result = eventNotHandledErr;
+	UInt32 the_class = GetEventClass(event);
+	UInt32 kind = GetEventKind(event);
 
-  WindowRef window = NULL;		
-  GetEventParameter(event, kEventParamDirectObject, typeWindowRef, NULL, sizeof(WindowRef), NULL, &window);
+	WindowRef window = NULL;		
+	GetEventParameter(event, kEventParamDirectObject, typeWindowRef, NULL, sizeof(WindowRef), NULL, &window);
 
-  if (osxdisplay_cat.is_spam()) {
-    osxdisplay_cat.spam()
-      << ClockObject::get_global_clock()->get_real_time() 
-      << " event_handler: " << (void *)this << ", " << window << ", "
-      << the_class << ", " << kind << "\n";
-  }
+	if (osxdisplay_cat.is_spam())
+	{
+		osxdisplay_cat.spam() << ClockObject::get_global_clock()->get_real_time() << " event_handler: " << (void *)this << ", " << window << ", " << the_class << ", " << kind << "\n";
+	}
 
-  switch (the_class) {
-  case kEventClassMouse:
-    result  = handleWindowMouseEvents (myHandler, event);
-    break;
-	
-  case kEventClassWindow:	
-    switch (kind) {
-    case kEventWindowCollapsing:
-      /*
-      Rect r;
-      GetWindowPortBounds (window, &r);					
-      CompositeGLBufferIntoWindow( get_context(), &r, GetWindowPort (window));
-      UpdateCollapsedWindowDockTile (window);
-      */
-      SystemSetWindowForground(false);
-      break;
-    case kEventWindowActivated: // called on click activation and initially
-      SystemSetWindowForground(true);
-      DoResize();
-      break;
-    case kEventWindowDeactivated:
-      SystemSetWindowForground(false);
-      break;
-    case kEventWindowClose: // called when window is being closed (close box)
-      // This is a message from the window manager indicating that
-      // the user has requested to close the window.
-      user_close_request();
-      result = noErr;
-      break;
-    case kEventWindowShown: // called on initial show (not on un-minimize)
-      if (window == FrontWindow ())
-        SetUserFocusWindow (window);
-      break;
-    case kEventWindowBoundsChanged: // called for resize and moves (drag)
-      DoResize();
-      break;
-    case kEventWindowZoomed:
-      break;
-    case kEventWindowCollapsed:
-      {
-        WindowProperties properties;
-        properties.set_minimized(true);
-        system_changed_properties(properties);
-      }
-      break;
-    case kEventWindowExpanded:
-      {
-        WindowProperties properties;
-        properties.set_minimized(false);
-        system_changed_properties(properties);
-      }
-      break;
-    }
-    break;
+  switch (the_class)
+  {
+	  case kEventClassMouse:
+		result  = handleWindowMouseEvents (myHandler, event);
+		break;
+		
+	  case kEventClassWindow:	
+		switch (kind) {
+		case kEventWindowCollapsing:
+		  /*
+		  Rect r;
+		  GetWindowPortBounds (window, &r);					
+		  CompositeGLBufferIntoWindow( get_context(), &r, GetWindowPort (window));
+		  UpdateCollapsedWindowDockTile (window);
+		  */
+		  SystemSetWindowForground(false);
+		  break;
+		case kEventWindowActivated: // called on click activation and initially
+		  SystemSetWindowForground(true);
+		  DoResize();
+		  break;
+		case kEventWindowDeactivated:
+		  SystemSetWindowForground(false);
+		  break;
+		case kEventWindowClose: // called when window is being closed (close box)
+		  // This is a message from the window manager indicating that
+		  // the user has requested to close the window.
+		  user_close_request();
+		  result = noErr;
+		  break;
+		case kEventWindowShown: // called on initial show (not on un-minimize)
+		  if (window == FrontNonFloatingWindow ())
+			SetUserFocusWindow (window);
+		  break;
+		case kEventWindowBoundsChanged: // called for resize and moves (drag)
+		  DoResize();
+		  break;
+		case kEventWindowZoomed:
+		  break;
+		case kEventWindowCollapsed:
+		  {
+			WindowProperties properties;
+			properties.set_minimized(true);
+			system_changed_properties(properties);
+		  }
+		  break;
+		case kEventWindowExpanded:
+		  {
+			WindowProperties properties;
+			properties.set_minimized(false);
+			system_changed_properties(properties);
+		  }
+		  break;
+		}
+		break;
   }
 
   return result;
@@ -249,14 +252,14 @@ OSStatus osxGraphicsWindow::event_handler(EventHandlerCallRef myHandler, EventRe
 void osxGraphicsWindow::user_close_request()
 {
   string close_request_event = get_close_request_event();
-  if (!close_request_event.empty()) {
-    // In this case, the app has indicated a desire to intercept
-    // the request and process it directly.
+  if (!close_request_event.empty())
+  {
+    // In this case, the app has indicated a desire to intercept the request and process it directly.
     throw_event(close_request_event);
-    
-  } else {
-    // In this case, the default case, the app does not intend
-    // to service the request, so we do by closing the window.
+  }    
+  else
+  {
+    // In this case, the default case, the app does not intend to service the request, so we do by closing the window.
     close_window();
   }
 }
@@ -269,8 +272,8 @@ void osxGraphicsWindow::user_close_request()
 ////////////////////////////////////////////////////////////////////
 void osxGraphicsWindow::SystemCloseWindow()
 {	
- if (osxdisplay_cat.is_debug())	
-	osxdisplay_cat.debug() << "System Closing Window \n";
+	if (osxdisplay_cat.is_debug())	
+		osxdisplay_cat.debug() << "System Closing Window \n";
 	ReleaseSystemResources();	
 };
 
@@ -283,18 +286,19 @@ void osxGraphicsWindow::SystemCloseWindow()
 //  handle system window events..
 //        
 ////////////////////////////////////////////////////////////////////
-static pascal OSStatus 
-windowEvtHndlr(EventHandlerCallRef myHandler, EventRef event, void *userData) {
+
+static pascal OSStatus	windowEvtHndlr(EventHandlerCallRef myHandler, EventRef event, void *userData)
+{
 #pragma unused (userData)
  
   WindowRef window = NULL;		
   GetEventParameter(event, kEventParamDirectObject, typeWindowRef, NULL, sizeof(WindowRef), NULL, &window);
 
-  if (window != NULL) {
+  if (window != NULL)
+  {
     osxGraphicsWindow *osx_win = osxGraphicsWindow::GetCurrentOSxWindow(window);
-    if (osx_win != (osxGraphicsWindow *)NULL) {
-      return osx_win->event_handler(myHandler, event);
-    }
+    if (osx_win != (osxGraphicsWindow *)NULL)
+      return osx_win->event_handler(myHandler, event);    }
   }
 
   return eventNotHandledErr;
@@ -308,9 +312,11 @@ windowEvtHndlr(EventHandlerCallRef myHandler, EventRef event, void *userData) {
 //   We only hook this up for none fullscreen window... so we only handle system window events..
 //        
 ////////////////////////////////////////////////////////////////////
+
 void     osxGraphicsWindow::DoResize(void)
 {
 	osxdisplay_cat.debug() << "In Resize Out....." << _properties << "\n";
+
     // only in window mode .. not full screen
     if(_osx_window != NULL && _is_fullscreen == false && _properties.has_size())
     {
@@ -345,28 +351,26 @@ void     osxGraphicsWindow::DoResize(void)
 //    Hooked  once for application
 //        
 ////////////////////////////////////////////////////////////////////
+
 static pascal OSStatus appEvtHndlr (EventHandlerCallRef myHandler, EventRef event, void* userData)
 {
 #pragma unused (myHandler)
 
-//	cerr << " In appEvtHandler \n";
-
     OSStatus result = eventNotHandledErr;
     osxGraphicsWindow *osx_win = NULL;
     WindowRef window = NULL;	
     UInt32 the_class = GetEventClass (event);
     UInt32 kind = GetEventKind (event);
 
-	GetEventParameter(event, kEventParamWindowRef,
-                        typeWindowRef, NULL, sizeof(WindowRef),
-                        NULL, (void*) &window);
+	GetEventParameter(event, kEventParamWindowRef, typeWindowRef, NULL, sizeof(WindowRef), NULL, (void*) &window);
 
      osx_win = osxGraphicsWindow::GetCurrentOSxWindow(window);
 
     if(osx_win == NULL)
 	  return eventNotHandledErr;
 	  
-	switch (the_class) {
+	switch (the_class)
+	{
         case kEventClassTextInput:
 			  if(kind == kEventTextInputUnicodeForKeyEvent)
 				osx_win->handleTextInput(myHandler, event);
@@ -1097,13 +1101,13 @@ bool osxGraphicsWindow::OSOpenWindow(WindowProperties &req_properties)
       
 			if(buildGL(false) != noErr)
 			{
-			osxdisplay_cat.error() << " Error In Generate GL \n";
-			  
-			HideWindow (_osx_window);
-			SetWRefCon (_osx_window, (long int) NULL);
-			DisposeWindow(_osx_window);
-			_osx_window = NULL;
-			return false;
+				osxdisplay_cat.error() << " Error In Generate GL \n";
+				  
+				HideWindow (_osx_window);
+				SetWRefCon (_osx_window, (long int) NULL);
+				DisposeWindow(_osx_window);
+				_osx_window = NULL;
+				return false;
 			}
 
 			//
@@ -1162,16 +1166,17 @@ void osxGraphicsWindow::process_events()
     EventTargetRef theTarget;
     theTarget = GetEventDispatcherTarget();
 
+	if (!req_properties.has_parent_window())
+	{
     //    while  (ReceiveNextEvent(0, NULL,kEventDurationForever,true, &theEvent)== noErr)
-    while  (ReceiveNextEvent(0, NULL,kEventDurationNoWait,true, &theEvent)== noErr)
-    {
-//	   static int pass = 0;
-//	    cerr << "--------------------------------------------Dispatch Event " << pass++ << "\n";
-        SendEventToEventTarget (theEvent, theTarget);
-        ReleaseEvent(theEvent);
-//		cerr << "------------------------------------Done Dispatch \n";
-    }
-
+		while  (ReceiveNextEvent(0, NULL,kEventDurationNoWait,true, &theEvent)== noErr)
+		{
+	//	    cerr << "--------------------------------------------Dispatch Event " << pass++ << "\n";
+			SendEventToEventTarget (theEvent, theTarget);
+			ReleaseEvent(theEvent);
+	//		cerr << "------------------------------------Done Dispatch \n";
+		}
+	}
 };
 
 // handle display config changes meaing we need to update the GL context via the resize function and check for windwo dimension changes
@@ -1327,12 +1332,15 @@ void osxGraphicsWindow::SystemPointToLocalPoint(Point &qdGlobalPoint)
             case kEventMouseUp:
               {
                 GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
-                if (_properties.get_mouse_mode() == WindowProperties::M_relative) {
+                if (_properties.get_mouse_mode() == WindowProperties::M_relative)
+                {
                   GetEventParameter(event, kEventParamMouseDelta,typeQDPoint, NULL, sizeof(Point),NULL	, (void*) &qdGlobalPoint);
                   MouseData currMouse = get_pointer(0);
                   qdGlobalPoint.h += currMouse.get_x();
                   qdGlobalPoint.v += currMouse.get_y();
-                } else {
+                }
+                else
+                {
                   GetEventParameter(event, kEventParamMouseLocation,typeQDPoint, NULL, sizeof(Point),NULL	, (void*) &qdGlobalPoint);                    
                   SystemPointToLocalPoint(qdGlobalPoint);
                 }