Commit bd8f7a1a authored by Larry Ewing's avatar Larry Ewing Committed by Larry Ewing

app/undo.c app/gimage.h added a simple ref count to the guides so that

1998-03-11  Larry Ewing  <lewing@discord.isc.tamu.edu>

	* app/undo.c
	* app/gimage.h
	* app/gimage.c: added a simple ref count to the guides so that
	undo does not free the too early...
parent 16aacc47
...@@ -1974,6 +1974,7 @@ undo_push_guide (GImage *gimage, ...@@ -1974,6 +1974,7 @@ undo_push_guide (GImage *gimage,
if ((new = undo_push (gimage, size, GIMAGE_MOD))) if ((new = undo_push (gimage, size, GIMAGE_MOD)))
{ {
((Guide *)(guide))->ref_count++;
data = g_new (GuideUndo, 1); data = g_new (GuideUndo, 1);
new->data = data; new->data = data;
new->pop_func = undo_pop_guide; new->pop_func = undo_pop_guide;
...@@ -1998,14 +1999,17 @@ undo_pop_guide (GImage *gimage, ...@@ -1998,14 +1999,17 @@ undo_pop_guide (GImage *gimage,
{ {
GuideUndo *data; GuideUndo *data;
Guide tmp; Guide tmp;
int tmp_ref;
data = data_ptr; data = data_ptr;
gdisplays_expose_guide (gimage->ID, data->guide); gdisplays_expose_guide (gimage->ID, data->guide);
gdisplays_expose_guide (gimage->ID, &data->orig); gdisplays_expose_guide (gimage->ID, &data->orig);
tmp_ref = data->guide->ref_count;
tmp = *(data->guide); tmp = *(data->guide);
*(data->guide) = data->orig; *(data->guide) = data->orig;
data->guide->ref_count = tmp_ref;
data->orig = tmp; data->orig = tmp;
switch (state) switch (state)
...@@ -2030,7 +2034,8 @@ undo_free_guide (int state, ...@@ -2030,7 +2034,8 @@ undo_free_guide (int state,
data = data_ptr; data = data_ptr;
if (data->guide->position < 0) data->guide->ref_count--;
if (data->guide->position < 0 && data->guide->ref_count <= 0)
gimage_delete_guide (data->gimage, data->guide); gimage_delete_guide (data->gimage, data->guide);
g_free (data_ptr); g_free (data_ptr);
......
...@@ -825,6 +825,7 @@ gimage_add_hguide (GImage *gimage) ...@@ -825,6 +825,7 @@ gimage_add_hguide (GImage *gimage)
Guide *guide; Guide *guide;
guide = g_new (Guide, 1); guide = g_new (Guide, 1);
guide->ref_count = 0;
guide->position = -1; guide->position = -1;
guide->orientation = HORIZONTAL_GUIDE; guide->orientation = HORIZONTAL_GUIDE;
...@@ -839,6 +840,7 @@ gimage_add_vguide (GImage *gimage) ...@@ -839,6 +840,7 @@ gimage_add_vguide (GImage *gimage)
Guide *guide; Guide *guide;
guide = g_new (Guide, 1); guide = g_new (Guide, 1);
guide->ref_count = 0;
guide->position = -1; guide->position = -1;
guide->orientation = VERTICAL_GUIDE; guide->orientation = VERTICAL_GUIDE;
......
...@@ -87,6 +87,7 @@ typedef struct _GImage GImage; ...@@ -87,6 +87,7 @@ typedef struct _GImage GImage;
struct _Guide struct _Guide
{ {
int ref_count;
int position; int position;
int orientation; int orientation;
}; };
......
...@@ -1974,6 +1974,7 @@ undo_push_guide (GImage *gimage, ...@@ -1974,6 +1974,7 @@ undo_push_guide (GImage *gimage,
if ((new = undo_push (gimage, size, GIMAGE_MOD))) if ((new = undo_push (gimage, size, GIMAGE_MOD)))
{ {
((Guide *)(guide))->ref_count++;
data = g_new (GuideUndo, 1); data = g_new (GuideUndo, 1);
new->data = data; new->data = data;
new->pop_func = undo_pop_guide; new->pop_func = undo_pop_guide;
...@@ -1998,14 +1999,17 @@ undo_pop_guide (GImage *gimage, ...@@ -1998,14 +1999,17 @@ undo_pop_guide (GImage *gimage,
{ {
GuideUndo *data; GuideUndo *data;
Guide tmp; Guide tmp;
int tmp_ref;
data = data_ptr; data = data_ptr;
gdisplays_expose_guide (gimage->ID, data->guide); gdisplays_expose_guide (gimage->ID, data->guide);
gdisplays_expose_guide (gimage->ID, &data->orig); gdisplays_expose_guide (gimage->ID, &data->orig);
tmp_ref = data->guide->ref_count;
tmp = *(data->guide); tmp = *(data->guide);
*(data->guide) = data->orig; *(data->guide) = data->orig;
data->guide->ref_count = tmp_ref;
data->orig = tmp; data->orig = tmp;
switch (state) switch (state)
...@@ -2030,7 +2034,8 @@ undo_free_guide (int state, ...@@ -2030,7 +2034,8 @@ undo_free_guide (int state,
data = data_ptr; data = data_ptr;
if (data->guide->position < 0) data->guide->ref_count--;
if (data->guide->position < 0 && data->guide->ref_count <= 0)
gimage_delete_guide (data->gimage, data->guide); gimage_delete_guide (data->gimage, data->guide);
g_free (data_ptr); g_free (data_ptr);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment