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

Damien Plisson damien.plisson at yahoo.fr
Mon Oct 19 12:49:45 CEST 2009


Revision: 23942
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23942
Author:   damien78
Date:     2009-10-19 12:49:45 +0200 (Mon, 19 Oct 2009)

Log Message:
-----------
Cocoa : 
- fix#19592 : implemented updated continuous grab feature (fixing compilation issues)
- fix some 10.6 & 64bit warnings

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.h
    trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm
    trunk/blender/intern/ghost/intern/GHOST_Window.h
    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-19 10:37:50 UTC (rev 23941)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.h	2009-10-19 10:49:45 UTC (rev 23942)
@@ -228,34 +228,7 @@
      * @return Indication whether the event was handled. 
      */
     GHOST_TSuccess handleKeyEvent(void *eventPtr);
-
-    /**
-     * Handles all basic Mac application stuff for a mouse down event.
-     * @param eventPtr	An NSEvent pointer (casted to void* to enable compilation in standard C++)
-     * @return Indication whether the event was handled. 
-     */
-   // bool handleMouseDown(void *eventPtr);
-
-    /**
-     * Handles a Mac menu command.
-     * @param menuResult A Mac menu/item identifier.
-     * @return Indication whether the event was handled. 
-     */
-   // bool handleMenuCommand(GHOST_TInt32 menuResult);
     
-    /* callback for blender generated events */
-//	static OSStatus blendEventHandlerProc(EventHandlerCallRef handler, EventRef event, void* userData);
-
-
-    /**
-     * Callback for Mac Timer tasks that expire.
-     * @param tmTask Pointer to the timer task that expired.
-     */
-    //static void s_timerCallback(TMTaskPtr tmTask);
-    	
-    /** Event handler reference. */
-    //EventHandlerRef m_handler;
-	
 	/** Start time at initialization. */
 	GHOST_TUns64 m_start_time;
 	
@@ -266,7 +239,12 @@
     GHOST_TUns32 m_modifierMask;
 
     /** Ignores window size messages (when window is dragged). */
