Made the undo system robust against the currently pushed undo being too

2004-07-07  Michael Natterer  <mitch@gimp.org>

	Made the undo system robust against the currently pushed undo
	being too large according to prefs settings. Fixes bug #145379.

	* app/core/gimpimage-undo.[ch] (gimp_image_undo_push_undo)
	(gimp_image_undo_group_end): emit "undo-event" *before* calling
	gimp_image_undo_free_space() so the undo history doesn't try to
	remove an item that has never been added.

	(gimp_image_undo_push_undo): added boolean return value indicating
	if the undo could be pushed (FALSE means the undo was to large
	and was discarded right away).

	(gimp_image_undo_push_item): return NULL if the above returned
	FALSE.

	* app/core/gimpimage-undo-push.c (gimp_image_undo_push_text_layer):
	changed accordingly.
This commit is contained in:
Michael Natterer 2004-07-07 13:58:51 +00:00 committed by Michael Natterer
parent 59736893ab
commit 525a98f81a
4 changed files with 41 additions and 14 deletions

View File

@ -1,3 +1,23 @@
2004-07-07 Michael Natterer <mitch@gimp.org>
Made the undo system robust against the currently pushed undo
being too large according to prefs settings. Fixes bug #145379.
* app/core/gimpimage-undo.[ch] (gimp_image_undo_push_undo)
(gimp_image_undo_group_end): emit "undo-event" *before* calling
gimp_image_undo_free_space() so the undo history doesn't try to
remove an item that has never been added.
(gimp_image_undo_push_undo): added boolean return value indicating
if the undo could be pushed (FALSE means the undo was to large
and was discarded right away).
(gimp_image_undo_push_item): return NULL if the above returned
FALSE.
* app/core/gimpimage-undo-push.c (gimp_image_undo_push_text_layer):
changed accordingly.
2004-07-07 Manish Singh <yosh@gimp.org>
* plug-ins/common/jpeg.c: Don't try to load EXIF data if any warnings

View File

@ -1762,9 +1762,7 @@ gimp_image_undo_push_text_layer (GimpImage *gimage,
undo = gimp_text_undo_new (layer, pspec, undo_desc);
gimp_image_undo_push_undo (gimage, undo);
return TRUE;
return gimp_image_undo_push_undo (gimage, undo);
}

View File

@ -170,13 +170,13 @@ gimp_image_undo_group_end (GimpImage *gimage)
{
gimage->pushing_undo_group = GIMP_UNDO_GROUP_NONE;
gimp_image_undo_free_space (gimage);
/* Do it here, since undo_push doesn't emit this event while in
* the middle of a group
*/
gimp_image_undo_event (gimage, GIMP_UNDO_EVENT_UNDO_PUSHED,
gimp_undo_stack_peek (gimage->undo_stack));
gimp_image_undo_free_space (gimage);
}
return TRUE;
@ -245,19 +245,20 @@ gimp_image_undo_push_item (GimpImage *gimage,
pop_func, free_func);
}
gimp_image_undo_push_undo (gimage, undo);
if (gimp_image_undo_push_undo (gimage, undo))
return undo;
return undo;
return NULL;
}
void
gboolean
gimp_image_undo_push_undo (GimpImage *gimage,
GimpUndo *undo)
{
g_return_if_fail (GIMP_IS_IMAGE (gimage));
g_return_if_fail (GIMP_IS_UNDO (undo));
g_return_if_fail (undo->gimage == gimage);
g_return_if_fail (gimage->undo_freeze_count == 0);
g_return_val_if_fail (GIMP_IS_IMAGE (gimage), FALSE);
g_return_val_if_fail (GIMP_IS_UNDO (undo), FALSE);
g_return_val_if_fail (undo->gimage == gimage, FALSE);
g_return_val_if_fail (gimage->undo_freeze_count == 0, FALSE);
/* nuke the redo stack */
gimp_image_undo_free_redo (gimage);
@ -275,9 +276,13 @@ gimp_image_undo_push_undo (GimpImage *gimage,
{
gimp_undo_stack_push_undo (gimage->undo_stack, undo);
gimp_image_undo_event (gimage, GIMP_UNDO_EVENT_UNDO_PUSHED, undo);
gimp_image_undo_free_space (gimage);
gimp_image_undo_event (gimage, GIMP_UNDO_EVENT_UNDO_PUSHED, undo);
/* freeing undo space may have freed the newly pushed undo */
if (gimp_undo_stack_peek (gimage->undo_stack) == undo)
return TRUE;
}
else
{
@ -286,7 +291,11 @@ gimp_image_undo_push_undo (GimpImage *gimage,
undo_group = GIMP_UNDO_STACK (gimp_undo_stack_peek (gimage->undo_stack));
gimp_undo_stack_push_undo (undo_group, undo);
return TRUE;
}
return FALSE;
}

View File

@ -47,7 +47,7 @@ GimpUndo * gimp_image_undo_push_item (GimpImage *gimage,
gboolean dirties_image,
GimpUndoPopFunc pop_func,
GimpUndoFreeFunc free_func);
void gimp_image_undo_push_undo (GimpImage *gimage,
gboolean gimp_image_undo_push_undo (GimpImage *gimage,
GimpUndo *undo);