[Bf-blender-cvs] [1adfabc8c62] blender2.8: WM: revert part of Top-Bar inclusion

Campbell Barton noreply at git.blender.org
Thu Jun 14 21:59:17 CEST 2018


Commit: 1adfabc8c62ed3f067d209511ce3d868e76c9bbd
Author: Campbell Barton
Date:   Thu Jun 14 21:55:40 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB1adfabc8c62ed3f067d209511ce3d868e76c9bbd

WM: revert part of Top-Bar inclusion

This removes OperatorRepeatContextHandle, from 5f6c45498c92b
since we now only have redo in the area an operator is executed in.

These values could be invalid and crashed in some cases.

===================================================================

M	source/blender/editors/include/ED_undo.h
M	source/blender/editors/space_topbar/space_topbar.c
M	source/blender/editors/undo/ed_undo.c
M	source/blender/makesdna/DNA_windowmanager_types.h
M	source/blender/windowmanager/intern/wm.c
M	source/blender/windowmanager/intern/wm_event_system.c

===================================================================

diff --git a/source/blender/editors/include/ED_undo.h b/source/blender/editors/include/ED_undo.h
index 5103ac97361..37744e7eb0f 100644
--- a/source/blender/editors/include/ED_undo.h
+++ b/source/blender/editors/include/ED_undo.h
@@ -52,14 +52,6 @@ int     ED_undo_operator_repeat(struct bContext *C, struct wmOperator *op);
 void    ED_undo_operator_repeat_cb(struct bContext *C, void *arg_op, void *arg_unused);
 void    ED_undo_operator_repeat_cb_evt(struct bContext *C, void *arg_op, int arg_unused);
 
-/* Context sanity helpers for operator repeat. */
-typedef struct OperatorRepeatContextHandle OperatorRepeatContextHandle;
-
-const OperatorRepeatContextHandle *ED_operator_repeat_prepare_context(
-        struct bContext *C, struct wmOperator *op) ATTR_WARN_UNUSED_RESULT;
-void ED_operator_repeat_reset_context(
-        struct bContext *C, const OperatorRepeatContextHandle *context_info);
-
 bool    ED_undo_is_valid(const struct bContext *C, const char *undoname);
 
 struct UndoStack *ED_undo_stack_get(void);
diff --git a/source/blender/editors/space_topbar/space_topbar.c b/source/blender/editors/space_topbar/space_topbar.c
index 4342fa87f89..c7ef6591c0d 100644
--- a/source/blender/editors/space_topbar/space_topbar.c
+++ b/source/blender/editors/space_topbar/space_topbar.c
@@ -57,9 +57,6 @@
 #include "WM_types.h"
 #include "WM_message.h"
 
-
-void topbar_panels_register(ARegionType *art);
-
 /* ******************** default callbacks for topbar space ***************** */
 
 static SpaceLink *topbar_new(const ScrArea *UNUSED(area), const Scene *UNUSED(scene))
@@ -277,64 +274,9 @@ void ED_spacetype_topbar(void)
 	art->layout = ED_region_header_layout;
 	art->draw = ED_region_header_draw;
 
-	/* For popovers. */
-	topbar_panels_register(art);
-
 	BLI_addhead(&st->regiontypes, art);
 
 	recent_files_menu_register();
 
 	BKE_spacetype_register(st);
 }
-
-
-/* -------------------------------------------------------------------- */
-/** \name Redo Panel
- * \{ */
-
-static int topbar_panel_operator_redo_poll(const bContext *C, PanelType *UNUSED(pt))
-{
-	wmOperator *op = WM_operator_last_redo(C);
-	if (op == NULL) {
-		return false;
-	}
-
-	bool success = false;
-	if (!WM_operator_check_ui_empty(op->type)) {
-		const OperatorRepeatContextHandle *context_info;
-		context_info = ED_operator_repeat_prepare_context((bContext *)C, op);
-		success = WM_operator_poll((bContext *)C, op->type);
-		ED_operator_repeat_reset_context((bContext *)C, context_info);
-	}
-	return success;
-}
-
-static void topbar_panel_operator_redo(const bContext *C, Panel *pa)
-{
-	wmOperator *op = WM_operator_last_redo(C);
-	if (op == NULL) {
-		return;
-	}
-	if (!WM_operator_check_ui_enabled(C, op->type->name)) {
-		uiLayoutSetEnabled(pa->layout, false);
-	}
-	uiLayout *col = uiLayoutColumn(pa->layout, false);
-	uiTemplateOperatorRedoProperties(col, C);
-}
-
-void topbar_panels_register(ARegionType *art)
-{
-	PanelType *pt;
-
-	pt = MEM_callocN(sizeof(PanelType), __func__);
-	strcpy(pt->idname, "TOPBAR_PT_redo");
-	strcpy(pt->label, N_("Redo"));
-	strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
-	pt->draw = topbar_panel_operator_redo;
-	pt->poll = topbar_panel_operator_redo_poll;
-	pt->space_type = SPACE_TOPBAR;
-	pt->region_type = RGN_TYPE_HEADER;
-	BLI_addtail(&art->paneltypes, pt);
-}
-
-/** \} */
diff --git a/source/blender/editors/undo/ed_undo.c b/source/blender/editors/undo/ed_undo.c
index 6731a0d2e5b..102065f5295 100644
--- a/source/blender/editors/undo/ed_undo.c
+++ b/source/blender/editors/undo/ed_undo.c
@@ -302,36 +302,6 @@ void ED_OT_undo_redo(wmOperatorType *ot)
 
 /** \} */
 
