diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-09-22 17:23:12 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-09-22 17:23:12 +0400 |
commit | 1541ee20c87fe5b981b81ab3add6fa0df29e91d1 (patch) | |
tree | b41500bcd4aab6afc2c82c2156bcb4db8152ad66 /intern | |
parent | 9bb90f4d8510a64ab0435f86659eb169db423613 (diff) |
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.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/ghost/GHOST_C-api.h | 3 | ||||
-rw-r--r-- | intern/ghost/GHOST_IWindow.h | 2 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_C-api.cpp | 14 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_Window.cpp | 10 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_Window.h | 2 |
5 files changed, 25 insertions, 6 deletions
diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h index ae30458a5e5..87ab3c013c6 100644 --- a/intern/ghost/GHOST_C-api.h +++ b/intern/ghost/GHOST_C-api.h @@ -387,11 +387,12 @@ extern GHOST_TSuccess GHOST_SetCursorPosition(GHOST_SystemHandle systemhandle, * \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. diff --git a/intern/ghost/GHOST_IWindow.h b/intern/ghost/GHOST_IWindow.h index a1a1acfca75..7ec6417ca4f 100644 --- a/intern/ghost/GHOST_IWindow.h +++ b/intern/ghost/GHOST_IWindow.h @@ -303,7 +303,7 @@ public: * \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") diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp index 0a4325930d5..88d02c46f61 100644 --- a/intern/ghost/intern/GHOST_C-api.cpp +++ b/intern/ghost/intern/GHOST_C-api.cpp @@ -355,10 +355,11 @@ GHOST_TSuccess GHOST_SetCursorPosition(GHOST_SystemHandle systemhandle, 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 @@ GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle, } - 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); } diff --git a/intern/ghost/intern/GHOST_Window.cpp b/intern/ghost/intern/GHOST_Window.cpp index eb80a073b44..fd3ff4f85f0 100644 --- a/intern/ghost/intern/GHOST_Window.cpp +++ b/intern/ghost/intern/GHOST_Window.cpp @@ -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::setCursorVisibility(bool visible) } } -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) diff --git a/intern/ghost/intern/GHOST_Window.h b/intern/ghost/intern/GHOST_Window.h index fe21b91b991..fd870327fd4 100644 --- a/intern/ghost/intern/GHOST_Window.h +++ b/intern/ghost/intern/GHOST_Window.h @@ -178,7 +178,7 @@ public: * \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. |