[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23737] trunk/blender/intern/ghost/intern: Cocoa port :

Damien Plisson damien.plisson at yahoo.fr
Fri Oct 9 14:48:28 CEST 2009


Revision: 23737
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23737
Author:   damien78
Date:     2009-10-09 14:48:28 +0200 (Fri, 09 Oct 2009)

Log Message:
-----------
Cocoa port :
- Fullscreen mode is back!
- Cleaner fix for tablet events handling

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.h
    trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm
    trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.h
    trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.mm

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.h	2009-10-09 12:47:25 UTC (rev 23736)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.h	2009-10-09 12:48:28 UTC (rev 23737)
@@ -210,9 +210,10 @@
     /**
      * Handles a tablet event.
      * @param eventPtr	An NSEvent pointer (casted to void* to enable compilation in standard C++)
+	 * @param eventType The type of the event. It needs to be passed separately as it can be either directly in the event type, or as a subtype if combined with a mouse button event
      * @return Indication whether the event was handled. 
      */
-    GHOST_TSuccess handleTabletEvent(void *eventPtr);
+    GHOST_TSuccess handleTabletEvent(void *eventPtr, short eventType);
     
 	/**
      * Handles a mouse event.

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm	2009-10-09 12:47:25 UTC (rev 23736)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm	2009-10-09 12:48:28 UTC (rev 23737)
@@ -51,44 +51,7 @@
 
 #pragma mark KeyMap, mouse converters
 
-//TODO: remove (kept as reminder to implement window events)
-/*
-const EventTypeSpec	kEvents[] =
-{
-	{ kEventClassAppleEvent, kEventAppleEvent },
 
-//	{ kEventClassApplication, kEventAppActivated },
-//	{ kEventClassApplication, kEventAppDeactivated },
-	
-	{ kEventClassKeyboard, kEventRawKeyDown },
-	{ kEventClassKeyboard, kEventRawKeyRepeat },
-	{ kEventClassKeyboard, kEventRawKeyUp },
-	{ kEventClassKeyboard, kEventRawKeyModifiersChanged },
-	
-	{ kEventClassMouse, kEventMouseDown },
-	{ kEventClassMouse, kEventMouseUp },
-	{ kEventClassMouse, kEventMouseMoved },
-	{ kEventClassMouse, kEventMouseDragged },
-	{ kEventClassMouse, kEventMouseWheelMoved },
-	
-	{ kEventClassWindow, kEventWindowClickZoomRgn } ,  // for new zoom behaviour  
-	{ kEventClassWindow, kEventWindowZoom },  // for new zoom behaviour  
-	{ kEventClassWindow, kEventWindowExpand } ,  // for new zoom behaviour 
-	{ kEventClassWindow, kEventWindowExpandAll },  // for new zoom behaviour 
-
-	{ kEventClassWindow, kEventWindowClose },
-	{ kEventClassWindow, kEventWindowActivated },
-	{ kEventClassWindow, kEventWindowDeactivated },
-	{ kEventClassWindow, kEventWindowUpdate },
-	{ kEventClassWindow, kEventWindowBoundsChanged },
-	
-	{ kEventClassBlender, kEventBlenderNdofAxis },
-	{ kEventClassBlender, kEventBlenderNdofButtons }
-	
-	
-	
-};*/
-
 /* Keycodes from Carbon include file */
 /*  
  *  Summary:
@@ -701,25 +664,6 @@
 		}
 				
 		[pool drain];
-		
-		/*
-         * Initialize the cursor to the standard arrow shape (so that we can change it later on).
-         * This initializes the cursor's visibility counter to 0.
-         */
-        /*::InitCursor();
-		
-		MenuRef windMenu;
-		::CreateStandardWindowMenu(0, &windMenu);
-		::InsertMenu(windMenu, 0);
-		::DrawMenuBar();
-		
-        ::InstallApplicationEventHandler(sEventHandlerProc, GetEventTypeCount(kEvents), kEvents, this, &m_handler);
-		
-		::AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, sAEHandlerLaunch, (SInt32) this, false);
-		::AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, sAEHandlerOpenDocs, (SInt32) this, false);
-		::AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, sAEHandlerPrintDocs, (SInt32) this, false);
-		::AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, sAEHandlerQuit, (SInt32) this, false);
-		*/
     }
     return success;
 }