-struct OperatorRepeatContextHandle {
-	ScrArea *restore_area;
-	ARegion *restore_region;
-};
-
-/**
- * Resets the context to the state \a op was executed in (or at least, was in when registering).
- * #ED_operator_repeat_reset_context should be called when done repeating!
- */
-const OperatorRepeatContextHandle *ED_operator_repeat_prepare_context(bContext *C, wmOperator *op)
-{
-	static OperatorRepeatContextHandle context_info;
-
-	context_info.restore_area = CTX_wm_area(C);
-	context_info.restore_region = CTX_wm_region(C);
-
-	CTX_wm_area_set(C, op->execution_area);
-	CTX_wm_region_set(C, op->execution_region);
-
-	return &context_info;
-}
-/**
- * Resets context to the old state from before #ED_operator_repeat_prepare_context was called.
- */
-void ED_operator_repeat_reset_context(bContext *C, const OperatorRepeatContextHandle *context_info)
-{
-	CTX_wm_area_set(C, context_info->restore_area);
-	CTX_wm_region_set(C, context_info->restore_region);
-}
-
 /* -------------------------------------------------------------------- */
 /** \name Operator Repeat
  * \{ */
@@ -346,8 +316,13 @@ int ED_undo_operator_repeat(bContext *C, wmOperator *op)
 		wmWindowManager *wm = CTX_wm_manager(C);
 		struct Scene *scene = CTX_data_scene(C);
 
-		const OperatorRepeatContextHandle *context_info;
-		context_info = ED_operator_repeat_prepare_context(C, op);
+		/* keep in sync with logic in view3d_panel_operator_redo() */
+		ARegion *ar_orig = CTX_wm_region(C);
+		ARegion *ar_win = BKE_area_find_region_active_win(CTX_wm_area(C));
+		
+		if (ar_win) {
+			CTX_wm_region_set(C, ar_win);
+		}
 
 		if ((WM_operator_repeat_check(C, op)) &&
 		    (WM_operator_poll(C, op->type)) &&
@@ -393,7 +368,8 @@ int ED_undo_operator_repeat(bContext *C, wmOperator *op)
 			}
 		}
 
-		ED_operator_repeat_reset_context(C, context_info);
+		/* set region back */
+		CTX_wm_region_set(C, ar_orig);
 	}
 	else {
 		CLOG_WARN(&LOG, "called with NULL 'op'");
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 6d5d2c380e2..a0c764d3771 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -377,11 +377,6 @@ typedef struct wmOperator {
 	struct wmOperator *opm;       /* current running macro, not saved */
 	struct uiLayout *layout;      /* runtime for drawing */
 	short flag, pad[3];
-
-	/* Screen context the operator was finished in. It gets temporarily
-	 * restored during operator repeat. Only set for registered operators. */
-	struct ScrArea *execution_area;
-	struct ARegion *execution_region;
 } wmOperator;
 
 /* operator type return flags: exec(), invoke() modal(), return values */
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 6a42bf26a97..7eeea0f64ee 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -165,9 +165,6 @@ void wm_operator_register(bContext *C, wmOperator *op)
 	wmWindowManager *wm = CTX_wm_manager(C);
 	int tot = 0;
 
-	op->execution_area = CTX_wm_area(C);
-	op->execution_region = CTX_wm_region(C);
-
 	BLI_addtail(&wm->operators, op);
 
 	/* only count registered operators */
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 5fd7c3a24c0..cd56eac84d1 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1007,14 +1007,7 @@ int WM_operator_call_notest(bContext *C, wmOperator *op)
  */
 int WM_operator_repeat(bContext *C, wmOperator *op)
 {
-	const OperatorRepeatContextHandle *context_info;
-	int retval;
-
-	context_info = ED_operator_repeat_prepare_context(C, op);
-	retval = wm_operator_exec(C, op, true, true);
-	ED_operator_repeat_reset_context(C, context_info);
-
-	return retval;
+	return wm_operator_exec(C, op, true, true);
 }
 /**
  * \return true if #WM_operator_repeat can run



More information about the Bf-blender-cvs mailing list