diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-02-28 15:39:13 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-02-28 15:39:13 +0400 |
commit | 2398e074d308d7483472c9f396c4b1a2cb6dbca8 (patch) | |
tree | 7e4b7ea5ccf04041b66bf3296d495ce6e49f318b /source | |
parent | 4f4e45540daf211a3531a81c464fa3a389ea8ede (diff) |
fix [#33466] alt + mouse wheel
Alt+Mouse Wheel events depended on the button under the mouse being active, else it would change the current frame.
Button re-activation wasn't 100% reliable since it depends on fake mousemove events.
Now keep button active when its executed if the mouse stays over it.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 37268f25993..8c3e83894ef 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -6145,14 +6145,12 @@ static void ui_handle_button_activate(bContext *C, ARegion *ar, uiBut *but, uiBu static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but) { - uiHandleButtonData *data; + uiHandleButtonData *data = but->active; + const uiButtonActivateType state_orig = data->state; uiBlock *block; ARegion *ar; - uiBut *postbut; - uiButtonActivateType posttype; int retval; - data = but->active; block = but->block; ar = data->region; @@ -6304,14 +6302,28 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but) } if (data->state == BUTTON_STATE_EXIT) { - postbut = data->postbut; - posttype = data->posttype; + uiBut *post_but = data->postbut; + uiButtonActivateType post_type = data->posttype; - button_activate_exit(C, but, data, (postbut == NULL), false); + button_activate_exit(C, but, data, (post_but == NULL), false); /* for jumping to the next button with tab while text editing */ - if (postbut) - button_activate_init(C, ar, postbut, posttype); + if (post_but) { + button_activate_init(C, ar, post_but, post_type); + } + else { + /* XXX issue is because WM_event_add_mousemove(C) is a bad hack and not reliable, + *if that gets coded better this bypass can go away too. + * + * This is needed to make sure if a button was active, + * it stays active while the mouse is over it. + * This avoids adding mousemoves, see: [#33466] */ + if (ELEM(state_orig, BUTTON_ACTIVATE, BUTTON_ACTIVATE_OVER)) { + if (ui_but_find_mouse_over(ar, event->x, event->y) == but) { + button_activate_init(C, ar, but, state_orig); + } + } + } } return retval; |