WM: move gizmo handler to it's own type
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user