[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34450] branches/merwin-tablet-2: WIP toward better cursor-grab implementation on Mac, plus various minor fixes

Mike Erwin significant.bit at gmail.com
Sat Jan 22 07:46:42 CET 2011


Revision: 34450
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34450
Author:   merwin
Date:     2011-01-22 06:46:40 +0000 (Sat, 22 Jan 2011)
Log Message:
-----------
WIP toward better cursor-grab implementation on Mac, plus various minor fixes

Modified Paths:
--------------
    branches/merwin-tablet-2/intern/ghost/GHOST_Rect.h
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_SystemCocoa.h
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_SystemCocoa.mm
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_Window.cpp
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_WindowCocoa.mm
    branches/merwin-tablet-2/source/blender/windowmanager/intern/wm_cursors.c

Modified: branches/merwin-tablet-2/intern/ghost/GHOST_Rect.h
===================================================================
--- branches/merwin-tablet-2/intern/ghost/GHOST_Rect.h	2011-01-22 06:41:34 UTC (rev 34449)
+++ branches/merwin-tablet-2/intern/ghost/GHOST_Rect.h	2011-01-22 06:46:40 UTC (rev 34450)
@@ -66,21 +66,16 @@
 		: m_l(r.m_l), m_t(r.m_t), m_r(r.m_r), m_b(r.m_b) {}
 	
 	/**
-	 * Destructor.
-	 */
-	virtual ~GHOST_Rect() {};
-
-	/**
 	 * Access to rectangle width.
 	 * @return	width of the rectangle
 	 */
-	virtual inline GHOST_TInt32 getWidth() const;
+	inline GHOST_TInt32 getWidth() const;
 
 	/**
 	 * Access to rectangle height.
 	 * @return	height of the rectangle
 	 */
-	virtual inline GHOST_TInt32 getHeight() const;
+	inline GHOST_TInt32 getHeight() const;
 
 	/**
 	 * Sets all members of the rectangle.
@@ -89,49 +84,50 @@
 	 * @param	r	requested right coordinate of the rectangle
 	 * @param	b	requested bottom coordinate of the rectangle
 	 */
-	virtual inline void set(GHOST_TInt32 l, GHOST_TInt32 t, GHOST_TInt32 r, GHOST_TInt32 b);
+	inline void set(GHOST_TInt32 l, GHOST_TInt32 t, GHOST_TInt32 r, GHOST_TInt32 b);
 
 	/**
 	 * Returns whether this rectangle is empty.
 	 * Empty rectangles are rectangles that have width==0 and/or height==0.
 	 * @return	boolean value (true==empty rectangle)
 	 */
-	virtual inline bool isEmpty() const;
+	inline bool isEmpty() const;
 
 	/**
 	 * Returns whether this rectangle is valid.
 	 * Valid rectangles are rectangles that have m_l <= m_r and m_t <= m_b. Thus, emapty rectangles are valid.
 	 * @return	boolean value (true==valid rectangle)
 	 */
-	virtual inline bool isValid() const;
+	inline bool isValid() const;
 
 	/**
 	 * Grows (or shrinks the rectangle).
 	 * The method avoids negative insets making the rectangle invalid
 	 * @param	i	The amount of offset given to each extreme (negative values shrink the rectangle).
 	 */
-	virtual void inset(GHOST_TInt32 i);
+	void inset(GHOST_TInt32 i);
 
 	/**
 	 * Does a union of the rectangle given and this rectangle.
 	 * The result is stored in this rectangle.
 	 * @param	r	The rectangle that is input for the union operation.
 	 */
-	virtual inline void unionRect(const GHOST_Rect& r);
+	inline void unionRect(const GHOST_Rect& r);
 
 	/**
 	 * Grows the rectangle to included a point.
 	 * @param	x	The x-coordinate of the point.
 	 * @param	y	The y-coordinate of the point.
 	 */
-	virtual inline void unionPoint(GHOST_TInt32 x, GHOST_TInt32 y);
+	inline void unionPoint(GHOST_TInt32 x, GHOST_TInt32 y);
 
 	/**
-	 * Grows the rectangle to included a point.
-	 * @param	x	The x-coordinate of the point.
-	 * @param	y	The y-coordinate of the point.
+	 * Wraps x and y to lie inside this rect.
+	 * @param x The x-coordinate of the point.
+	 * @param y The y-coordinate of the point.
+	 * @param ofs The margin of safety; point will stay at least this far from any edge.
 	 */
