Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-02-19 07:32:01 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-02-19 08:17:21 +0300
commitd718338828c19f6fa1bbaa0530dcc0fbc72e46c4 (patch)
tree0d17fff4d93256a18507b253502c125dd45f77d3 /source/blender
parentf88ea20285891d516c91c976239f95994f73abf3 (diff)
WM: move dropbox handler to it's own type
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/windowmanager/intern/wm_dragdrop.c21
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c23
-rw-r--r--source/blender/windowmanager/wm_event_system.h12
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);