Bug 678890 - Selection box handles do not respond after changing layer

Make sure that temporarily setting/unsetting tool->control's "preserve
tool across image changes" does not mess up the default value:

Introduce gimp_tool_control_push/pop_preserve() which restores the old
state automatically, and use it in all tools, instead of saying
set_preserve(TRUE/FALSE) around image changes.
This commit is contained in:
Michael Natterer 2012-07-26 18:17:01 +02:00
parent 01dffdc276
commit 078128bb09
6 changed files with 63 additions and 30 deletions

View File

@ -237,13 +237,13 @@ gimp_cage_tool_control (GimpTool *tool,
if (ct->image_map)
{
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
gimp_image_map_abort (ct->image_map);
g_object_unref (ct->image_map);
ct->image_map = NULL;
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
gimp_image_flush (gimp_display_get_image (tool->display));
}
@ -426,13 +426,13 @@ gimp_cage_tool_key_press (GimpTool *tool,
}
else if (ct->tool_state == DEFORM_STATE_WAIT)
{
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
gimp_image_map_commit (ct->image_map);
g_object_unref (ct->image_map);
ct->image_map = NULL;
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
gimp_image_flush (gimp_display_get_image (display));

View File

@ -462,13 +462,13 @@ gimp_image_map_tool_control (GimpTool *tool,
{
GimpImage *image;
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
gimp_image_map_abort (image_map_tool->image_map);
g_object_unref (image_map_tool->image_map);
image_map_tool->image_map = NULL;
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
/* don't call gimp_image_flush() here, because the tool
* might be cancelled from some other place opening an undo
@ -542,19 +542,19 @@ gimp_image_map_tool_options_notify (GimpTool *tool,
if (im_options->preview)
{
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
gimp_image_map_tool_map (image_map_tool);
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
}
else
{
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
gimp_image_map_clear (image_map_tool->image_map);
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
gimp_image_map_tool_flush (image_map_tool->image_map,
image_map_tool);
@ -732,7 +732,7 @@ gimp_image_map_tool_response (GtkWidget *widget,
{
GimpImageMapOptions *options = GIMP_IMAGE_MAP_TOOL_GET_OPTIONS (tool);
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
if (! options->preview)
gimp_image_map_tool_map (image_map_tool);
@ -741,7 +741,7 @@ gimp_image_map_tool_response (GtkWidget *widget,
g_object_unref (image_map_tool->image_map);
image_map_tool->image_map = NULL;
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
gimp_image_flush (gimp_display_get_image (tool->display));
@ -810,11 +810,11 @@ gimp_image_map_tool_preview (GimpImageMapTool *image_map_tool)
if (image_map_tool->image_map && options->preview)
{
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
gimp_image_map_tool_map (image_map_tool);
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
}
}
@ -825,11 +825,11 @@ gimp_image_map_tool_gegl_notify (GObject *config,
{
if (im_tool->image_map)
{
gimp_tool_control_set_preserve (GIMP_TOOL (im_tool)->control, TRUE);
gimp_tool_control_push_preserve (GIMP_TOOL (im_tool)->control, TRUE);
gimp_image_map_tool_create_map (im_tool);
gimp_tool_control_set_preserve (GIMP_TOOL (im_tool)->control, FALSE);
gimp_tool_control_pop_preserve (GIMP_TOOL (im_tool)->control);
gimp_image_map_tool_preview (im_tool);
}

View File

@ -419,11 +419,11 @@ gimp_rectangle_select_tool_button_press (GimpTool *tool,
if (undo && priv->undo == undo)
{
/* prevent this change from halting the tool */
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
gimp_image_undo (image);
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
/* we will need to redo if the user cancels or executes */
priv->redo = gimp_undo_stack_peek (redo_stack);
@ -475,12 +475,12 @@ gimp_rectangle_select_tool_button_release (GimpTool *tool,
if (redo && priv->redo == redo)
{
/* prevent this from halting the tool */
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
gimp_image_redo (image);
priv->redo = NULL;
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
}
}
@ -492,11 +492,11 @@ gimp_rectangle_select_tool_button_release (GimpTool *tool,
if (priv->redo)
{
/* prevent this from halting the tool */
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
gimp_image_redo (image);
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
}
priv->use_saved_op = TRUE; /* is this correct? */
@ -782,7 +782,7 @@ gimp_rectangle_select_tool_execute (GimpRectangleTool *rectangle,
GimpChannelOps operation;
/* prevent this change from halting the tool */
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
/* We can conceptually think of a click outside of the
* selection as adding a 0px selection. Behave intuitivly
@ -804,7 +804,7 @@ gimp_rectangle_select_tool_execute (GimpRectangleTool *rectangle,
break;
}
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
}
}
@ -841,12 +841,12 @@ gimp_rectangle_select_tool_cancel (GimpRectangleTool *rectangle)
if (undo && priv->undo == undo)
{
/* prevent this change from halting the tool */
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
gimp_image_undo (image);
gimp_image_flush (image);
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
}
}
@ -868,7 +868,7 @@ gimp_rectangle_select_tool_rectangle_change_complete (GimpRectangleTool *rectang
priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
/* prevent change in selection from halting the tool */
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
if (tool->display && ! gimp_tool_control_is_active (tool->control))
{
@ -917,7 +917,7 @@ gimp_rectangle_select_tool_rectangle_change_complete (GimpRectangleTool *rectang
gimp_image_flush (image);
}
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
gimp_rectangle_select_tool_update_option_defaults (rect_sel_tool, FALSE);

View File

@ -90,6 +90,8 @@ gimp_tool_control_finalize (GObject *object)
{
GimpToolControl *control = GIMP_TOOL_CONTROL (object);
g_slist_free (control->preserve_stack);
g_free (control->action_value_1);
g_free (control->action_value_2);
g_free (control->action_value_3);
@ -171,6 +173,31 @@ gimp_tool_control_get_preserve (GimpToolControl *control)
return control->preserve;
}
void
gimp_tool_control_push_preserve (GimpToolControl *control,
gboolean preserve)
{
g_return_if_fail (GIMP_IS_TOOL_CONTROL (control));
control->preserve_stack =
g_slist_prepend (control->preserve_stack,
GINT_TO_POINTER (control->preserve));
control->preserve = preserve ? TRUE : FALSE;
}
void
gimp_tool_control_pop_preserve (GimpToolControl *control)
{
g_return_if_fail (GIMP_IS_TOOL_CONTROL (control));
g_return_if_fail (control->preserve_stack != NULL);
control->preserve = GPOINTER_TO_INT (control->preserve_stack->data);
control->preserve_stack = g_slist_delete_link (control->preserve_stack,
control->preserve_stack);
}
void
gimp_tool_control_set_scroll_lock (GimpToolControl *control,
gboolean scroll_lock)

View File

@ -42,6 +42,8 @@ struct _GimpToolControl
gboolean preserve; /* Preserve this tool across *
* drawable changes */
GSList *preserve_stack; /* for push/pop preserve */
gboolean scroll_lock; /* allow scrolling or not */
gboolean handle_empty_image; /* invoke the tool on images *
* without active drawable */
@ -100,6 +102,10 @@ void gimp_tool_control_set_preserve (GimpToolControl *control,
gboolean preserve);
gboolean gimp_tool_control_get_preserve (GimpToolControl *control);
void gimp_tool_control_push_preserve (GimpToolControl *control,
gboolean preserve);
void gimp_tool_control_pop_preserve (GimpToolControl *control);
void gimp_tool_control_set_scroll_lock (GimpToolControl *control,
gboolean scroll_lock);
gboolean gimp_tool_control_get_scroll_lock (GimpToolControl *control);

View File

@ -1101,7 +1101,7 @@ gimp_transform_tool_transform (GimpTransformTool *tr_tool,
gimp_draw_tool_stop (GIMP_DRAW_TOOL (tr_tool));
/* We're going to dirty this image, but we want to keep the tool around */
gimp_tool_control_set_preserve (tool->control, TRUE);
gimp_tool_control_push_preserve (tool->control, TRUE);
undo_desc = GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->get_undo_desc (tr_tool);
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_TRANSFORM, undo_desc);
@ -1186,7 +1186,7 @@ gimp_transform_tool_transform (GimpTransformTool *tr_tool,
/* We're done dirtying the image, and would like to be restarted if
* the image gets dirty while the tool exists
*/
gimp_tool_control_set_preserve (tool->control, FALSE);
gimp_tool_control_pop_preserve (tool->control);
gimp_tool_control (tool, GIMP_TOOL_ACTION_HALT, display);