[Bf-blender-cvs] [f88ea202858] master: WM: move operator handler to it's own type

Campbell Barton noreply at git.blender.org
Tue Feb 19 06:26:20 CET 2019


Commit: f88ea20285891d516c91c976239f95994f73abf3
Author: Campbell Barton
Date:   Tue Feb 19 15:18:56 2019 +1100
Branches: master
https://developer.blender.org/rBf88ea20285891d516c91c976239f95994f73abf3

WM: move operator handler to it's own type

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

M	source/blender/editors/space_script/script_edit.c
M	source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
M	source/blender/windowmanager/gizmo/wm_gizmo_wmapi.h
M	source/blender/windowmanager/intern/wm.c
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_files.c
M	source/blender/windowmanager/intern/wm_operator_type.c
M	source/blender/windowmanager/wm_event_system.h

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

diff --git a/source/blender/editors/space_script/script_edit.c b/source/blender/editors/space_script/script_edit.c
index 9b5f3d634c9..4b5cd6b7166 100644
--- a/source/blender/editors/space_script/script_edit.c
+++ b/source/blender/editors/space_script/script_edit.c
@@ -26,6 +26,7 @@
 #include <stdio.h>
 
 #include "BLI_utildefines.h"
+#include "BLI_listbase.h"
 
 #include "BKE_context.h"
 #include "BKE_report.h"