@@ -789,6 +733,13 @@
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 	GHOST_IWindow* window = 0;
 	
+	//First check if we are in fullscreen mode
+	//If so, exit it before creating a new window
+	window = m_windowManager->getActiveWindow();
+	if (window && (window->getState() == GHOST_kWindowStateFullScreen))
+		window->setState(GHOST_kWindowStateNormal);
+	window = NULL;
+	
 	//Get the available rect for including window contents
 	NSRect frame = [[NSScreen mainScreen] visibleFrame];
 	NSRect contentRect = [NSWindow contentRectForFrameRect:frame
@@ -826,27 +777,18 @@
 
 GHOST_TSuccess GHOST_SystemCocoa::beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow** window, const bool stereoVisual)
 {	
-	GHOST_TSuccess success = GHOST_kFailure;
+	GHOST_IWindow* currentWindow = m_windowManager->getActiveWindow();
 
-	//TODO: update this method
-	// need yo make this Carbon all on 10.5 for fullscreen to work correctly
-	CGCaptureAllDisplays();
+	*window = currentWindow;
 	
-	success = GHOST_System::beginFullScreen( setting, window, stereoVisual);
-	
-	if( success != GHOST_kSuccess ) {
-			// fullscreen failed for other reasons, release
-			CGReleaseAllDisplays();	
-	}
-
-	return success;
+	return currentWindow->setState(GHOST_kWindowStateFullScreen);
 }
 
 GHOST_TSuccess GHOST_SystemCocoa::endFullScreen(void)
 {	
-	//TODO: update this method
-	CGReleaseAllDisplays();
-	return GHOST_System::endFullScreen();
+	GHOST_IWindow* currentWindow = m_windowManager->getActiveWindow();
+	
+	return currentWindow->setState(GHOST_kWindowStateNormal);
 }
 
 
@@ -936,8 +878,7 @@
 		 anyProcessed = true;
 		 }
 		 
-		 //TODO: check fullscreen redrawing issues
-		 if (getFullScreen()) {
+			 if (getFullScreen()) {
 		 // Check if the full-screen window is dirty
 		 GHOST_IWindow* window = m_windowManager->getFullScreenWindow();
 		 if (((GHOST_WindowCarbon*)window)->getFullScreenDirty()) {
@@ -987,7 +928,7 @@
 					
 				case NSTabletPoint:
 				case NSTabletProximity:
-					handleTabletEvent(event);
+					handleTabletEvent(event,[event type]);
 					break;
 					
 					/* Trackpad features, will need OS X 10.6 for implementation
@@ -1028,8 +969,6 @@
 	if (!validWindow(window)) {
 		return GHOST_kFailure;
 	}
-
-	//if (!getFullScreen()) {
 		switch(eventType) 
 		{
 			case GHOST_kEventWindowClose:
@@ -1045,7 +984,6 @@
 				pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowDeactivate, window) );
 				break;
 			case GHOST_kEventWindowUpdate:
-				//if (getFullScreen()) GHOST_PRINT("GHOST_SystemCarbon::handleWindowEvent(): full-screen update event\n");
 				pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window) );
 				break;
 			case GHOST_kEventWindowSize:
@@ -1059,12 +997,6 @@
 				return GHOST_kFailure;
 				break;
 		}
-//	}
-	//else {
-		//window = (GHOST_WindowCarbon*) m_windowManager->getFullScreenWindow();
-		//GHOST_PRINT("GHOST_SystemCarbon::handleWindowEvent(): full-screen window event, " << window << "\n");
-		//::RemoveEventFromQueue(::GetMainEventQueue(), event);
-	//}
 	return GHOST_kSuccess;
 }
 
@@ -1073,6 +1005,13 @@
 	//Check open windows if some changes are not saved
 	if (m_windowManager->getAnyModifiedState())
 	{
+		//First check if we are in fullscreen mode
+		//If so, exit it before creating a new window
+		GHOST_IWindow *window = m_windowManager->getActiveWindow();
+		if (window && (window->getState() == GHOST_kWindowStateFullScreen))
+			window->setState(GHOST_kWindowStateNormal);
+		window = NULL;		
+		
 		int shouldQuit = NSRunAlertPanel(@"Exit Blender", @"Some changes have not been saved. Do you really want to quit ?",
 										 @"Cancel", @"Quit anyway", nil);
 		if (shouldQuit == NSAlertAlternateReturn)
@@ -1090,35 +1029,13 @@
 }
 
 
-GHOST_TSuccess GHOST_SystemCocoa::handleTabletEvent(void *eventPtr)
+GHOST_TSuccess GHOST_SystemCocoa::handleTabletEvent(void *eventPtr, short eventType)
 {
 	NSEvent *event = (NSEvent *)eventPtr;
 	GHOST_IWindow* window = m_windowManager->getActiveWindow();
 	GHOST_TabletData& ct=((GHOST_WindowCocoa*)window)->GetCocoaTabletData();
-	NSUInteger tabletEvent;
 	
-	//Handle tablet events combined with mouse events
-	@try {
-		switch ([event subtype]) {
-		case NX_SUBTYPE_TABLET_POINT:
-			tabletEvent = NSTabletPoint;
-			break;
-		case NX_SUBTYPE_TABLET_PROXIMITY:
-			tabletEvent = NSTabletProximity;
-			break;
-
-		default:
-			tabletEvent = [event type];
-			break;
-		}
-	}
-	@catch (NSException * e) {
-		//FIXME: check why we get such exceptions when using a tablet
-		return GHOST_kFailure;
-	}
-	
-	
-	switch (tabletEvent) {
+	switch (eventType) {
 		case NSTabletPoint:
 			ct.Pressure = [event tangentialPressure];
 			ct.Xtilt = [event tilt].x;
@@ -1175,20 +1092,53 @@
 		case NSRightMouseDown:
 		case NSOtherMouseDown:
 			pushEvent(new GHOST_EventButton([event timestamp], GHOST_kEventButtonDown, window, convertButton([event buttonNumber])));
-			handleTabletEvent(eventPtr);
+			//Handle tablet events combined with mouse events
+			switch ([event subtype]) {
+				case NX_SUBTYPE_TABLET_POINT:
+					handleTabletEvent(eventPtr, NSTabletPoint);
+					break;
+				case NX_SUBTYPE_TABLET_PROXIMITY:
+					handleTabletEvent(eventPtr, NSTabletProximity);
+					break;
+				default:
+					//No tablet event included : do nothing
+					break;
+			}
 			break;
 						
 		case NSLeftMouseUp:
 		case NSRightMouseUp:
 		case NSOtherMouseUp:
 			pushEvent(new GHOST_EventButton([event timestamp], GHOST_kEventButtonUp, window, convertButton([event buttonNumber])));
-			handleTabletEvent(eventPtr);
+			//Handle tablet events combined with mouse events
+			switch ([event subtype]) {
+				case NX_SUBTYPE_TABLET_POINT:
+					handleTabletEvent(eventPtr, NSTabletPoint);
+					break;
+				case NX_SUBTYPE_TABLET_PROXIMITY:
+					handleTabletEvent(eventPtr, NSTabletProximity);
+					break;
+				default:
+					//No tablet event included : do nothing
+					break;
+			}
 			break;
 			
 		case NSLeftMouseDragged:
 		case NSRightMouseDragged:
 		case NSOtherMouseDragged:				
-			handleTabletEvent(eventPtr);
+			//Handle tablet events combined with mouse events
+			switch ([event subtype]) {
+				case NX_SUBTYPE_TABLET_POINT:
+					handleTabletEvent(eventPtr, NSTabletPoint);
+					break;
+				case NX_SUBTYPE_TABLET_PROXIMITY:
+					handleTabletEvent(eventPtr, NSTabletProximity);
+					break;
+				default:
+					//No tablet event included : do nothing
+					break;
+			}
 		case NSMouseMoved:
 			{
 				NSPoint mousePos = [event locationInWindow];
@@ -1227,6 +1177,7 @@
 	 * the window go away and we still get an HKey up. 
 	 */
 	if (!window) {
+		printf("\nW failure");
 		return GHOST_kFailure;
 	}
 	
@@ -1246,7 +1197,7 @@
 			
 			if ((keyCode == GHOST_kKeyQ) && (m_modifierMask & NSCommandKeyMask))
 				break; //Cmd-Q is directly handled by Cocoa
-			
+
 			if ([event type] == NSKeyDown) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list