[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50811] trunk/blender: Improvement to own commit r50810.

Campbell Barton ideasman42 at gmail.com
Sat Sep 22 15:23:13 CEST 2012


Revision: 50811
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50811
Author:   campbellbarton
Date:     2012-09-22 13:23:12 +0000 (Sat, 22 Sep 2012)
Log Message:
-----------
Improvement to own commit r50810.

Add an optional ghost argument to set the new mouse location when un-grabbing. - without this the mouse would flicker at the old location before moving to the new location - when using the color picker for eg.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50810

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/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	2012-09-22 12:25:54 UTC (rev 50810)
+++ trunk/blender/intern/ghost/GHOST_C-api.h	2012-09-22 13:23:12 UTC (rev 50811)
@@ -387,11 +387,12 @@
  * \param windowhandle The handle to the window
  * \param mode The new grab state of the cursor.
  * \param bounds The grab ragion (optional) - left,top,right,bottom
+ * \param mouse_ungrab_xy XY for new mouse location (optional) - x,y
  * \return Indication of success.
  */
 extern GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle,
                                           GHOST_TGrabCursorMode mode,
-                                          int *bounds);
+                                          int bounds[4], int mouse_ungrab_xy[2]);
 
 /***************************************************************************************
  * Access to mouse button and keyboard states.

Modified: trunk/blender/intern/ghost/GHOST_IWindow.h
===================================================================
--- trunk/blender/intern/ghost/GHOST_IWindow.h	2012-09-22 12:25:54 UTC (rev 50810)
+++ trunk/blender/intern/ghost/GHOST_IWindow.h	2012-09-22 13:23:12 UTC (rev 50811)
@@ -303,7 +303,7 @@
 	 * \param	grab The new grab state of the cursor.
 	 * \return	Indication of success.
 	 */
-	virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds) { return GHOST_kSuccess; }
+	virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds, GHOST_TInt32 mouse_ungrab_xy[2]) { return GHOST_kSuccess; }
 
 #ifdef WITH_CXX_GUARDEDALLOC
 	MEM_CXX_CLASS_ALLOC_FUNCS("GHOST:GHOST_IWindow")

Modified: trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2012-09-22 12:25:54 UTC (rev 50810)
+++ trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2012-09-22 13:23:12 UTC (rev 50811)
@@ -355,10 +355,11 @@
 
 GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle,
                                    GHOST_TGrabCursorMode mode,
-                                   int *bounds)
+                                   int bounds[4], int mouse_ungrab_xy[2])
 {
 	GHOST_IWindow *window = (GHOST_IWindow *) windowhandle;
 	GHOST_Rect bounds_rect, bounds_win;
+	GHOST_TInt32 mouse_ungrab_xy_global[2];
 
 	if (bounds) {
 		/* if this is X11 specific we need a function that converts */
@@ -368,7 +369,16 @@
 
 	}
 	
-	return window->setCursorGrab(mode, bounds ? &bounds_rect : NULL);
+	if (mouse_ungrab_xy) {
+		if (bounds == NULL)
+			window->getClientBounds(bounds_win);
+		window->clientToScreen(mouse_ungrab_xy[0], bounds_win.getHeight() - mouse_ungrab_xy[1],
+		                       mouse_ungrab_xy_global[0], mouse_ungrab_xy_global[1]);
+	}
+
+	return window->setCursorGrab(mode,
+	                             bounds ? &bounds_rect : NULL,
+	                             mouse_ungrab_xy ? mouse_ungrab_xy_global : NULL);
 }
 
 

Modified: trunk/blender/intern/ghost/intern/GHOST_Window.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_Window.cpp	2012-09-22 12:25:54 UTC (rev 50810)
+++ trunk/blender/intern/ghost/intern/GHOST_Window.cpp	2012-09-22 13:23:12 UTC (rev 50811)
@@ -38,6 +38,7 @@
 
 #include "GHOST_Window.h"
 
+#include <assert.h>
 
 GHOST_Window::GHOST_Window(
     GHOST_TUns32 width, GHOST_TUns32 height,
@@ -105,11 +106,18 @@
 	}
 }
 
