[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23696] trunk/blender: - made ungrab a second function - WM_cursor_ungrab

Campbell Barton ideasman42 at gmail.com
Wed Oct 7 23:19:35 CEST 2009


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

Log Message:
-----------
- made ungrab a second function - WM_cursor_ungrab
- ungrab can restore the position of the mouse clamped to the window bounds (much nicer for transform)

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_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/source/blender/editors/interface/interface_handlers.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 20:55:14 UTC (rev 23695)
+++ trunk/blender/intern/ghost/GHOST_C-api.h	2009-10-07 21:19:35 UTC (rev 23696)
@@ -376,7 +376,7 @@
  * @return	Indication of success.
  */
 extern GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle,
-										  int grab, int warp);
+										  int grab, int warp, int restore);
 
 /***************************************************************************************
  ** 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 20:55:14 UTC (rev 23695)
+++ trunk/blender/intern/ghost/GHOST_IWindow.h	2009-10-07 21:19:35 UTC (rev 23696)
@@ -271,7 +271,7 @@
 	 * @param	grab The new grab state of the cursor.
 	 * @return	Indication of success.
 	 */
-	virtual GHOST_TSuccess setCursorGrab(bool grab, bool warp) { return GHOST_kSuccess; };
+	virtual GHOST_TSuccess setCursorGrab(bool grab, bool warp, bool restore) { 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 20:55:14 UTC (rev 23695)
+++ trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2009-10-07 21:19:35 UTC (rev 23696)
@@ -355,11 +355,11 @@
 
 
 GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle,
-								   int grab, int warp)
+								   int grab, int warp, int restore)
 {
 	GHOST_IWindow* window = (GHOST_IWindow*) windowhandle;
 	
-	return window->setCursorGrab(grab?true:false, warp?true:false);
+	return window->setCursorGrab(grab?true:false, warp?true:false, restore?true:false);
 }
 
 

Modified: trunk/blender/intern/ghost/intern/GHOST_Window.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_Window.cpp	2009-10-07 20:55:14 UTC (rev 23695)
+++ trunk/blender/intern/ghost/intern/GHOST_Window.cpp	2009-10-07 21:19:35 UTC (rev 23696)
@@ -98,12 +98,12 @@
 	}
 }
 
