diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-02-19 04:59:05 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-02-19 08:17:21 +0300 |
commit | 55ac296358a45fd11700df328fb47f061c8aca4f (patch) | |
tree | 0df91a4862652a917bcf354d9df63ce41cd5e4cf /source | |
parent | 0767b63f1b81c664a18603f056d3952357d84484 (diff) |
WM: move gizmo handler to it's own type
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c | 18 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 12 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_system.h | 20 |
3 files changed, 31 insertions, 19 deletions
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c index fbee3c56c00..8b6be7bb624 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c @@ -673,16 +673,17 @@ wmGizmo *wm_gizmomap_highlight_find( void WM_gizmomap_add_handlers(ARegion *ar, wmGizmoMap *gzmap) { - wmEventHandler *handler; - - for (handler = ar->handlers.first; handler; handler = handler->next) { - if (handler->gizmo_map == gzmap) { - return; + LISTBASE_FOREACH (wmEventHandler *, handler_base, &ar->handlers) { + if (handler_base->type == WM_HANDLER_TYPE_GIZMO) { + wmEventHandler_Gizmo *handler = (wmEventHandler_Gizmo *)handler_base; + if (handler->gizmo_map == gzmap) { + return; + } } } - handler = MEM_callocN(sizeof(wmEventHandler), "gizmo handler"); - + wmEventHandler_Gizmo *handler = MEM_callocN(sizeof(*handler), __func__); + handler->base.type = WM_HANDLER_TYPE_GIZMO; BLI_assert(gzmap == ar->gizmo_map); handler->gizmo_map = gzmap; BLI_addtail(&ar->handlers, handler); @@ -846,8 +847,9 @@ void wm_gizmomap_handler_context(bContext *C, wmEventHandler *handler) if (sa == NULL) { /* when changing screen layouts with running modal handlers (like render display), this * is not an error to print */ - if (handler->gizmo_map == NULL) + if (handler->type != WM_HANDLER_TYPE_GIZMO) { printf("internal error: modal gizmo-map handler has invalid area\n"); + } } else { ARegion *ar; diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index a307cd5d0f0..d40a9be9e9e 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2443,14 +2443,16 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers } } } - else if (handler->gizmo_map) { + else if (handler->type == WM_HANDLER_TYPE_GIZMO) { + wmEventHandler_Gizmo *handler_gz = (wmEventHandler_Gizmo *)handler; ScrArea *area = CTX_wm_area(C); ARegion *region = CTX_wm_region(C); - wmGizmoMap *gzmap = handler->gizmo_map; + wmGizmoMap *gzmap = handler_gz->gizmo_map; + BLI_assert(gzmap != NULL); wmGizmo *gz = wm_gizmomap_highlight_get(gzmap); - if (region->gizmo_map != handler->gizmo_map) { - WM_gizmomap_tag_refresh(handler->gizmo_map); + if (region->gizmo_map != handler_gz->gizmo_map) { + WM_gizmomap_tag_refresh(handler_gz->gizmo_map); } wm_gizmomap_handler_context(C, handler); @@ -2889,7 +2891,7 @@ static void wm_event_temp_tool_handler_apply( /* Handle widgets first. */ wmEventHandler *handler_last = ar->handlers.last; - while (handler_last && handler_last->gizmo_map == NULL) { + while (handler_last && handler_last->type != WM_HANDLER_TYPE_GIZMO) { handler_last = handler_last->prev; } /* Head of list or after last gizmo. */ diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index 8b245d05612..e585d40ebb9 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -40,9 +40,16 @@ struct wmEventHandler_KeymapFn { void *user_data; }; +/** Custom types for handlers, for signaling, freeing */ +enum eWM_EventHandlerType { + WM_HANDLER_TYPE_DEFAULT, + WM_HANDLER_TYPE_GIZMO, +}; + typedef struct wmEventHandler { struct wmEventHandler *next, *prev; + enum eWM_EventHandlerType type; char flag; /* WM_HANDLER_BLOCKING, ... */ /* keymap handler */ @@ -70,14 +77,15 @@ typedef struct wmEventHandler { /* drop box handler */ ListBase *dropboxes; - /* gizmo handler */ - struct wmGizmoMap *gizmo_map; } wmEventHandler; -/* custom types for handlers, for signaling, freeing */ -enum { - WM_HANDLER_DEFAULT, -}; +/** #WM_HANDLER_TYPE_GIZMO */ +typedef struct wmEventHandler_Gizmo { + wmEventHandler base; + + /** Gizmo handler (never NULL). */ + struct wmGizmoMap *gizmo_map; +} wmEventHandler_Gizmo; /* wm_event_system.c */ void wm_event_free_all (wmWindow *win); |