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-05-20 08:06:06 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-05-20 09:26:37 +0300
commitc09f461e04baf43d06e4f95e5ba77aa1870f6981 (patch)
tree11ce88d52f76ea8f80d7476ea0f22c4f38c3cc08 /source/blender/windowmanager
parent8f73559355480c732b1cc6f7dfb6db2662297313 (diff)
WM: add wmGenericUserData utility struct
Useful to have a generic user data with an optional custom free function, use for wmGesture.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_api.h4
-rw-r--r--source/blender/windowmanager/WM_types.h10
-rw-r--r--source/blender/windowmanager/intern/wm_gesture.c6
-rw-r--r--source/blender/windowmanager/intern/wm_window.c12
4 files changed, 26 insertions, 6 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 70f986732ad..346996285a4 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -67,6 +67,7 @@ struct wmMsgSubscribeValue;
struct wmOperator;
struct wmOperatorType;
struct wmPaintCursor;
+struct wmGenericUserData;
#ifdef WITH_INPUT_NDOF
struct wmNDOFMotionData;
@@ -795,6 +796,9 @@ void WM_tooltip_init(struct bContext *C, struct wmWindow *win);
void WM_tooltip_refresh(struct bContext *C, struct wmWindow *win);
double WM_tooltip_time_closed(void);
+/* wmGenericUserData */
+void WM_generic_user_data_free(struct wmGenericUserData *user_data);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index b3c36857dce..d2e71496494 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -120,6 +120,13 @@ struct wmWindowManager;
/* Include external gizmo API's */
#include "gizmo/WM_gizmo_api.h"
+typedef struct wmGenericUserData {
+ void *data;
+ /** When NULL, use #MEM_freeN. */
+ void (*free_fn)(void *data);
+ bool use_free;
+} wmGenericUserData;
+
/* ************** wmOperatorType ************************ */
/* flag */
@@ -442,8 +449,7 @@ typedef struct wmGesture {
/* customdata for straight line is a recti: (xmin,ymin) is start, (xmax, ymax) is end */
/* free pointer to use for operator allocs (if set, its freed on exit)*/
- void *userdata;
- bool userdata_free;
+ wmGenericUserData user_data;
} wmGesture;
/* ************** wmEvent ************************ */
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index b12bb89ea9f..e117a1bcdfe 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -62,7 +62,7 @@ wmGesture *WM_gesture_new(bContext *C, const wmEvent *event, int type)
gesture->type = type;
gesture->event_type = event->type;
gesture->winrct = ar->winrct;
- gesture->userdata_free = true; /* Free if userdata is set. */
+ gesture->user_data.use_free = true; /* Free if userdata is set. */
gesture->modal_state = GESTURE_MODAL_NOP;
if (ELEM(type,
@@ -106,9 +106,7 @@ void WM_gesture_end(bContext *C, wmGesture *gesture)
}
BLI_remlink(&win->gesture, gesture);
MEM_freeN(gesture->customdata);
- if (gesture->userdata && gesture->userdata_free) {
- MEM_freeN(gesture->userdata);
- }
+ WM_generic_user_data_free(&gesture->user_data);
MEM_freeN(gesture);
}
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 7ae572e5685..0f93a03da6b 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -2290,3 +2290,15 @@ void WM_opengl_context_release(void *context)
BLI_assert(GPU_framebuffer_active_get() == NULL);
GHOST_ReleaseOpenGLContext((GHOST_ContextHandle)context);
}
+
+void WM_generic_user_data_free(wmGenericUserData *wm_userdata)
+{
+ if (wm_userdata->data && wm_userdata->use_free) {
+ if (wm_userdata->free_fn) {
+ wm_userdata->free_fn(wm_userdata->data);
+ }
+ else {
+ MEM_freeN(wm_userdata->data);
+ }
+ }
+}