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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs