diff --git a/app/core/gimpimage-undo-push.c b/app/core/gimpimage-undo-push.c index c9c77a31a059fcc0ce93a45a8d775215b01d03d0..e85f7f5b05e71d18e99fbd7301eb7a42f3da855f 100644 --- a/app/core/gimpimage-undo-push.c +++ b/app/core/gimpimage-undo-push.c @@ -1974,6 +1974,7 @@ undo_push_guide (GImage *gimage, if ((new = undo_push (gimage, size, GIMAGE_MOD))) { + ((Guide *)(guide))->ref_count++; data = g_new (GuideUndo, 1); new->data = data; new->pop_func = undo_pop_guide; @@ -1998,14 +1999,17 @@ undo_pop_guide (GImage *gimage, { GuideUndo *data; Guide tmp; + int tmp_ref; data = data_ptr; gdisplays_expose_guide (gimage->ID, data->guide); gdisplays_expose_guide (gimage->ID, &data->orig); + tmp_ref = data->guide->ref_count; tmp = *(data->guide); *(data->guide) = data->orig; + data->guide->ref_count = tmp_ref; data->orig = tmp; switch (state) @@ -2030,8 +2034,9 @@ undo_free_guide (int state, data = data_ptr; - if (data->guide->position < 0) - gimage_delete_guide (data->gimage, data->guide); + data->guide->ref_count--; + if (data->guide->position < 0 && data->guide->ref_count <= 0) + gimage_delete_guide (data->gimage, data->guide); g_free (data_ptr); } diff --git a/app/gimage.c b/app/gimage.c index 744bdc5383afabf0573585e993f6f0c2d3d242ee..f303dff1dbfc92495ff8f2c6cbf6e6866935a9da 100644 --- a/app/gimage.c +++ b/app/gimage.c @@ -825,6 +825,7 @@ gimage_add_hguide (GImage *gimage) Guide *guide; guide = g_new (Guide, 1); + guide->ref_count = 0; guide->position = -1; guide->orientation = HORIZONTAL_GUIDE; @@ -839,6 +840,7 @@ gimage_add_vguide (GImage *gimage) Guide *guide; guide = g_new (Guide, 1); + guide->ref_count = 0; guide->position = -1; guide->orientation = VERTICAL_GUIDE; diff --git a/app/gimage.h b/app/gimage.h index e48f2628054d10c30b4326b1dc53ae26a4893e86..07bcdf8d3e833c5faa380015841efadb38ed797b 100644 --- a/app/gimage.h +++ b/app/gimage.h @@ -87,6 +87,7 @@ typedef struct _GImage GImage; struct _Guide { + int ref_count; int position; int orientation; }; diff --git a/app/undo.c b/app/undo.c index c9c77a31a059fcc0ce93a45a8d775215b01d03d0..e85f7f5b05e71d18e99fbd7301eb7a42f3da855f 100644 --- a/app/undo.c +++ b/app/undo.c @@ -1974,6 +1974,7 @@ undo_push_guide (GImage *gimage, if ((new = undo_push (gimage, size, GIMAGE_MOD))) { + ((Guide *)(guide))->ref_count++; data = g_new (GuideUndo, 1); new->data = data; new->pop_func = undo_pop_guide; @@ -1998,14 +1999,17 @@ undo_pop_guide (GImage *gimage, { GuideUndo *data; Guide tmp; + int tmp_ref; data = data_ptr; gdisplays_expose_guide (gimage->ID, data->guide); gdisplays_expose_guide (gimage->ID, &data->orig); + tmp_ref = data->guide->ref_count; tmp = *(data->guide); *(data->guide) = data->orig; + data->guide->ref_count = tmp_ref; data->orig = tmp; switch (state) @@ -2030,8 +2034,9 @@ undo_free_guide (int state, data = data_ptr; - if (data->guide->position < 0) - gimage_delete_guide (data->gimage, data->guide); + data->guide->ref_count--; + if (data->guide->position < 0 && data->guide->ref_count <= 0) + gimage_delete_guide (data->gimage, data->guide); g_free (data_ptr); }