[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