diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-02-19 07:32:01 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-02-19 08:17:21 +0300 |
commit | d718338828c19f6fa1bbaa0530dcc0fbc72e46c4 (patch) | |
tree | 0d17fff4d93256a18507b253502c125dd45f77d3 /source/blender | |
parent | f88ea20285891d516c91c976239f95994f73abf3 (diff) |
WM: move dropbox handler to it's own type
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/windowmanager/intern/wm_dragdrop.c | 21 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 23 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_system.h | 12 |
3 files changed, 33 insertions, 23 deletions
diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c index 714312ef593..7a066ef4282 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.c +++ b/source/blender/windowmanager/intern/wm_dragdrop.c @@ -194,16 +194,17 @@ void WM_drag_free_list(struct ListBase *lb) static const char *dropbox_active(bContext *C, ListBase *handlers, wmDrag *drag, const wmEvent *event) { - wmEventHandler *handler = handlers->first; - for (; handler; handler = handler->next) { - if (handler->dropboxes) { - wmDropBox *drop = handler->dropboxes->first; - for (; drop; drop = drop->next) { - const char *tooltip = NULL; - if (drop->poll(C, drag, event, &tooltip)) { - /* XXX Doing translation here might not be ideal, but later we have no more - * access to ot (and hence op context)... */ - return (tooltip) ? tooltip : RNA_struct_ui_name(drop->ot->srna); + for (wmEventHandler *handler_base = handlers->first; handler_base; handler_base = handler_base->next) { + if (handler_base->type == WM_HANDLER_TYPE_DROPBOX) { + wmEventHandler_Dropbox *handler = (wmEventHandler_Dropbox *)handler_base; + if (handler->dropboxes) { + for (wmDropBox *drop = handler->dropboxes->first; drop; drop = drop->next) { + const char *tooltip = NULL; + if (drop->poll(C, drag, event, &tooltip)) { + /* XXX Doing translation here might not be ideal, but later we have no more + * access to ot (and hence op context)... */ + return (tooltip) ? tooltip : RNA_struct_ui_name(drop->ot->srna); + } } } } diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 95dcae9ef48..41f11321a02 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2432,9 +2432,10 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers action |= wm_handler_fileselect_call(C, handlers, handler_op, event); } } - else if (handler->dropboxes) { + else if (handler->type == WM_HANDLER_TYPE_DROPBOX) { + wmEventHandler_Dropbox *handler_db = (wmEventHandler_Dropbox *)handler; if (!wm->is_interface_locked && event->type == EVT_DROP) { - wmDropBox *drop = handler->dropboxes->first; + wmDropBox *drop = handler_db->dropboxes->first; for (; drop; drop = drop->next) { /* other drop custom types allowed */ if (event->custom == EVT_DATA_DRAGDROP) { @@ -3518,20 +3519,24 @@ void WM_event_free_ui_handler_all( wmEventHandler *WM_event_add_dropbox_handler(ListBase *handlers, ListBase *dropboxes) { - wmEventHandler *handler; - /* only allow same dropbox once */ - for (handler = handlers->first; handler; handler = handler->next) - if (handler->dropboxes == dropboxes) - return handler; + for (wmEventHandler *handler_base = handlers->first; handler_base; handler_base = handler_base->next) { + if (handler_base->type == WM_HANDLER_TYPE_DROPBOX) { + wmEventHandler_Dropbox *handler = (wmEventHandler_Dropbox *)handler_base; + if (handler->dropboxes == dropboxes) { + return &handler->base; + } + } + } - handler = MEM_callocN(sizeof(wmEventHandler), "dropbox handler"); + wmEventHandler_Dropbox *handler = MEM_callocN(sizeof(*handler), __func__); + handler->base.type = WM_HANDLER_TYPE_DROPBOX; /* dropbox stored static, no free or copy */ handler->dropboxes = dropboxes; BLI_addhead(handlers, handler); - return handler; + return &handler->base; } /* XXX solution works, still better check the real cause (ton) */ diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index 5346ec516ee..9448bba9f3b 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -46,6 +46,7 @@ enum eWM_EventHandlerType { WM_HANDLER_TYPE_GIZMO, WM_HANDLER_TYPE_UI, WM_HANDLER_TYPE_OP, + WM_HANDLER_TYPE_DROPBOX, }; typedef struct wmEventHandler { @@ -61,10 +62,6 @@ typedef struct wmEventHandler { struct wmEventHandler_KeymapFn keymap_callback; struct bToolRef *keymap_tool; - - - /* drop box handler */ - ListBase *dropboxes; } wmEventHandler; /** #WM_HANDLER_TYPE_GIZMO */ @@ -109,6 +106,13 @@ typedef struct wmEventHandler_Op { } context; } wmEventHandler_Op; +/** #WM_HANDLER_TYPE_DROPBOX */ +typedef struct wmEventHandler_Dropbox { + wmEventHandler base; + + /** Never NULL. */ + ListBase *dropboxes; +} wmEventHandler_Dropbox; /* wm_event_system.c */ void wm_event_free_all (wmWindow *win); |