-	virtual inline void wrapPoint(GHOST_TInt32 &x, GHOST_TInt32 &y, GHOST_TInt32 ofs);
+	inline void wrapPoint(GHOST_TInt32& x, GHOST_TInt32& y, GHOST_TInt32 ofs = 0) const;
 
 	/**
 	 * Returns whether the point is inside this rectangle.
@@ -140,14 +136,14 @@
 	 * @param y y-coordinate of point to test.
 	 * @return boolean value (true if point is inside).
 	 */
-	virtual inline bool isInside(GHOST_TInt32 x, GHOST_TInt32 y) const;
+	inline bool isInside(GHOST_TInt32 x, GHOST_TInt32 y) const;
 
 	/**
 	 * Returns whether the rectangle is inside this rectangle.
 	 * @param	r	rectangle to test.
 	 * @return	visibility (not, partially or fully visible).
 	 */
-	virtual GHOST_TVisibility getVisibility(GHOST_Rect& r) const;
+	GHOST_TVisibility getVisibility(GHOST_Rect& r) const;
 
 	/**
 	 * Sets rectangle members.
@@ -155,7 +151,7 @@
 	 * @param	cx	requested center x-coordinate of the rectangle
 	 * @param	cy	requested center y-coordinate of the rectangle
 	 */
-	virtual	void setCenter(GHOST_TInt32 cx, GHOST_TInt32 cy);
+	void setCenter(GHOST_TInt32 cx, GHOST_TInt32 cy);
 
 	/**
 	 * Sets rectangle members.
@@ -166,7 +162,7 @@
 	 * @param	w	requested width of the rectangle
 	 * @param	h	requested height of the rectangle
 	 */
-	virtual	void setCenter(GHOST_TInt32 cx, GHOST_TInt32 cy, GHOST_TInt32 w, GHOST_TInt32 h);
+	void setCenter(GHOST_TInt32 cx, GHOST_TInt32 cy, GHOST_TInt32 w, GHOST_TInt32 h);
 
 	/**
 	 * Clips a rectangle.
@@ -175,7 +171,7 @@
 	 * @param	r	the rectangle to clip
 	 * @return	whether clipping has occurred
 	 */
-	virtual	bool clip(GHOST_Rect& r) const;
+	bool clip(GHOST_Rect& r) const;
 
 	/** Left coordinate of the rectangle */
 	GHOST_TInt32 m_l;
@@ -234,11 +230,11 @@
 	if (y < m_t) m_t = y;
 	if (y > m_b) m_b = y;
 }
-#include <stdio.h>
-inline void GHOST_Rect::wrapPoint(GHOST_TInt32 &x, GHOST_TInt32 &y, GHOST_TInt32 ofs)
+
+inline void GHOST_Rect::wrapPoint(GHOST_TInt32& x, GHOST_TInt32& y, GHOST_TInt32 ofs) const
 {
-	GHOST_TInt32 w= getWidth();
-	GHOST_TInt32 h= getHeight();
+	const GHOST_TInt32 w= getWidth();
+	const GHOST_TInt32 h= getHeight();
 
 	/* highly unlikely but avoid eternal loop */
 	if(w-ofs*2 <= 0 || h-ofs*2 <= 0)
@@ -249,6 +245,27 @@
 	while(y+ofs > m_b)		y-= h-(ofs*2);
 }
 
+#if 0
+#include <stdio.h>
+inline void GHOST_Rect::wrapPoint(GHOST_TInt32& x, GHOST_TInt32& y, GHOST_TInt32 ofs) const
+{
+	const GHOST_TInt32 left = m_l + ofs;
+	const GHOST_TInt32 right = m_r - ofs;
+	const GHOST_TInt32 top = m_t + ofs;
+	const GHOST_TInt32 bottom = m_b - ofs;
+	printf("H %d..%d -> %d..%d\n", m_l, m_r, left, right);
+	printf("V %d..%d -> %d..%d\n", m_t, m_b, top, bottom);
+
+	const GHOST_TInt32 width = right - left;
+	const GHOST_TInt32 height = bottom - top;
+
+	printf("point (%d,%d)", x, y);
+	x = (x - left) % width + left;
+	y = (y - top) % height + top;
+	printf(" -> (%d,%d)\n", x, y);
+}
+#endif
+
 inline bool GHOST_Rect::isInside(GHOST_TInt32 x, GHOST_TInt32 y) const
 {
 	return (x >= m_l) && (x <= m_r) && (y >= m_t) && (y <= m_b);

Modified: branches/merwin-tablet-2/intern/ghost/intern/GHOST_SystemCocoa.h
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_SystemCocoa.h	2011-01-22 06:41:34 UTC (rev 34449)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_SystemCocoa.h	2011-01-22 06:46:40 UTC (rev 34450)
@@ -42,6 +42,7 @@
 
 
 #include "GHOST_System.h"
+#include "GHOST_TabletManagerCocoa.h"
 
 class GHOST_EventCursor;
 class GHOST_EventKey;
@@ -314,6 +315,8 @@
 	
 	/** Multitouch gesture in progress, useful to distinguish trackpad from mouse scroll events */
 	bool m_isGestureInProgress;
+
+	GHOST_TabletManagerCocoa m_tabletManager;
 };
 
 #endif // _GHOST_SYSTEM_COCOA_H_

