WM: add wmGenericUserData utility struct
authorCampbell Barton <ideasman42@gmail.com>
Mon, 20 May 2019 05:06:06 +0000 (15:06 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 20 May 2019 06:26:37 +0000 (16:26 +1000)
Useful to have a generic user data with an optional custom free function,
use for wmGesture.

source/blender/editors/mesh/editmesh_bisect.c
source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/WM_types.h
source/blender/windowmanager/intern/wm_gesture.c
source/blender/windowmanager/intern/wm_window.c

index bc60ff9274fa8a0760dc4c81bda59c5a65ed01a2..1d173d8e396c88fd9e067d5ed60f2427c0c27ede 100644 (file)
@@ -148,7 +148,7 @@ static int mesh_bisect_invoke(bContext *C, wmOperator *op, const wmEvent *event)
     BisectData *opdata;
 
     opdata = MEM_mallocN(sizeof(BisectData), "inset_operator_data");
-    gesture->userdata = opdata;
+    gesture->user_data.data = opdata;
 
     opdata->backup_len = objects_len;
     opdata->backup = MEM_callocN(sizeof(*opdata->backup) * objects_len, __func__);
@@ -193,7 +193,7 @@ static void edbm_bisect_exit(bContext *C, BisectData *opdata)
 static int mesh_bisect_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
   wmGesture *gesture = op->customdata;
-  BisectData *opdata = gesture->userdata;
+  BisectData *opdata = gesture->user_data.data;
   BisectData opdata_back = *opdata; /* annoyance, WM_gesture_straightline_modal, frees */
   int ret;
 
@@ -276,7 +276,7 @@ static int mesh_bisect_exec(bContext *C, wmOperator *op)
   }
 
   wmGesture *gesture = op->customdata;
-  BisectData *opdata = (gesture != NULL) ? gesture->userdata : NULL;
+  BisectData *opdata = (gesture != NULL) ? gesture->user_data.data : NULL;
 
   /* -------------------------------------------------------------------- */
   /* Modal support */
index c904bf2005b7e5bb5c7f57a3dfd02a5680f5b9de..b6a6c897606b38c916eacbfed214144e399c7bbe 100644 (file)
@@ -695,7 +695,7 @@ static void gradientVertInit__mapFunc(void *userData,
 static int paint_weight_gradient_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
   wmGesture *gesture = op->customdata;
-  WPGradient_vertStoreBase *vert_cache = gesture->userdata;
+  WPGradient_vertStoreBase *vert_cache = gesture->user_data.data;
   int ret = WM_gesture_straightline_modal(C, op, event);
 
   if (ret & OPERATOR_RUNNING_MODAL) {
@@ -751,15 +751,15 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op)
   WPGradient_userData data = {NULL};
 
   if (is_interactive) {
-    if (gesture->userdata == NULL) {
-      gesture->userdata = MEM_mallocN(sizeof(WPGradient_vertStoreBase) +
-                                          (sizeof(WPGradient_vertStore) * me->totvert),
-                                      __func__);
-      gesture->userdata_free = false;
+    if (gesture->user_data.data == NULL) {
+      gesture->user_data.data = MEM_mallocN(sizeof(WPGradient_vertStoreBase) +
+                                                (sizeof(WPGradient_vertStore) * me->totvert),
+                                            __func__);
+      gesture->user_data.use_free = false;
       data.is_init = true;
 
       wpaint_prev_create(
-          &((WPGradient_vertStoreBase *)gesture->userdata)->wpp, me->dvert, me->totvert);
+          &((WPGradient_vertStoreBase *)gesture->user_data.data)->wpp, me->dvert, me->totvert);
 
       /* on init only, convert face -> vert sel  */
       if (me->editflag & ME_EDIT_PAINT_FACE_SEL) {
@@ -767,7 +767,7 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op)
       }
     }
 
-    vert_cache = gesture->userdata;
+    vert_cache = gesture->user_data.data;
   }
   else {
     if (ED_wpaint_ensure_data(C, op->reports, 0, NULL) == false) {
index 70f986732ad439e5cbcbfa5788cc969e571fecb9..346996285a4427f32c44194a2515a8da8e71a575 100644 (file)
@@ -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
index b3c36857dced05157a3883530e5eda12f28782b8..d2e714964946931fd517f82381c7478be2d008d0 100644 (file)
@@ -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 ************************ */
index b12bb89ea9f2f03f55151dc2f349cf7b19c406c7..e117a1bcdfef604136eea769f386147d8a24e6c7 100644 (file)
@@ -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);
 }
 
index 7ae572e56857fc7bb65ff3eb4b583928dc266723..0f93a03da6b75a463e5612ef199f5f830bea4cff 100644 (file)
@@ -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);
+    }
+  }
+}