Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / undo / ed_undo.c
index 279f3e7cf38559d1163b5b24b751a9eae6815a07..515e96db25d35f50e6d6304746123df42754f3e1 100644 (file)
@@ -112,7 +112,6 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
 {
        CLOG_INFO(&LOG, 1, "name='%s', step=%d", undoname, step);
        wmWindowManager *wm = CTX_wm_manager(C);
-       wmWindow *win = CTX_wm_window(C);
        Scene *scene = CTX_data_scene(C);
        ScrArea *sa = CTX_wm_area(C);
 
@@ -199,10 +198,6 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
        Main *bmain = CTX_data_main(C);
        WM_toolsystem_refresh_screen_all(bmain);
 
-       if (win) {
-               win->addmousemove = true;
-       }
-
        return OPERATOR_FINISHED;
 }
 
@@ -280,7 +275,12 @@ static int ed_undo_exec(bContext *C, wmOperator *UNUSED(op))
 {
        /* "last operator" should disappear, later we can tie this with undo stack nicer */
        WM_operator_stack_clear(CTX_wm_manager(C));
-       return ed_undo_step(C, 1, NULL);
+       int ret = ed_undo_step(C, 1, NULL);
+       if (ret & OPERATOR_FINISHED) {
+               /* Keep button under the cursor active. */
+               WM_event_add_mousemove(C);
+       }
+       return ret;
 }
 
 static int ed_undo_push_exec(bContext *C, wmOperator *op)
@@ -293,14 +293,24 @@ static int ed_undo_push_exec(bContext *C, wmOperator *op)
 
 static int ed_redo_exec(bContext *C, wmOperator *UNUSED(op))
 {
-       return ed_undo_step(C, -1, NULL);
+       int ret = ed_undo_step(C, -1, NULL);
+       if (ret & OPERATOR_FINISHED) {
+               /* Keep button under the cursor active. */
+               WM_event_add_mousemove(C);
+       }
+       return ret;
 }
 
 static int ed_undo_redo_exec(bContext *C, wmOperator *UNUSED(op))
 {
        wmOperator *last_op = WM_operator_last_redo(C);
-       const int ret = ED_undo_operator_repeat(C, last_op);
-       return ret ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+       int ret = ED_undo_operator_repeat(C, last_op);
+       ret = ret ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+       if (ret & OPERATOR_FINISHED) {
+               /* Keep button under the cursor active. */
+               WM_event_add_mousemove(C);
+       }
+       return ret;
 }
 
 static bool ed_undo_redo_poll(bContext *C)