-    bool m_ignoreWindowSizedMessages;    
+    bool m_ignoreWindowSizedMessages;   
+	
+	/** Stores the mouse cursor delta due to setting a new cursor position
+	 * Needed because cocoa event delta cursor move takes setCursorPosition changes too.
+	 */
+	GHOST_TInt32 m_cursorDelta_x, m_cursorDelta_y;
 };
 
 #endif // _GHOST_SYSTEM_COCOA_H_

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm	2009-10-19 10:37:50 UTC (rev 23941)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm	2009-10-19 10:49:45 UTC (rev 23942)
@@ -565,6 +565,8 @@
 {
 	m_modifierMask =0;
 	m_pressedMouseButtons =0;
+	m_cursorDelta_x=0;
+	m_cursorDelta_y=0;
 	m_displayManager = new GHOST_DisplayManagerCocoa ();
 	GHOST_ASSERT(m_displayManager, "GHOST_SystemCocoa::GHOST_SystemCocoa(): m_displayManager==0\n");
 	m_displayManager->initialize();
@@ -873,15 +875,6 @@
 		 
 		 if (timerMgr->fireTimers(getMilliSeconds())) {
 		 anyProcessed = true;
-		 }
-		 
-			 if (getFullScreen()) {
-		 // Check if the full-screen window is dirty
-		 GHOST_IWindow* window = m_windowManager->getFullScreenWindow();
-		 if (((GHOST_WindowCarbon*)window)->getFullScreenDirty()) {
-		 pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window) );
-		 anyProcessed = true;
-		 }
 		 }*/
 		
 		do {
@@ -999,6 +992,12 @@
 
 GHOST_TUns8 GHOST_SystemCocoa::handleQuitRequest()
 {
+	GHOST_Window* window = (GHOST_Window*)m_windowManager->getActiveWindow();
+	
+	//Discard quit event if we are in cursor grab sequence
+	if ((window->getCursorGrabMode() != GHOST_kGrabDisable) && (window->getCursorGrabMode() != GHOST_kGrabNormal))
+		return GHOST_kExitCancel;
+	
 	//Check open windows if some changes are not saved
 	if (m_windowManager->getAnyModifiedState())
 	{
@@ -1129,27 +1128,78 @@
 					//No tablet event included : do nothing
 					break;
 			}
+			
 		case NSMouseMoved:
-			{
-				if(window->getCursorWarp()) {
-					GHOST_TInt32 x_warp, y_warp, x_accum, y_accum;
-					
-					window->getCursorWarpPos(x_warp, y_warp);
-					
-					window->getCursorWarpAccum(x_accum, y_accum);
-					x_accum += [event deltaX];
-					y_accum += -[event deltaY]; //Strange Apple implementation (inverted coordinates for the deltaY) ...
-					window->setCursorWarpAccum(x_accum, y_accum);
-					
-					pushEvent(new GHOST_EventCursor([event timestamp], GHOST_kEventCursorMove, window, x_warp+x_accum, y_warp+y_accum));
-				} 
-				else { //Normal cursor operation: send mouse position in window
-					NSPoint mousePos = [event locationInWindow];
-					pushEvent(new GHOST_EventCursor([event timestamp], GHOST_kEventCursorMove, window, mousePos.x, mousePos.y));
-					window->setCursorWarpAccum(0, 0); //Mouse motion occured between two cursor warps, so we can reset the delta counter
+				switch (window->getCursorGrabMode()) {
+					case GHOST_kGrabHide: //Cursor hidden grab operation : no cursor move
+					{
+						GHOST_TInt32 x_warp, y_warp, x_accum, y_accum;
+						
+						window->getCursorGrabInitPos(x_warp, y_warp);
+						
+						window->getCursorGrabAccum(x_accum, y_accum);
+						x_accum += [event deltaX];
+						y_accum += -[event deltaY]; //Strange Apple implementation (inverted coordinates for the deltaY) ...
+						window->setCursorGrabAccum(x_accum, y_accum);
+						
+						pushEvent(new GHOST_EventCursor([event timestamp], GHOST_kEventCursorMove, window, x_warp+x_accum, y_warp+y_accum));
+					}
+						break;
+					case GHOST_kGrabWrap: //Wrap cursor at area/window boundaries
+					{
+						NSPoint mousePos = [event locationInWindow];
+						GHOST_TInt32 x_mouse= mousePos.x;
+						GHOST_TInt32 y_mouse= mousePos.y;
+						GHOST_TInt32 x_accum, y_accum, x_cur, y_cur;
+						GHOST_Rect bounds, windowBounds, correctedBounds;
+						
+						/* fallback to window bounds */
+						if(window->getCursorGrabBounds(bounds)==GHOST_kFailure)
+							window->getClientBounds(bounds);
+						
+						//Switch back to Cocoa coordinates orientation (y=0 at botton,the same as blender internal btw!), and to client coordinates
+						window->getClientBounds(windowBounds);
+						bounds.m_b = (windowBounds.m_b - windowBounds.m_t) - bounds.m_b;
+						bounds.m_t = (windowBounds.m_b - windowBounds.m_t) - bounds.m_t;
+						window->screenToClient(bounds.m_l,bounds.m_b, correctedBounds.m_l, correctedBounds.m_t);
+						window->screenToClient(bounds.m_r, bounds.m_t, correctedBounds.m_r, correctedBounds.m_b);
+						
+						//Update accumulation counts
+						window->getCursorGrabAccum(x_accum, y_accum);
+						x_accum += [event deltaX]-m_cursorDelta_x;
+						y_accum += -[event deltaY]-m_cursorDelta_y; //Strange Apple implementation (inverted coordinates for the deltaY) ...
+						window->setCursorGrabAccum(x_accum, y_accum);
+						
+						
+						//Warp mouse cursor if needed
+						x_mouse += [event deltaX]-m_cursorDelta_x;
+						y_mouse += -[event deltaY]-m_cursorDelta_y;
+						correctedBounds.wrapPoint(x_mouse, y_mouse, 2);
+						
+						//Compensate for mouse moved event taking cursor position set into account
+						m_cursorDelta_x = x_mouse-mousePos.x;
+						m_cursorDelta_y = y_mouse-mousePos.y;
+						
+						//Set new cursor position
+						window->clientToScreen(x_mouse, y_mouse, x_cur, y_cur);
+						setCursorPosition(x_cur, y_cur); /* wrap */
+						
+						//Post event
+						window->getCursorGrabInitPos(x_cur, y_cur);
+						pushEvent(new GHOST_EventCursor([event timestamp], GHOST_kEventCursorMove, window, x_cur + x_accum, y_cur + y_accum));
+					}
+						break;
+					default:
+					{
+						//Normal cursor operation: send mouse position in window
+						NSPoint mousePos = [event locationInWindow];
+						pushEvent(new GHOST_EventCursor([event timestamp], GHOST_kEventCursorMove, window, mousePos.x, mousePos.y));
+						m_cursorDelta_x=0;
+						m_cursorDelta_y=0; //Mouse motion occured between two cursor warps, so we can reset the delta counter
+					}
+						break;
 				}
 				break;
-			}
 			
 		case NSScrollWheel:
 			{
@@ -1323,74 +1373,3 @@
 	
 	[pool drain];
 }
-
-#pragma mark Carbon stuff to remove
-
-#ifdef WITH_CARBON
-
-
-OSErr GHOST_SystemCarbon::sAEHandlerLaunch(const AppleEvent *event, AppleEvent *reply, SInt32 refCon)
-{
-	//GHOST_SystemCarbon* sys = (GHOST_SystemCarbon*) refCon;
-	
-	return noErr;
-}
-
-OSErr GHOST_SystemCarbon::sAEHandlerOpenDocs(const AppleEvent *event, AppleEvent *reply, SInt32 refCon)
-{
-	//GHOST_SystemCarbon* sys = (GHOST_SystemCarbon*) refCon;
-	AEDescList docs;
-	SInt32 ndocs;
-	OSErr err;
-	
-	err = AEGetParamDesc(event, keyDirectObject, typeAEList, &docs);
-	if (err != noErr)  return err;
-	
-	err = AECountItems(&docs, &ndocs);
-	if (err==noErr) {
-		int i;
-		
-		for (i=0; i<ndocs; i++) {
-			FSSpec fss;
-			AEKeyword kwd;
-			DescType actType;
-			Size actSize;
-			
-			err = AEGetNthPtr(&docs, i+1, typeFSS, &kwd, &actType, &fss, sizeof(fss), &actSize);
-			if (err!=noErr)
-				break;
-			
-			if (i==0) {
-				FSRef fsref;
-				
-				if (FSpMakeFSRef(&fss, &fsref)!=noErr)
-					break;
-				if (FSRefMakePath(&fsref, (UInt8*) g_firstFileBuf, sizeof(g_firstFileBuf))!=noErr)
-					break;
-				
-				g_hasFirstFile = true;
-			}
-		}
-	}
-	
-	AEDisposeDesc(&docs);
-	
-	return err;
-}
-
-OSErr GHOST_SystemCarbon::sAEHandlerPrintDocs(const AppleEvent *event, AppleEvent *reply, SInt32 refCon)
-{
-	//GHOST_SystemCarbon* sys = (GHOST_SystemCarbon*) refCon;
-	
-	return noErr;
-}
-
-OSErr GHOST_SystemCarbon::sAEHandlerQuit(const AppleEvent *event, AppleEvent *reply, SInt32 refCon)
-{
-	GHOST_SystemCarbon* sys = (GHOST_SystemCarbon*) refCon;
-	
-	sys->pushEvent( new GHOST_Event(sys->getMilliSeconds(), GHOST_kEventQuit, NULL) );
-	
-	return noErr;
-}
-#endif
\ No newline at end of file

Modified: trunk/blender/intern/ghost/intern/GHOST_Window.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_Window.h	2009-10-19 10:37:50 UTC (rev 23941)
+++ trunk/blender/intern/ghost/intern/GHOST_Window.h	2009-10-19 10:49:45 UTC (rev 23942)
@@ -159,6 +159,7 @@
 	 */
 	inline virtual bool getCursorVisibility() const;
 	inline virtual GHOST_TGrabCursorMode getCursorGrabMode() const;
+	inline virtual void getCursorGrabInitPos(GHOST_TInt32 &x, GHOST_TInt32 &y) const;
 	inline virtual void getCursorGrabAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const;
 	inline virtual void setCursorGrabAccum(GHOST_TInt32 x, GHOST_TInt32 y);
 
@@ -327,6 +328,12 @@
 	return m_cursorGrab;
 }
 
+inline void GHOST_Window::getCursorGrabInitPos(GHOST_TInt32 &x, GHOST_TInt32 &y) const
+{
+	x = m_cursorGrabInitPos[0];
+	y = m_cursorGrabInitPos[1];
+}
+
 inline void GHOST_Window::getCursorGrabAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const
 {
 	x= m_cursorGrabAccumPos[0];

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.h

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list