Modified: branches/merwin-tablet-2/intern/ghost/intern/GHOST_SystemCocoa.mm
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_SystemCocoa.mm	2011-01-22 06:41:34 UTC (rev 34449)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_SystemCocoa.mm	2011-01-22 06:46:40 UTC (rev 34450)
@@ -927,7 +927,14 @@
 						if ([event deviceID] == m_tablet_mouse_id)
 							handleMouseEvent(event);
 						else
+							{
 							handleTabletEvent(event);
+
+							GHOST_WindowCocoa* window = (GHOST_WindowCocoa*)
+								m_windowManager->getWindowAssociatedWithOSWindow((void*)[event window]);
+
+							m_tabletManager.convertEvent(event, window);
+							}
 						break;
 					case NSTabletProximityEventSubtype:
 						// I think only LMB down/up sends this.
@@ -945,6 +952,12 @@
 				
 			case NSTabletProximity:
 				handleTabletProximity(event);
+
+				if ([event isEnteringProximity])
+					m_tabletManager.pickupTool(event);
+				else
+					m_tabletManager.dropTool();
+
 				break;
 
 			case NSTabletPoint:
@@ -1538,13 +1551,24 @@
 		return GHOST_kFailure;
 	}
 
+	// these support "continuous grab" feature and
+	// take advantage of MacOS support for fractional coordinates
+	static NSPoint effectiveCursorPos;
+		// while *visible* cursor may be wrapped inside a view, the *effective* cursor
+		// is free to extend beyond the view, even beyond the screen.
+	static NSPoint prevCursorPos;
+		// used for tracking precise cursor deltas
+		// errors from [event deltaX] and its vertical friend accumulate quickly!
+
 	switch ([event type])
     {
 		case NSLeftMouseDown:
 		case NSRightMouseDown:
 		case NSOtherMouseDown:
 			printf("mouse button %d down\n", [event buttonNumber]);
-			[NSEvent setMouseCoalescingEnabled:NO];
+			effectiveCursorPos = [event locationInWindow]; // similar role to grabInitPos
+			prevCursorPos = effectiveCursorPos; // set this initially, so we have something to delta from
+//			[NSEvent setMouseCoalescingEnabled:NO]; // start hi-fi event stream
 			pushEvent(new GHOST_EventButton([event timestamp]*1000, GHOST_kEventButtonDown, window, convertButton([event buttonNumber])));
 			break;
 
@@ -1552,7 +1576,7 @@
 		case NSRightMouseUp:
 		case NSOtherMouseUp:
 			printf("mouse button %d up\n", [event buttonNumber]);
-			[NSEvent setMouseCoalescingEnabled:YES];
+//			[NSEvent setMouseCoalescingEnabled:YES]; // stop hi-fi event stream
 			pushEvent(new GHOST_EventButton([event timestamp]*1000, GHOST_kEventButtonUp, window, convertButton([event buttonNumber])));
 			break;
 
@@ -1561,6 +1585,12 @@
 		case NSOtherMouseDragged:
 		case NSMouseMoved:
 //			printf("move ");
+
+			{
+			CGPoint screenPos = CGEventGetLocation([event CGEvent]);
+			printf("screen position: %.2f %.2f\n", screenPos.x, screenPos.y);
+			}
+
 			if (false) { // display some useful mouse info
 				NSPoint mousePos = [event locationInWindow];
 				float event_dx = [event deltaX];
@@ -1570,6 +1600,7 @@
 					printf("[hi-fi] ");
 				printf("<%.2f,%.2f> to (%.2f,%.2f)\n", event_dx, event_dy, mousePos.x, mousePos.y);
 			}
+
 			switch (window->getCursorGrabMode()) {
 				case GHOST_kGrabHide: //Cursor hidden grab operation : no cursor move
 				{
@@ -1586,51 +1617,78 @@
 					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;
+					printf("-- gangsta wrap --\n");
 
-					/* fallback to window bounds */
-					if(window->getCursorGrabBounds(bounds)==GHOST_kFailure)
+					NSPoint visibleCursorPos = [event locationInWindow];
+
+					// get good screen coordinates
+					/*

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list