[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23679] trunk/blender: Experimental option to allow moving the mouse outside the view, " Continuous Grab" in the user-prefs.

Campbell Barton ideasman42 at gmail.com
Wed Oct 7 09:11:11 CEST 2009


Revision: 23679
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23679
Author:   campbellbarton
Date:     2009-10-07 09:11:10 +0200 (Wed, 07 Oct 2009)

Log Message:
-----------
Experimental option to allow moving the mouse outside the view, "Continuous Grab" in the user-prefs.
- Useful for dragging buttons to the far right when theyd otherwise hit the screen edge.
- Useful for transform though probably NOT what you want when using the transform manipulator (should make an option).
- When enabled, number buttons use this as well as a different conversion of mouse movement
  float numbuts: mouse 1px == 1-clickstep
  int numbuts: 2px == 1 (tried 1:1 but its too jitter prone)

details...
- access as an option to GHOST_SetCursorGrab(grab, warp)
- Currently all operators that grab use this, could be made an operator flag
- only Ghost/X11 supported currently

Modified Paths:
--------------
    trunk/blender/intern/ghost/GHOST_C-api.h
    trunk/blender/intern/ghost/GHOST_IWindow.h
    trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
    trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp
    trunk/blender/intern/ghost/intern/GHOST_Window.cpp
    trunk/blender/intern/ghost/intern/GHOST_Window.h
    trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
    trunk/blender/intern/ghost/intern/GHOST_WindowX11.h
    trunk/blender/release/scripts/ui/space_userpref.py
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/makesdna/DNA_userdef_types.h
    trunk/blender/source/blender/makesrna/intern/rna_userdef.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_cursors.c
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: trunk/blender/intern/ghost/GHOST_C-api.h
===================================================================
--- trunk/blender/intern/ghost/GHOST_C-api.h	2009-10-07 05:26:13 UTC (rev 23678)
+++ trunk/blender/intern/ghost/GHOST_C-api.h	2009-10-07 07:11:10 UTC (rev 23679)
@@ -376,7 +376,7 @@
  * @return	Indication of success.
  */
 extern GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle,
-										  int grab);
+										  int grab, int warp);
 
 /***************************************************************************************
  ** Access to mouse button and keyboard states.

Modified: trunk/blender/intern/ghost/GHOST_IWindow.h
===================================================================
--- trunk/blender/intern/ghost/GHOST_IWindow.h	2009-10-07 05:26:13 UTC (rev 23678)
+++ trunk/blender/intern/ghost/GHOST_IWindow.h	2009-10-07 07:11:10 UTC (rev 23679)
@@ -271,7 +271,7 @@
 	 * @param	grab The new grab state of the cursor.
 	 * @return	Indication of success.
 	 */
-	virtual GHOST_TSuccess setCursorGrab(bool grab) { return GHOST_kSuccess; };
+	virtual GHOST_TSuccess setCursorGrab(bool grab, bool warp) { return GHOST_kSuccess; };
 
 };
 

Modified: trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2009-10-07 05:26:13 UTC (rev 23678)
+++ trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2009-10-07 07:11:10 UTC (rev 23679)
@@ -355,11 +355,11 @@
 
 
 GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle,
-								   int grab)
+								   int grab, int warp)
 {
 	GHOST_IWindow* window = (GHOST_IWindow*) windowhandle;
 	
-	return window->setCursorGrab(grab?true:false);
+	return window->setCursorGrab(grab?true:false, warp?true:false);
 }
 
 

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp	2009-10-07 05:26:13 UTC (rev 23678)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp	2009-10-07 07:11:10 UTC (rev 23679)
@@ -374,12 +374,12 @@
 				// Only generate a single expose event
 				// per read of the event queue.
 
-				g_event = new 
+				g_event = new
 				GHOST_Event(
 					getMilliSeconds(),
 					GHOST_kEventWindowUpdate,
 					window
-				);			
+				);
 			}
 			break;
 		}