-GHOST_TSuccess GHOST_Window::setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds)
+GHOST_TSuccess GHOST_Window::setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds, GHOST_TInt32 mouse_ungrab_xy[2])
 {
 	if (m_cursorGrab == mode)
 		return GHOST_kSuccess;
 
+	/* override with new location */
+	if (mouse_ungrab_xy) {
+		assert(mode == GHOST_kGrabDisable);
+		m_cursorGrabInitPos[0] = mouse_ungrab_xy[0];
+		m_cursorGrabInitPos[1] = mouse_ungrab_xy[1];
+	}
+
 	if (setWindowCursorGrab(mode)) {
 
 		if (mode == GHOST_kGrabDisable)

Modified: trunk/blender/intern/ghost/intern/GHOST_Window.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_Window.h	2012-09-22 12:25:54 UTC (rev 50810)
+++ trunk/blender/intern/ghost/intern/GHOST_Window.h	2012-09-22 13:23:12 UTC (rev 50811)
@@ -178,7 +178,7 @@
 	 * \param	mode The new grab state of the cursor.
 	 * \return	Indication of success.
 	 */
-	virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds);
+	virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds, GHOST_TInt32 mouse_ungrab_xy[2]);
 
 	/**
 	 * Gets the cursor grab region, if unset the window is used.

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2012-09-22 12:25:54 UTC (rev 50810)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2012-09-22 13:23:12 UTC (rev 50811)
@@ -5372,14 +5372,21 @@
 	else if (data->state == BUTTON_STATE_NUM_EDITING) {
 		ui_numedit_end(but, data);
 		if (ui_is_a_warp_but(but)) {
-			WM_cursor_grab_disable(CTX_wm_window(C));
 
-			/* XXX, you can see that the cursor is revealed, then moved - should do at once */
 #ifdef USE_CONT_MOUSE_CORRECT
 			if (data->ungrab_mval[0] != FLT_MAX) {
+				int mouse_ungrab_xy[2];
 				ui_block_to_window_fl(data->region, but->block, &data->ungrab_mval[0], &data->ungrab_mval[1]);
-				WM_cursor_warp(CTX_wm_window(C), data->ungrab_mval[0], data->ungrab_mval[1]);
+				mouse_ungrab_xy[0] = data->ungrab_mval[0];
+				mouse_ungrab_xy[1] = data->ungrab_mval[1];
+
+				WM_cursor_grab_disable(data->window, mouse_ungrab_xy);
 			}
+			else {
+				WM_cursor_grab_disable(data->window, NULL);
+			}
+#else
+			WM_cursor_grab_disable(data->window, );
 #endif
 		}
 	}

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2012-09-22 12:25:54 UTC (rev 50810)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2012-09-22 13:23:12 UTC (rev 50811)
@@ -114,8 +114,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_enable(struct wmWindow *win, int wrap, int hide, int *bounds);
-void		WM_cursor_grab_disable(struct wmWindow *win);
+void		WM_cursor_grab_enable(struct wmWindow *win, int wrap, int hide, int bounds[4]);
+void		WM_cursor_grab_disable(struct wmWindow *win, int mouse_ungrab_xy[2]);
 void		WM_cursor_time		(struct wmWindow *win, int nr);
 
 void		*WM_paint_cursor_activate(struct wmWindowManager *wm,

Modified: trunk/blender/source/blender/windowmanager/intern/wm_cursors.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_cursors.c	2012-09-22 12:25:54 UTC (rev 50810)
+++ trunk/blender/source/blender/windowmanager/intern/wm_cursors.c	2012-09-22 13:23:12 UTC (rev 50811)
@@ -179,7 +179,10 @@
 	}
 }
 
-void WM_cursor_grab_enable(wmWindow *win, int wrap, int hide, int *bounds)
+/**
+ * \param bounds can be NULL
+ */
+void WM_cursor_grab_enable(wmWindow *win, int wrap, int hide, int bounds[4])
 {
 	/* Only grab cursor when not running debug.
 	 * It helps not to get a stuck WM when hitting a breakpoint  
@@ -193,20 +196,20 @@
 			const GHOST_TabletData *tabletdata = GHOST_GetTabletData(win->ghostwin);
 			/* Note: There is no tabletdata on Windows if no tablet device is connected. */
 			if (!tabletdata)
-				GHOST_SetCursorGrab(win->ghostwin, mode, bounds);
+				GHOST_SetCursorGrab(win->ghostwin, mode, bounds, NULL);
 			else if (tabletdata->Active == GHOST_kTabletModeNone)
-				GHOST_SetCursorGrab(win->ghostwin, mode, bounds);
+				GHOST_SetCursorGrab(win->ghostwin, mode, bounds, NULL);
 
 			win->grabcursor = mode;
 		}
 	}
 }
 
-void WM_cursor_grab_disable(wmWindow *win)
+void WM_cursor_grab_disable(wmWindow *win, int mouse_ungrab_xy[2])
 {
 	if ((G.debug & G_DEBUG) == 0) {
 		if (win && win->ghostwin) {
-			GHOST_SetCursorGrab(win->ghostwin, GHOST_kGrabDisable, NULL);
+			GHOST_SetCursorGrab(win->ghostwin, GHOST_kGrabDisable, NULL, mouse_ungrab_xy);
 			win->grabcursor = GHOST_kGrabDisable;
 		}
 	}

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2012-09-22 12:25:54 UTC (rev 50810)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2012-09-22 13:23:12 UTC (rev 50811)
@@ -1202,7 +1202,7 @@
 				CTX_wm_region_set(C, region);
 			}
 
-			WM_cursor_grab_disable(CTX_wm_window(C));
+			WM_cursor_grab_disable(CTX_wm_window(C), NULL);
 			WM_operator_free(handler->op);
 		}
 		else if (handler->ui_remove) {
@@ -1432,7 +1432,7 @@
 
 				/* remove modal handler, operator itself should have been canceled and freed */
 				if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) {
-					WM_cursor_grab_disable(CTX_wm_window(C));
+					WM_cursor_grab_disable(CTX_wm_window(C), NULL);
 
 					BLI_remlink(handlers, handler);
 					wm_event_free_handler(handler);




More information about the Bf-blender-cvs mailing list