WM: don't set repeat flag w/ interactive repeat
authorCampbell Barton <ideasman42@gmail.com>
Fri, 25 Jan 2019 00:29:41 +0000 (11:29 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 25 Jan 2019 00:29:41 +0000 (11:29 +1100)
This allows operators to distinguish between redo and executing
repeat last operator, needed for T60777 fix.

source/blender/editors/screen/screen_ops.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_event_system.c

index 6d332f8e427283b56642df8f40e848c23727bdd0..8736664d23c506c20679f6c13c2b2392a0c70fa5 100644 (file)
@@ -3359,7 +3359,7 @@ static int repeat_last_exec(bContext *C, wmOperator *UNUSED(op))
 
        if (lastop) {
                WM_operator_free_all_after(wm, lastop);
-               WM_operator_repeat(C, lastop);
+               WM_operator_repeat_interactive(C, lastop);
        }
 
        return OPERATOR_CANCELLED;
index 4f73e731457db3b996c6d3093f451a9446173d1f..bfd555abb9a3bef5a8f235e0ad2769df4ea612e3 100644 (file)
@@ -322,6 +322,7 @@ int         WM_operator_call_ex(struct bContext *C, struct wmOperator *op, const
 int                    WM_operator_call                (struct bContext *C, struct wmOperator *op);
 int                    WM_operator_call_notest(struct bContext *C, struct wmOperator *op);
 int                    WM_operator_repeat              (struct bContext *C, struct wmOperator *op);
+int                    WM_operator_repeat_interactive(struct bContext *C, struct wmOperator *op);
 bool        WM_operator_repeat_check(const struct bContext *C, struct wmOperator *op);
 bool        WM_operator_is_repeat(const struct bContext *C, const struct wmOperator *op);
 int         WM_operator_name_call_ptr(struct bContext *C, struct wmOperatorType *ot, short context, struct PointerRNA *properties);
index 0362f393bdb907920279ce15687c15cee8e6b92f..64b3ca6a3008fee13131dadc4a73892c437624e1 100644 (file)
@@ -940,7 +940,9 @@ static void wm_operator_finished(bContext *C, wmOperator *op, const bool repeat,
 }
 
 /* if repeat is true, it doesn't register again, nor does it free */
-static int wm_operator_exec(bContext *C, wmOperator *op, const bool repeat, const bool store)
+static int wm_operator_exec(
+        bContext *C, wmOperator *op,
+        const bool repeat, const bool use_repeat_op_flag, const bool store)
 {
        wmWindowManager *wm = CTX_wm_manager(C);
        int retval = OPERATOR_CANCELLED;
@@ -958,12 +960,12 @@ static int wm_operator_exec(bContext *C, wmOperator *op, const bool repeat, cons
                        wm->op_undo_depth++;
                }
 
-               if (repeat) {
+               if (repeat && use_repeat_op_flag) {
                        op->flag |= OP_IS_REPEAT;
                }
                retval = op->type->exec(C, op);
                OPERATOR_RETVAL_CHECK(retval);
-               if (repeat) {
+               if (repeat && use_repeat_op_flag) {
                        op->flag &= ~OP_IS_REPEAT;
                }
 
@@ -1015,7 +1017,7 @@ static int wm_operator_exec_notest(bContext *C, wmOperator *op)
 int WM_operator_call_ex(bContext *C, wmOperator *op,
                         const bool store)
 {
-       return wm_operator_exec(C, op, false, store);
+       return wm_operator_exec(C, op, false, false, store);
 }
 
 int WM_operator_call(bContext *C, wmOperator *op)
@@ -1038,7 +1040,11 @@ int WM_operator_call_notest(bContext *C, wmOperator *op)
  */
 int WM_operator_repeat(bContext *C, wmOperator *op)
 {
-       return wm_operator_exec(C, op, true, true);
+       return wm_operator_exec(C, op, true, true, true);
+}
+int WM_operator_repeat_interactive(bContext *C, wmOperator *op)
+{
+       return wm_operator_exec(C, op, true, false, true);
 }
 /**
  * \return true if #WM_operator_repeat can run