diff options
-rw-r--r-- | intern/ghost/GHOST_C-api.h | 6 | ||||
-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_SystemX11.cpp | 4 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_Window.cpp | 14 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_Window.h | 13 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_WindowX11.cpp | 1 | ||||
-rw-r--r-- | source/blender/editors/animation/anim_filter.c | 3 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_userdef.c | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_wm.c | 5 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_cursors.c | 7 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 16 |
14 files changed, 71 insertions, 20 deletions
diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h index 93bd12437ab..bd812177f17 100644 --- a/intern/ghost/GHOST_C-api.h +++ b/intern/ghost/GHOST_C-api.h @@ -372,11 +372,13 @@ extern GHOST_TSuccess GHOST_SetCursorPosition(GHOST_SystemHandle systemhandle, * events when the mouse is outside the window. X11 only, others * do this automatically. * @param windowhandle The handle to the window - * @param grab The new grab state of the cursor. + * @param mode The new grab state of the cursor. + * @param bounds The grab ragion (optional) - left,top,right,bottom * @return Indication of success. */ extern GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle, - GHOST_TGrabCursorMode mode); + GHOST_TGrabCursorMode mode, + int* bounds); /*************************************************************************************** ** Access to mouse button and keyboard states. diff --git a/intern/ghost/GHOST_IWindow.h b/intern/ghost/GHOST_IWindow.h index 3ab9bef2bfa..512fad877cb 100644 --- a/intern/ghost/GHOST_IWindow.h +++ b/intern/ghost/GHOST_IWindow.h @@ -271,7 +271,7 @@ public: * @param grab The new grab state of the cursor. * @return Indication of success. */ - virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode) { return GHOST_kSuccess; }; + virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds) { return GHOST_kSuccess; }; }; diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp index 5563e0d1aa8..0160df552cc 100644 --- a/intern/ghost/intern/GHOST_C-api.cpp +++ b/intern/ghost/intern/GHOST_C-api.cpp @@ -355,11 +355,21 @@ GHOST_TSuccess GHOST_SetCursorPosition(GHOST_SystemHandle systemhandle, GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle, - GHOST_TGrabCursorMode mode) + GHOST_TGrabCursorMode mode, + int *bounds) { GHOST_IWindow* window = (GHOST_IWindow*) windowhandle; + GHOST_Rect bounds_rect, bounds_win; + + if(bounds) { + /* if this is X11 specific we need a function that converts */ + window->getClientBounds(bounds_win); + window->clientToScreen(bounds[0], bounds_win.getHeight() - bounds[1], bounds_rect.m_l, bounds_rect.m_t); + window->clientToScreen(bounds[2], bounds_win.getHeight() - bounds[3], bounds_rect.m_r, bounds_rect.m_b); + + } - return window->setCursorGrab(mode); + return window->setCursorGrab(mode, bounds ? &bounds_rect:NULL); } diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 122e6c55241..774fd025b85 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -395,7 +395,9 @@ GHOST_SystemX11::processEvent(XEvent *xe) GHOST_TInt32 x_accum, y_accum; GHOST_Rect bounds; - window->getClientBounds(bounds); + /* fallback to window bounds */ + if(window->getCursorGrabBounds(bounds)==GHOST_kFailure) + window->getClientBounds(bounds); /* could also clamp to screen bounds * wrap with a window outside the view will fail atm */ diff --git a/intern/ghost/intern/GHOST_Window.cpp b/intern/ghost/intern/GHOST_Window.cpp index cda6bfa06ee..33484284d7c 100644 --- a/intern/ghost/intern/GHOST_Window.cpp +++ b/intern/ghost/intern/GHOST_Window.cpp @@ -97,12 +97,18 @@ GHOST_TSuccess GHOST_Window::setCursorVisibility(bool visible) } } -GHOST_TSuccess GHOST_Window::setCursorGrab(GHOST_TGrabCursorMode mode) +GHOST_TSuccess GHOST_Window::setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds) { if(m_cursorGrab == mode) return GHOST_kSuccess; if (setWindowCursorGrab(mode)) { + + if(mode==GHOST_kGrabDisable) + m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; + else if (bounds) { + m_cursorGrabBounds= *bounds; + } m_cursorGrab = mode; return GHOST_kSuccess; } @@ -111,6 +117,12 @@ GHOST_TSuccess GHOST_Window::setCursorGrab(GHOST_TGrabCursorMode mode) } } +GHOST_TSuccess GHOST_Window::getCursorGrabBounds(GHOST_Rect& bounds) +{ + bounds= m_cursorGrabBounds; + return (bounds.m_l==-1 && bounds.m_r==-1) ? GHOST_kFailure : GHOST_kSuccess; +} + GHOST_TSuccess GHOST_Window::setCursorShape(GHOST_TStandardCursor cursorShape) { if (setWindowCursorShape(cursorShape)) { diff --git a/intern/ghost/intern/GHOST_Window.h b/intern/ghost/intern/GHOST_Window.h index e66a3c2fd36..0986fc57430 100644 --- a/intern/ghost/intern/GHOST_Window.h +++ b/intern/ghost/intern/GHOST_Window.h @@ -171,10 +171,16 @@ public: /** * Sets the cursor grab. - * @param grab The new grab state of the cursor. + * @param mode The new grab state of the cursor. * @return Indication of success. */ - virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode); + virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds); + + /** + * Gets the cursor grab region, if unset the window is used. + * reset when grab is disabled. + */ + virtual GHOST_TSuccess getCursorGrabBounds(GHOST_Rect& bounds); /** * Sets the window "modified" status, indicating unsaved changes @@ -281,6 +287,9 @@ protected: /** Accumulated offset from m_cursorGrabInitPos. */ GHOST_TInt32 m_cursorGrabAccumPos[2]; + /** Wrap the cursor within this region. */ + GHOST_Rect m_cursorGrabBounds; + /** The current shape of the cursor */ GHOST_TStandardCursor m_cursorShape; diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 9914bad23c8..dba1be1b862 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -1421,6 +1421,7 @@ setWindowCursorGrab( /* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */ setCursorGrabAccum(0, 0); + m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; /* disable */ XUngrabPointer(m_display, CurrentTime); } diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c index aa1bc108176..96bdb9aa848 100644 --- a/source/blender/editors/animation/anim_filter.c +++ b/source/blender/editors/animation/anim_filter.c @@ -78,6 +78,7 @@ #include "BKE_animsys.h" #include "BKE_action.h" +#include "BKE_fcurve.h" #include "BKE_context.h" #include "BKE_global.h" #include "BKE_key.h" @@ -669,7 +670,7 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s * then free the MEM_alloc'd string */ if (rna_path) { - ale->key_data= list_find_fcurve(&act->curves, rna_path, 0); + ale->key_data= (void *)list_find_fcurve(&act->curves, rna_path, 0); MEM_freeN(rna_path); } } diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 018098b539b..29d84076533 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -3750,7 +3750,7 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s /* number editing */ if(state == BUTTON_STATE_NUM_EDITING) { if(ui_is_a_warp_but(but)) - WM_cursor_grab(CTX_wm_window(C), TRUE, TRUE); + WM_cursor_grab(CTX_wm_window(C), TRUE, TRUE, NULL); ui_numedit_begin(but, data); } else if(data->state == BUTTON_STATE_NUM_EDITING) { ui_numedit_end(but, data); diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 722b686218b..1acf3c8effa 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -52,6 +52,7 @@ static void rna_userdef_update(bContext *C, PointerRNA *ptr) WM_event_add_notifier(C, NC_WINDOW, NULL); } +#if 0 static void rna_userdef_lmb_select_set(PointerRNA *ptr,int value) { UserDef *userdef = (UserDef*)ptr->data; @@ -64,7 +65,6 @@ static void rna_userdef_lmb_select_set(PointerRNA *ptr,int value) userdef->flag &= ~USER_LMOUSESELECT; } -#if 0 static void rna_userdef_rmb_select_set(PointerRNA *ptr,int value) { rna_userdef_lmb_select_set(ptr, !value); diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index 82b244fa702..2189412783a 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -680,8 +680,9 @@ static void rna_def_windowmanager(BlenderRNA *brna) static void rna_def_keyconfig(BlenderRNA *brna) { StructRNA *srna; - FunctionRNA *func; - PropertyRNA *prop, *parm; + // FunctionRNA *func; + // PropertyRNA *parm; + PropertyRNA *prop; static EnumPropertyItem map_type_items[] = { {KMI_TYPE_KEYBOARD, "KEYBOARD", 0, "Keyboard", ""}, diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index d90d812d0bb..59f3bcd4edc 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -76,7 +76,7 @@ void WM_cursor_set (struct wmWindow *win, int curs); 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 wrap, int hide); +void WM_cursor_grab(struct wmWindow *win, int wrap, int hide, int *bounds); void WM_cursor_ungrab(struct wmWindow *win); void WM_timecursor (struct wmWindow *win, int nr); diff --git a/source/blender/windowmanager/intern/wm_cursors.c b/source/blender/windowmanager/intern/wm_cursors.c index 1d5b10f2583..5fe62157979 100644 --- a/source/blender/windowmanager/intern/wm_cursors.c +++ b/source/blender/windowmanager/intern/wm_cursors.c @@ -163,26 +163,27 @@ void WM_cursor_wait(int val) } } -void WM_cursor_grab(wmWindow *win, int wrap, int hide) +void WM_cursor_grab(wmWindow *win, int wrap, int hide, int *bounds) { /* Only grab cursor when not running debug. * It helps not to get a stuck WM when hitting a breakpoint * */ GHOST_TGrabCursorMode mode = GHOST_kGrabNormal; + int bounds_arr[4] = {-1, -1, -1, -1}; /* l/t/r/b */ if(hide) mode = GHOST_kGrabHide; else if(wrap) mode = GHOST_kGrabWrap; if ((G.f & G_DEBUG) == 0) if(win) - GHOST_SetCursorGrab(win->ghostwin, mode); + GHOST_SetCursorGrab(win->ghostwin, mode, bounds); } void WM_cursor_ungrab(wmWindow *win) { if ((G.f & G_DEBUG) == 0) if(win) - GHOST_SetCursorGrab(win->ghostwin, GHOST_kGrabDisable); + GHOST_SetCursorGrab(win->ghostwin, GHOST_kGrabDisable, NULL); } /* afer this you can call restore too */ diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 9e5f982880e..8eca0a1b416 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -463,8 +463,20 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, P else if(retval & OPERATOR_RUNNING_MODAL) { /* grab cursor during blocking modal ops (X11) */ if(ot->flag & OPTYPE_BLOCKING) { - int warp = (U.uiflag & USER_CONTINUOUS_MOUSE) && ((op->flag & OP_GRAB_POINTER) || (ot->flag & OPTYPE_GRAB_POINTER)); - WM_cursor_grab(CTX_wm_window(C), warp, FALSE); + int bounds[4] = {-1,-1,-1,-1}; + int wrap = (U.uiflag & USER_CONTINUOUS_MOUSE) && ((op->flag & OP_GRAB_POINTER) || (ot->flag & OPTYPE_GRAB_POINTER)); + + if(wrap) { + ARegion *ar= CTX_wm_region(C); + if(ar) { + bounds[0]= ar->winrct.xmin; + bounds[1]= ar->winrct.ymax; + bounds[2]= ar->winrct.xmax; + bounds[3]= ar->winrct.ymin; + } + } + + WM_cursor_grab(CTX_wm_window(C), wrap, FALSE, bounds); } } else |