@@ -88,13 +89,14 @@ static bool script_test_modal_operators(bContext *C)
 	wm = CTX_wm_manager(C);
 
 	for (win = wm->windows.first; win; win = win->next) {
-		wmEventHandler *handler;
-
-		for (handler = win->modalhandlers.first; handler; handler = handler->next) {
-			if (handler->op) {
-				wmOperatorType *ot = handler->op->type;
-				if (ot->ext.srna) {
-					return true;
+		LISTBASE_FOREACH (wmEventHandler *, handler_base, &win->modalhandlers) {
+			if (handler_base->type == WM_HANDLER_TYPE_OP) {
+				wmEventHandler_Op *handler = (wmEventHandler_Op *)handler_base;
+				if (handler->op != NULL) {
+					wmOperatorType *ot = handler->op->type;
+					if (ot->ext.srna) {
+						return true;
+					}
 				}
 			}
 		}
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
index 8b6be7bb624..b1e35943b6c 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
@@ -690,21 +690,21 @@ void WM_gizmomap_add_handlers(ARegion *ar, wmGizmoMap *gzmap)
 }
 
 void wm_gizmomaps_handled_modal_update(
-        bContext *C, wmEvent *event, wmEventHandler *handler)
+        bContext *C, wmEvent *event, wmEventHandler_Op *handler)
 {
 	const bool modal_running = (handler->op != NULL);
 
 	/* happens on render or when joining areas */
-	if (!handler->op_region || !handler->op_region->gizmo_map) {
+	if (!handler->context.region || !handler->context.region->gizmo_map) {
 		return;
 	}
 
-	wmGizmoMap *gzmap = handler->op_region->gizmo_map;
+	wmGizmoMap *gzmap = handler->context.region->gizmo_map;
 	wmGizmo *gz = wm_gizmomap_modal_get(gzmap);
 	ScrArea *area = CTX_wm_area(C);
 	ARegion *region = CTX_wm_region(C);
 
-	wm_gizmomap_handler_context(C, handler);
+	wm_gizmomap_handler_context_op(C, handler);
 
 	/* regular update for running operator */
 	if (modal_running) {
@@ -830,41 +830,41 @@ bool WM_gizmomap_select_all(bContext *C, wmGizmoMap *gzmap, const int action)
  * Prepare context for gizmo handling (but only if area/region is
  * part of screen). Version of #wm_handler_op_context for gizmos.
  */
-void wm_gizmomap_handler_context(bContext *C, wmEventHandler *handler)
+void wm_gizmomap_handler_context_op(bContext *C, wmEventHandler_Op *handler)
 {
 	bScreen *screen = CTX_wm_screen(C);
 
 	if (screen) {
-		if (handler->op_area == NULL) {
-			/* do nothing in this context */
+		ScrArea *sa;
+
+		for (sa = screen->areabase.first; sa; sa = sa->next) {
+			if (sa == handler->context.area) {
+				break;
+			}
+		}
+		if (sa == NULL) {
+			/* when changing screen layouts with running modal handlers (like render display), this
+			 * is not an error to print */
+			printf("internal error: modal gizmo-map handler has invalid area\n");
 		}
 		else {
-			ScrArea *sa;
-
-			for (sa = screen->areabase.first; sa; sa = sa->next)
-				if (sa == handler->op_area)
+			ARegion *ar;
+			CTX_wm_area_set(C, sa);
+			for (ar = sa->regionbase.first; ar; ar = ar->next)
+				if (ar == handler->context.region)
 					break;
-			if (sa == NULL) {
-				/* when changing screen layouts with running modal handlers (like render display), this
-				 * is not an error to print */
-				if (handler->type != WM_HANDLER_TYPE_GIZMO) {
-					printf("internal error: modal gizmo-map handler has invalid area\n");
-				}
-			}
-			else {
-				ARegion *ar;
-				CTX_wm_area_set(C, sa);
-				for (ar = sa->regionbase.first; ar; ar = ar->next)
-					if (ar == handler->op_region)
-						break;
-				/* XXX no warning print here, after full-area and back regions are remade */
-				if (ar)
-					CTX_wm_region_set(C, ar);
-			}
+			/* XXX no warning print here, after full-area and back regions are remade */
+			if (ar)
+				CTX_wm_region_set(C, ar);
 		}
 	}
 }
 
+void wm_gizmomap_handler_context_gizmo(bContext *UNUSED(C), wmEventHandler_Gizmo *UNUSED(handler))
+{
+	/* pass */
+}
+
 bool WM_gizmomap_cursor_set(const wmGizmoMap *gzmap, wmWindow *win)
 {
 	wmGizmo *gz = gzmap->gzmap_context.highlight;
diff --git a/source/blender/windowmanager/gizmo/wm_gizmo_wmapi.h b/source/blender/windowmanager/gizmo/wm_gizmo_wmapi.h
index 4a0e8f21bcb..c7a6b816dd6 100644
--- a/source/blender/windowmanager/gizmo/wm_gizmo_wmapi.h
+++ b/source/blender/windowmanager/gizmo/wm_gizmo_wmapi.h
@@ -33,6 +33,8 @@
 #define __WM_GIZMO_WMAPI_H__
 
 struct wmEventHandler;
+struct wmEventHandler_Gizmo;
+struct wmEventHandler_Op;
 struct wmGizmoMap;
 struct wmOperator;
 struct wmOperatorType;
@@ -65,8 +67,9 @@ void wm_gizmomap_remove(struct wmGizmoMap *gzmap);
 void wm_gizmos_keymap(struct wmKeyConfig *keyconf);
 
 void wm_gizmomaps_handled_modal_update(
-        bContext *C, struct wmEvent *event, struct wmEventHandler *handler);
-void wm_gizmomap_handler_context(bContext *C, struct wmEventHandler *handler);
+        bContext *C, struct wmEvent *event, struct wmEventHandler_Op *handler);
+void wm_gizmomap_handler_context_op(bContext *C, struct wmEventHandler_Op *handler);
+void wm_gizmomap_handler_context_gizmo(bContext *C, struct wmEventHandler_Gizmo *handler);
 
 struct wmGizmo *wm_gizmomap_highlight_find(
         struct wmGizmoMap *gzmap, bContext *C, const struct wmEvent *event,
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index ce309284ff0..72b906ce853 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -197,17 +197,17 @@ void WM_operator_handlers_clear(wmWindowManager *wm, wmOperatorType *ot)
 	wmWindow *win;
 	for (win = wm->windows.first; win; win = win->next) {
 		ListBase *lb[2] = {&win->handlers, &win->modalhandlers};
-		wmEventHandler *handler;
-		int i;
-
-		for (i = 0; i < 2; i++) {
-			for (handler = lb[i]->first; handler; handler = handler->next) {
-				if (handler->op && handler->op->type == ot) {
-					/* don't run op->cancel because it needs the context,
-					 * assume whoever unregisters the operator will cleanup */
-					handler->flag |= WM_HANDLER_DO_FREE;
-					WM_operator_free(handler->op);
-					handler->op = NULL;
+		for (int i = 0; i < ARRAY_SIZE(lb); i++) {
+			for (wmEventHandler *handler_base = lb[i]->first; handler_base; handler_base = handler_base->next) {
+				if (handler_base->type == WM_HANDLER_TYPE_OP) {
+					wmEventHandler_Op *handler = (wmEventHandler_Op *)handler_base;
+					if (handler->op && handler->op->type == ot) {
+						/* don't run op->cancel because it needs the context,
+						 * assume whoever unregisters the operator will cleanup */
+						handler->base.flag |= WM_HANDLER_DO_FREE;
+						WM_operator_free(handler->op);
+						handler->op = NULL;
+					}
 				}
 			}
 		}
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index c47247b794d..95dcae9ef48 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1681,19 +1681,19 @@ void wm_event_free_handler(wmEventHandler *handler)
 }
 
 /* only set context when area/region is part of screen */
-static void wm_handler_op_context(bContext *C, wmEventHandler *handler, const wmEvent *event)
+static void wm_handler_op_context(bContext *C, wmEventHandler_Op *handler, const wmEvent *event)
 {
 	wmWindow *win = CTX_wm_window(C);
 	bScreen *screen = CTX_wm_screen(C);
 
 	if (screen && handler->op) {
-		if (handler->op_area == NULL)
+		if (handler->context.area == NULL)
 			CTX_wm_area_set(C, NULL);
 		else {
 			ScrArea *sa = NULL;
 
 			ED_screen_areas_iter(win, screen, sa_iter) {
-				if (sa_iter == handler->op_area) {
+				if (sa_iter == handler->context.area) {
 					sa = sa_iter;
 					break;
 				}
@@ -1712,9 +1712,9 @@ static void wm_handler_op_context(bContext *C, wmEventHandler *handler, const wm
 				CTX_wm_area_set(C, sa);
 
 				if (op && (op->flag & OP_IS_MODAL_CURSOR_REGION)) {
-					ar = BKE_area_find_region_xy(sa, handler->op_region_type, event->x, event->y);
+					ar = BKE_area_find_region_xy(sa, handler->context.region_type, event->x, event->y);
 					if (ar) {
-						handler->op_region = ar;
+						handler->context.region = ar;
 					}
 				}
 				else {
@@ -1723,7 +1723,7 @@ static void wm_handler_op_context(bContext *C, wmEventHandler *handler, const wm
 
 				if (ar == NULL) {
 					for (ar = sa->regionbase.first; ar; ar = ar->next) {
-						if (ar == handler->op_region) {
+						if (ar == handler->context.region) {
 							break;
 						}
 					}
@@ -1745,28 +1745,33 @@ void WM_event_remove_handlers(bContext *C, ListBase *handlers)
 
 	/* C is zero on freeing database, modal handlers then already were freed */
 	while ((handler_base = BLI_pophead(handlers))) {
-		if (handler_base->op) {
-			wmWindow *win = CTX_wm_window(C);
-			if (handler_base->op->type->cancel) {
-				ScrArea *area = CTX_wm_area(C);
-				ARegion *region = CTX_wm_region(C);
+		if (handler_base->type == WM_HANDLER_TYPE_OP) {
+			wmEventHandler_Op *handler = (wmEventHandler_Op *)handler_base;
+			if (handler->op) {
+				wmWindow *win = CTX_wm_window(C);
+				if (handler->op->type->cancel) {
+					ScrArea *area = CTX_wm_area(C);
+					ARegion *region = CTX_wm_region(C);
 
-				wm_handler_op_context(C, handler_base, win->eventstate);
+					wm_handler_op_context(C, handler, win->eventstate);
 
-				if (handler_base->op->type->flag & OPTYPE_UNDO)
-					wm->op_undo_depth++;
+					if (handler->op->type->flag & OPTYPE_UNDO) {
+						wm->op_undo_depth++;
+					}
 
-				handler_base->op->type->cancel(C, handler_base->op);
+					handler->op->type->cancel(C, handler->op);
 
-				if (handler_base->op->type->flag & OPTYPE_UNDO)
-					wm->op_undo_depth--;
+					if (handler->op->type->flag & OPTYPE_UNDO) {
+						wm->op_undo_depth--;
+					}
 
-				CTX_wm_area_set(C, area);
-				CTX_wm_r

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list