@@ -388,14 +388,42 @@
 		{
 			XMotionEvent &xme = xe->xmotion;
 			
-			g_event = new 
-			GHOST_EventCursor(
-				getMilliSeconds(),
-				GHOST_kEventCursorMove,
-				window,
-				xme.x_root,
-				xme.y_root
-			);
+			if(window->getCursorWarp()) {
+				/* Calculate offscreen location and re-center the mouse */
+				GHOST_TInt32 x_warp, y_warp,  x_new, y_new, x_accum, y_accum;
+
+				window->getCursorWarpPos(x_warp, y_warp);
+				getCursorPosition(x_new, y_new);
+
+				if(x_warp != x_new || y_warp != y_new) {
+					window->getCursorWarpAccum(x_accum, y_accum);
+					x_accum += x_new - x_warp;
+					y_accum += y_new - y_warp;
+
+					window->setCursorWarpAccum(x_accum, y_accum);
+					setCursorPosition(x_warp, y_warp); /* reset */
+
+					g_event = new
+					GHOST_EventCursor(
+						getMilliSeconds(),
+						GHOST_kEventCursorMove,
+						window,
+						x_warp + x_accum,
+						y_warp + y_accum
+					);
+
+				}
+			}
+			else {
+				g_event = new
+				GHOST_EventCursor(
+					getMilliSeconds(),
+					GHOST_kEventCursorMove,
+					window,
+					xme.x_root,
+					xme.y_root
+				);
+			}
 			break;
 		}
 

Modified: trunk/blender/intern/ghost/intern/GHOST_Window.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_Window.cpp	2009-10-07 05:26:13 UTC (rev 23678)
+++ trunk/blender/intern/ghost/intern/GHOST_Window.cpp	2009-10-07 07:11:10 UTC (rev 23679)
@@ -48,12 +48,16 @@
 :
 	m_drawingContextType(type),
 	m_cursorVisible(true),
-	m_cursorGrabbed(true),
+	m_cursorGrabbed(false),
+	m_cursorWarp(false),
 	m_cursorShape(GHOST_kStandardCursorDefault),
 	m_stereoVisual(stereoVisual)
 {
 	m_isUnsavedChanges = false;
 	
+    m_cursorWarpAccumPos[0] = 0;
+    m_cursorWarpAccumPos[1] = 0;
+
     m_fullScreen = state == GHOST_kWindowStateFullScreen;
     if (m_fullScreen) {
         m_fullScreenWidth = width;
@@ -94,12 +98,12 @@
 	}
 }
 
