Fix gradient tool crash with recent changes
Having gesture automatic free memory isn't practical if this has it's own allocations. Add option not to free userdata.
This commit is contained in:
parent
9a6aba2a94
commit
864a53e276
|
@ -671,15 +671,14 @@ static void gradientVertInit__mapFunc(
|
|||
|
||||
static int paint_weight_gradient_modal(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
{
|
||||
int ret = WM_gesture_straightline_modal(C, op, event);
|
||||
wmGesture *gesture = op->customdata;
|
||||
DMGradient_vertStoreBase *vert_cache = gesture->userdata;
|
||||
bool do_gesture_free = false;
|
||||
int ret = WM_gesture_straightline_modal(C, op, event);
|
||||
|
||||
if (ret & OPERATOR_RUNNING_MODAL) {
|
||||
if (event->type == LEFTMOUSE && event->val == KM_RELEASE) { /* XXX, hardcoded */
|
||||
/* generally crap! redo! */
|
||||
do_gesture_free = true;
|
||||
WM_gesture_straightline_cancel(C, op);
|
||||
ret &= ~OPERATOR_RUNNING_MODAL;
|
||||
ret |= OPERATOR_FINISHED;
|
||||
}
|
||||
|
@ -693,16 +692,14 @@ static int paint_weight_gradient_modal(bContext *C, wmOperator *op, const wmEven
|
|||
BKE_defvert_array_copy(me->dvert, vert_cache->wpp.wpaint_prev, me->totvert);
|
||||
wpaint_prev_destroy(&vert_cache->wpp);
|
||||
}
|
||||
MEM_freeN(vert_cache);
|
||||
|
||||
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
|
||||
}
|
||||
else if (ret & OPERATOR_FINISHED) {
|
||||
wpaint_prev_destroy(&vert_cache->wpp);
|
||||
}
|
||||
|
||||
if (do_gesture_free) {
|
||||
WM_gesture_straightline_cancel(C, op);
|
||||
MEM_freeN(vert_cache);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -733,6 +730,7 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op)
|
|||
sizeof(DMGradient_vertStoreBase) +
|
||||
(sizeof(DMGradient_vertStore) * me->totvert),
|
||||
__func__);
|
||||
gesture->userdata_free = false;
|
||||
data.is_init = true;
|
||||
|
||||
wpaint_prev_create(&((DMGradient_vertStoreBase *)gesture->userdata)->wpp, me->dvert, me->totvert);
|
||||
|
|
|
@ -423,6 +423,7 @@ typedef struct wmGesture {
|
|||
|
||||
/* free pointer to use for operator allocs (if set, its freed on exit)*/
|
||||
void *userdata;
|
||||
bool userdata_free;
|
||||
} wmGesture;
|
||||
|
||||
/* ************** wmEvent ************************ */
|
||||
|
|
|
@ -71,6 +71,7 @@ wmGesture *WM_gesture_new(bContext *C, const wmEvent *event, int type)
|
|||
gesture->type = type;
|
||||
gesture->event_type = event->type;
|
||||
gesture->swinid = ar->swinid; /* means only in area-region context! */
|
||||
gesture->userdata_free = true; /* Free if userdata is set. */
|
||||
|
||||
wm_subwindow_origin_get(window, gesture->swinid, &sx, &sy);
|
||||
|
||||
|
@ -114,7 +115,7 @@ void WM_gesture_end(bContext *C, wmGesture *gesture)
|
|||
win->tweak = NULL;
|
||||
BLI_remlink(&win->gesture, gesture);
|
||||
MEM_freeN(gesture->customdata);
|
||||
if (gesture->userdata) {
|
||||
if (gesture->userdata && gesture->userdata_free) {
|
||||
MEM_freeN(gesture->userdata);
|
||||
}
|
||||
MEM_freeN(gesture);
|
||||
|
|
Loading…
Reference in New Issue