diff --git a/app/tools/gimpfiltertool.c b/app/tools/gimpfiltertool.c index 922cdad2c5..9112f169d4 100644 --- a/app/tools/gimpfiltertool.c +++ b/app/tools/gimpfiltertool.c @@ -163,6 +163,9 @@ static void gimp_filter_tool_flush (GimpDrawableFilter *filter, static void gimp_filter_tool_config_notify (GObject *object, const GParamSpec *pspec, GimpFilterTool *filter_tool); +static void gimp_filter_tool_unset_setting (GObject *object, + const GParamSpec *pspec, + GimpFilterTool *filter_tool); static void gimp_filter_tool_mask_changed (GimpImage *image, GimpFilterTool *filter_tool); @@ -1001,6 +1004,9 @@ gimp_filter_tool_halt (GimpFilterTool *filter_tool) g_signal_handlers_disconnect_by_func (filter_tool->config, gimp_filter_tool_config_notify, filter_tool); + g_signal_handlers_disconnect_by_func (filter_tool->config, + gimp_filter_tool_unset_setting, + filter_tool); g_clear_object (&filter_tool->config); } @@ -1140,6 +1146,18 @@ gimp_filter_tool_config_notify (GObject *object, pspec); } +static void +gimp_filter_tool_unset_setting (GObject *object, + const GParamSpec *pspec, + GimpFilterTool *filter_tool) +{ + g_signal_handlers_disconnect_by_func (filter_tool->config, + gimp_filter_tool_unset_setting, + filter_tool); + + gimp_settings_box_unset (GIMP_SETTINGS_BOX (filter_tool->settings_box)); +} + static void gimp_filter_tool_mask_changed (GimpImage *image, GimpFilterTool *filter_tool) @@ -1421,6 +1439,9 @@ gimp_filter_tool_get_operation (GimpFilterTool *filter_tool) g_signal_handlers_disconnect_by_func (filter_tool->config, gimp_filter_tool_config_notify, filter_tool); + g_signal_handlers_disconnect_by_func (filter_tool->config, + gimp_filter_tool_unset_setting, + filter_tool); g_clear_object (&filter_tool->config); } @@ -1516,10 +1537,22 @@ gimp_filter_tool_set_config (GimpFilterTool *filter_tool, g_return_if_fail (GIMP_IS_FILTER_TOOL (filter_tool)); g_return_if_fail (GIMP_IS_SETTINGS (config)); + /* if the user didn't change a setting since the last set_config(), + * this handler is still connected + */ + g_signal_handlers_disconnect_by_func (filter_tool->config, + gimp_filter_tool_unset_setting, + filter_tool); + GIMP_FILTER_TOOL_GET_CLASS (filter_tool)->set_config (filter_tool, config); if (filter_tool->widget) gimp_filter_tool_reset_widget (filter_tool, filter_tool->widget); + + if (filter_tool->settings_box) + g_signal_connect_object (filter_tool->config, "notify", + G_CALLBACK (gimp_filter_tool_unset_setting), + G_OBJECT (filter_tool), 0); } void diff --git a/app/widgets/gimpsettingsbox.c b/app/widgets/gimpsettingsbox.c index 521e7f4fbe..2cc59192b2 100644 --- a/app/widgets/gimpsettingsbox.c +++ b/app/widgets/gimpsettingsbox.c @@ -553,12 +553,8 @@ gimp_settings_box_setting_selected (GimpContainerView *view, GimpSettingsBox *box) { if (object) - { - g_signal_emit (box, settings_box_signals[SELECTED], 0, - object); - - gimp_container_view_select_item (view, NULL); - } + g_signal_emit (box, settings_box_signals[SELECTED], 0, + object); } static gboolean @@ -961,3 +957,15 @@ gimp_settings_box_add_current (GimpSettingsBox *box, gimp_operation_config_serialize (private->gimp, private->container, NULL); } + +void +gimp_settings_box_unset (GimpSettingsBox *box) +{ + GimpSettingsBoxPrivate *private; + + g_return_if_fail (GIMP_IS_SETTINGS_BOX (box)); + + private = GET_PRIVATE (box); + + gimp_container_view_select_item (GIMP_CONTAINER_VIEW (private->combo), NULL); +} diff --git a/app/widgets/gimpsettingsbox.h b/app/widgets/gimpsettingsbox.h index 5f4e546608..7879083bda 100644 --- a/app/widgets/gimpsettingsbox.h +++ b/app/widgets/gimpsettingsbox.h @@ -70,5 +70,7 @@ GtkWidget * gimp_settings_box_get_combo (GimpSettingsBox *box); void gimp_settings_box_add_current (GimpSettingsBox *box, gint max_recent); +void gimp_settings_box_unset (GimpSettingsBox *box); + #endif /* __GIMP_SETTINGS_BOX_H__ */