-GHOST_TSuccess GHOST_Window::setCursorGrab(bool grab)
+GHOST_TSuccess GHOST_Window::setCursorGrab(bool grab, bool warp)
 {
 	if(m_cursorGrabbed == grab)
 		return GHOST_kSuccess;
 
-	if (setWindowCursorGrab(grab)) {
+	if (setWindowCursorGrab(grab, warp)) {
 		m_cursorGrabbed = grab;
 		return GHOST_kSuccess;
 	}
@@ -150,4 +154,4 @@
 bool GHOST_Window::getModifiedState()
 {
 	return m_isUnsavedChanges;
-}
\ 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-07 05:26:13 UTC (rev 23678)
+++ trunk/blender/intern/ghost/intern/GHOST_Window.h	2009-10-07 07:11:10 UTC (rev 23679)
@@ -158,6 +158,10 @@
 	 * @return	The visibility state of the cursor.
 	 */
 	inline virtual bool getCursorVisibility() const;
+	inline virtual bool getCursorWarp() const;
+	inline virtual bool getCursorWarpPos(GHOST_TInt32 &x, GHOST_TInt32 &y) const;
+	inline virtual bool getCursorWarpAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const;
+	inline virtual bool setCursorWarpAccum(GHOST_TInt32 x, GHOST_TInt32 y);
 
 	/**
 	 * Shows or hides the cursor.
@@ -171,7 +175,7 @@
 	 * @param	grab The new grab state of the cursor.
 	 * @return	Indication of success.
 	 */
-	virtual GHOST_TSuccess setCursorGrab(bool grab);
+	virtual GHOST_TSuccess setCursorGrab(bool grab, bool warp);
 
 	/**
 	 * Sets the window "modified" status, indicating unsaved changes
@@ -243,7 +247,7 @@
 	 * Sets the cursor grab on the window using
 	 * native window system calls.
 	 */
-	virtual GHOST_TSuccess setWindowCursorGrab(bool grab) { return GHOST_kSuccess; };
+	virtual GHOST_TSuccess setWindowCursorGrab(bool grab, bool warp) { return GHOST_kSuccess; };
 	
 	/**
 	 * Sets the cursor shape on the window using
@@ -272,6 +276,15 @@
 	/** The current grabbed state of the cursor */
 	bool m_cursorGrabbed;
 	
+	/** The current warped state of the cursor */
+	bool m_cursorWarp;
+
+	/** Initial grab location. */
+	GHOST_TInt32 m_cursorWarpInitPos[2];
+
+	/** Accumulated offset from m_cursorWarpInitPos. */
+	GHOST_TInt32 m_cursorWarpAccumPos[2];
+
 	/** The current shape of the cursor */
 	GHOST_TStandardCursor m_cursorShape;
     
@@ -304,6 +317,42 @@
 	return m_cursorVisible;
 }
 
+inline bool GHOST_Window::getCursorWarp() const
+{
+	return m_cursorWarp;
+}
+
+inline bool GHOST_Window::getCursorWarpPos(GHOST_TInt32 &x, GHOST_TInt32 &y) const
+{
+	if(m_cursorWarp==false)
+		return GHOST_kFailure;
+
+	x= m_cursorWarpInitPos[0];
+	y= m_cursorWarpInitPos[1];
+	return GHOST_kSuccess;
+}
+
+inline bool GHOST_Window::getCursorWarpAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const
+{
+	if(m_cursorWarp==false)
+		return GHOST_kFailure;
+
+	x= m_cursorWarpAccumPos[0];
+	y= m_cursorWarpAccumPos[1];
+	return GHOST_kSuccess;
+}
+
+inline bool GHOST_Window::setCursorWarpAccum(GHOST_TInt32 x, GHOST_TInt32 y)
+{
+	if(m_cursorWarp==false)
+		return GHOST_kFailure;
+
+	m_cursorWarpAccumPos[0]= x;
+	m_cursorWarpAccumPos[1]= y;
+
+	return GHOST_kSuccess;
+}
+
 inline GHOST_TStandardCursor GHOST_Window::getCursorShape() const
 {
 	return m_cursorShape;

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp	2009-10-07 05:26:13 UTC (rev 23678)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp	2009-10-07 07:11:10 UTC (rev 23679)
@@ -1400,12 +1400,29 @@
 	GHOST_TSuccess
 GHOST_WindowX11::
 setWindowCursorGrab(
-	bool grab
+	bool grab, bool warp
 ){
-	if(grab)
+	if(grab) {
+		if(warp) {
+			m_system->getCursorPosition(m_cursorWarpInitPos[0], m_cursorWarpInitPos[1]);
+
+			setCursorWarpAccum(0, 0);
+			setWindowCursorVisibility(false);
+			m_cursorWarp= true;
+		}
 		XGrabPointer(m_display, m_window, True, ButtonPressMask| ButtonReleaseMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
-	else
+	}
+	else {
+		if(m_cursorWarp) { /* are we exiting warp */
+			setWindowCursorVisibility(true);
+			/* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */
+			m_system->setCursorPosition(m_cursorWarpInitPos[0], m_cursorWarpInitPos[1]);
+
+			setCursorWarpAccum(0, 0);
+			m_cursorWarp= false;
+		}
 		XUngrabPointer(m_display, CurrentTime);
+	}
 
 	XFlush(m_display);
 	

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowX11.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowX11.h	2009-10-07 05:26:13 UTC (rev 23678)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowX11.h	2009-10-07 07:11:10 UTC (rev 23679)
@@ -252,10 +252,11 @@
 	/**
 	 * Sets the cursor grab on the window using
 	 * native window system calls.
+	 * @param warp	Only used when grab is enabled, hides the mouse and allows gragging outside the screen.
 	 */
 		GHOST_TSuccess 
 	setWindowCursorGrab(
-		bool grab
+		bool grab, bool warp
 	);
 
 	/**

Modified: trunk/blender/release/scripts/ui/space_userpref.py
===================================================================
--- trunk/blender/release/scripts/ui/space_userpref.py	2009-10-07 05:26:13 UTC (rev 23678)
+++ trunk/blender/release/scripts/ui/space_userpref.py	2009-10-07 07:11:10 UTC (rev 23679)
@@ -109,9 +109,9 @@
 		sub1.itemL(text="Mouse Wheel:")
 		sub1.itemR(view, "wheel_invert_zoom", text="Invert Zoom")
 		sub1.itemR(view, "wheel_scroll_lines", text="Scroll Lines")
+		sub1.itemL(text="Mouse Motion:")
+		sub1.itemR(view, "continuous_mouse", text="Continuous Grab")
 		sub1.itemS()
-		sub1.itemS()
-		sub1.itemS()
 		sub1.itemL(text="Menus:")
 		sub1.itemR(view, "open_mouse_over")
 		sub1.itemL(text="Menu Open Delay:")

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2009-10-07 05:26:13 UTC (rev 23678)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2009-10-07 07:11:10 UTC (rev 23679)
@@ -230,6 +230,15 @@
 	return NULL;
 }
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list