-GHOST_TSuccess GHOST_Window::setCursorGrab(bool grab, bool warp)
+GHOST_TSuccess GHOST_Window::setCursorGrab(bool grab, bool warp, bool restore)
 {
 	if(m_cursorGrabbed == grab)
 		return GHOST_kSuccess;
 
-	if (setWindowCursorGrab(grab, warp)) {
+	if (setWindowCursorGrab(grab, warp, restore)) {
 		m_cursorGrabbed = grab;
 		return GHOST_kSuccess;
 	}

Modified: trunk/blender/intern/ghost/intern/GHOST_Window.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_Window.h	2009-10-07 20:55:14 UTC (rev 23695)
+++ trunk/blender/intern/ghost/intern/GHOST_Window.h	2009-10-07 21:19:35 UTC (rev 23696)
@@ -175,7 +175,7 @@
 	 * @param	grab The new grab state of the cursor.
 	 * @return	Indication of success.
 	 */
-	virtual GHOST_TSuccess setCursorGrab(bool grab, bool warp);
+	virtual GHOST_TSuccess setCursorGrab(bool grab, bool warp, bool restore);
 
 	/**
 	 * Sets the window "modified" status, indicating unsaved changes
@@ -247,7 +247,7 @@
 	 * Sets the cursor grab on the window using
 	 * native window system calls.
 	 */
-	virtual GHOST_TSuccess setWindowCursorGrab(bool grab, bool warp) { return GHOST_kSuccess; };
+	virtual GHOST_TSuccess setWindowCursorGrab(bool grab, bool warp, bool restore) { return GHOST_kSuccess; };
 	
 	/**
 	 * Sets the cursor shape on the window using

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp	2009-10-07 20:55:14 UTC (rev 23695)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp	2009-10-07 21:19:35 UTC (rev 23696)
@@ -1400,7 +1400,7 @@
 	GHOST_TSuccess
 GHOST_WindowX11::
 setWindowCursorGrab(
-	bool grab, bool warp
+	bool grab, bool warp, bool restore
 ){
 	if(grab) {
 		if(warp) {
@@ -1416,8 +1416,28 @@
 		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]);
+			if(restore) {
+				GHOST_Rect bounds;
+				GHOST_TInt32 x_new, y_new, x_rel, y_rel;
 
+				getClientBounds(bounds);
+
+				x_new= m_cursorWarpInitPos[0]+m_cursorWarpAccumPos[0];
+				y_new= m_cursorWarpInitPos[1]+m_cursorWarpAccumPos[1];
+
+				screenToClient(x_new, y_new, x_rel, y_rel);
+
+				if(x_rel < 0)		x_new = (x_new-x_rel) + 2;
+				if(y_rel < 0)		y_new = (y_new-y_rel) + 2;
+				if(x_rel > bounds.getWidth())	x_new -= (x_rel-bounds.getWidth()) + 2;
+				if(y_rel > bounds.getHeight())	y_new -= (y_rel-bounds.getHeight()) + 2;
+				m_system->setCursorPosition(x_new, y_new);
+
+			}
+			else {
+				m_system->setCursorPosition(m_cursorWarpInitPos[0], m_cursorWarpInitPos[1]);
+			}
+
 			setCursorWarpAccum(0, 0);
 			m_cursorWarp= false;
 		}

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowX11.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowX11.h	2009-10-07 20:55:14 UTC (rev 23695)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowX11.h	2009-10-07 21:19:35 UTC (rev 23696)
@@ -256,7 +256,7 @@
 	 */
 		GHOST_TSuccess 
 	setWindowCursorGrab(
-		bool grab, bool warp
+		bool grab, bool warp, bool restore
 	);
 
 	/**

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2009-10-07 20:55:14 UTC (rev 23695)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2009-10-07 21:19:35 UTC (rev 23696)
@@ -3709,12 +3709,12 @@
 	/* number editing */
 	if(state == BUTTON_STATE_NUM_EDITING) {
 		if(ui_is_a_warp_but(but))
-			WM_cursor_grab(CTX_wm_window(C), 1, 1);
+			WM_cursor_grab(CTX_wm_window(C), TRUE);
 		ui_numedit_begin(but, data);
 	} else if(data->state == BUTTON_STATE_NUM_EDITING) {
 		ui_numedit_end(but, data);
 		if(ui_is_a_warp_but(but))
-			WM_cursor_grab(CTX_wm_window(C), 0, -1);
+			WM_cursor_ungrab(CTX_wm_window(C), FALSE);
 	}
 	/* menu open */
 	if(state == BUTTON_STATE_MENU_OPEN)

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2009-10-07 20:55:14 UTC (rev 23695)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2009-10-07 21:19:35 UTC (rev 23696)
@@ -75,7 +75,8 @@
 void		WM_cursor_modal		(struct wmWindow *win, int curs);
 void		WM_cursor_restore	(struct wmWindow *win);
 void		WM_cursor_wait		(int val);
-void		WM_cursor_grab		(struct wmWindow *win, int val, int warp);
+void		WM_cursor_grab(struct wmWindow *win, int warp);
+void		WM_cursor_ungrab(wmWindow *win, int restore);
 void		WM_timecursor		(struct wmWindow *win, int nr);
 
 void		*WM_paint_cursor_activate(struct wmWindowManager *wm, int (*poll)(struct bContext *C), void (*draw)(struct bContext *C, int, int, void *customdata), void *customdata);

Modified: trunk/blender/source/blender/windowmanager/intern/wm_cursors.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_cursors.c	2009-10-07 20:55:14 UTC (rev 23695)
+++ trunk/blender/source/blender/windowmanager/intern/wm_cursors.c	2009-10-07 21:19:35 UTC (rev 23696)
@@ -163,12 +163,18 @@
 	}
 }
 
-void WM_cursor_grab(wmWindow *win, int val, int warp)
+void WM_cursor_grab(wmWindow *win, int warp)
 {
 	if(win)
-		GHOST_SetCursorGrab(win->ghostwin, val, warp);
+		GHOST_SetCursorGrab(win->ghostwin, 1, warp, -1);
 }
 
+void WM_cursor_ungrab(wmWindow *win, int restore)
+{
+	if(win)
+		GHOST_SetCursorGrab(win->ghostwin, 0, -1, restore);
+}
+
 /* afer this you can call restore too */
 void WM_timecursor(wmWindow *win, int nr)
 {

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-10-07 20:55:14 UTC (rev 23695)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-10-07 21:19:35 UTC (rev 23696)
@@ -442,7 +442,7 @@
 		else if(retval & OPERATOR_RUNNING_MODAL) {
 			/* grab cursor during blocking modal ops (X11) */
 			if(ot->flag & OPTYPE_BLOCKING)
-				WM_cursor_grab(CTX_wm_window(C), 1, (U.uiflag & USER_CONTINUOUS_MOUSE));
+				WM_cursor_grab(CTX_wm_window(C), (U.uiflag & USER_CONTINUOUS_MOUSE));
 		}
 		else
 			WM_operator_free(op);
@@ -637,7 +637,7 @@
 				CTX_wm_region_set(C, region);
 			}
 
-			WM_cursor_grab(CTX_wm_window(C), 0, -1);
+			WM_cursor_ungrab(CTX_wm_window(C), TRUE);
 			WM_operator_free(handler->op);
 		}
 		else if(handler->ui_remove) {
@@ -835,7 +835,7 @@
 			
 			/* remove modal handler, operator itself should have been cancelled and freed */
 			if(retval & (OPERATOR_CANCELLED|OPERATOR_FINISHED)) {
-				WM_cursor_grab(CTX_wm_window(C), 0, -1);
+				WM_cursor_ungrab(CTX_wm_window(C), TRUE);
 
 				BLI_remlink(handlers, handler);
 				wm_event_free_handler(handler);





More information about the Bf-blender-cvs mailing list