From c1d9f910f727caaad5e0697e8ed294ea8f0b1f10 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Tue, 26 Nov 2019 15:00:58 -0300 Subject: [PATCH] Fixing multiple "save-settings" signals on common dialog. --- src/dialogs/settings/dialog.c | 15 ++++++++++++++- src/include/terminal.h | 11 ++++++----- src/terminal/keyfile.c | 4 ++-- src/terminal/properties/get.c | 10 +++++----- src/terminal/widget.c | 3 ++- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/dialogs/settings/dialog.c b/src/dialogs/settings/dialog.c index ecb7d1e..3807186 100644 --- a/src/dialogs/settings/dialog.c +++ b/src/dialogs/settings/dialog.c @@ -30,6 +30,7 @@ #include "../private.h" #include #include + #include #include G_DEFINE_TYPE(V3270SettingsDialog, V3270SettingsDialog, GTK_TYPE_DIALOG); @@ -123,6 +124,14 @@ static void revert_settings(GtkWidget *widget, GtkWidget G_GNUC_UNUSED(* termina v3270_settings_revert(widget); } +static gboolean bg_emit_save_settings(GObject *widget) +{ + debug("Unfreezing and emitting save settings for terminal %p",widget); + GTK_V3270(widget)->freeze = 0; + g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_SAVE_SETTINGS], 0, FALSE); + return FALSE; +} + void v3270_settings_dialog_apply(GtkWidget *dialog) { debug("%s",__FUNCTION__); @@ -131,13 +140,17 @@ void v3270_settings_dialog_apply(GtkWidget *dialog) if(!terminal) return; + // Freeze to avoid multiple "save settings" signals. + GTK_V3270(terminal)->freeze = 1; + gtk_container_foreach( GTK_CONTAINER(GTK_V3270_SETTINGS_DIALOG(dialog)->tabs), (GtkCallback) apply_settings, terminal ); - v3270_emit_save_settings(terminal); + // Delay the "unfreeze" signal. + g_idle_add((GSourceFunc) bg_emit_save_settings, G_OBJECT(terminal)); } diff --git a/src/include/terminal.h b/src/include/terminal.h index ba2bd4a..1bbc7c2 100644 --- a/src/include/terminal.h +++ b/src/include/terminal.h @@ -133,11 +133,12 @@ G_BEGIN_DECLS GtkWidget parent; // flags - int selecting : 1; /**< Selecting region */ - int moving : 1; /**< Moving selected region */ - int resizing : 1; /**< Resizing selected region */ - int scaled_fonts : 1; /**< Use scaled fonts */ - int drawing : 1; /**< Draw widget? */ + int selecting : 1; /// @brief Selecting region + int moving : 1; /// @brief Moving selected region + int resizing : 1; /// @brief Resizing selected region + int scaled_fonts : 1; /// @brief Use scaled fonts + int drawing : 1; /// @brief Draw widget? + int freeze : 1; /// @brief Truee when the "save settings" signal is disabled. /// @brief Action properties. GtkResponseType responses[V3270_TOGGLEABLE_DIALOG_CUSTOM]; diff --git a/src/terminal/keyfile.c b/src/terminal/keyfile.c index 6390c65..db60105 100644 --- a/src/terminal/keyfile.c +++ b/src/terminal/keyfile.c @@ -57,7 +57,7 @@ { const gchar * current = g_value_get_string(&value); - debug("%s=%s (default: %s)",name,current,G_PARAM_SPEC_STRING(pspec)->default_value); +// debug("%s=%s (default: %s)",name,current,G_PARAM_SPEC_STRING(pspec)->default_value); if(current && strcmp(current,G_PARAM_SPEC_STRING(pspec)->default_value ? G_PARAM_SPEC_STRING(pspec)->default_value : "")) { @@ -84,7 +84,7 @@ { gboolean current = g_value_get_boolean(&value); - debug("%s=%s (default: %s)",name,current ? "ON" : "OFF" ,G_PARAM_SPEC_BOOLEAN(pspec)->default_value ? "ON" : "OFF"); +// debug("%s=%s (default: %s)",name,current ? "ON" : "OFF" ,G_PARAM_SPEC_BOOLEAN(pspec)->default_value ? "ON" : "OFF"); if(current != G_PARAM_SPEC_BOOLEAN(pspec)->default_value) { diff --git a/src/terminal/properties/get.c b/src/terminal/properties/get.c index 96cc3aa..d503843 100644 --- a/src/terminal/properties/get.c +++ b/src/terminal/properties/get.c @@ -37,7 +37,7 @@ v3270 * window = GTK_V3270(object); v3270Class * klass = GTK_V3270_GET_CLASS(object); - debug("%s(%u,%s)",__FUNCTION__,prop_id,g_param_spec_get_name(pspec)); +// debug("%s(%u,%s)",__FUNCTION__,prop_id,g_param_spec_get_name(pspec)); if(prop_id >= klass->properties.type.responses) { @@ -46,7 +46,7 @@ else if(prop_id >= klass->properties.type.str) { const LIB3270_STRING_PROPERTY * prop = (lib3270_get_string_properties_list()+(prop_id - klass->properties.type.str)); - debug("%s.%s.%s",__FUNCTION__,"string",prop->name); +// debug("%s.%s.%s",__FUNCTION__,"string",prop->name); if(prop->get) g_value_set_string(value,prop->get(window->host)); @@ -55,7 +55,7 @@ else if(prop_id >= klass->properties.type.uint) { const LIB3270_UINT_PROPERTY * prop = (lib3270_get_unsigned_properties_list()+(prop_id - klass->properties.type.uint)); - debug("%s.%s.%s",__FUNCTION__,"unsigned",prop->name); +// debug("%s.%s.%s",__FUNCTION__,"unsigned",prop->name); if(prop->get) g_value_set_uint(value,prop->get(window->host)); @@ -64,7 +64,7 @@ else if(prop_id >= klass->properties.type.integer) { const LIB3270_INT_PROPERTY * prop = (lib3270_get_int_properties_list()+(prop_id - klass->properties.type.integer)); - debug("%s.%s.%s",__FUNCTION__,"integer",prop->name); +// debug("%s.%s.%s",__FUNCTION__,"integer",prop->name); if(prop->get) g_value_set_int(value,prop->get(window->host)); @@ -73,7 +73,7 @@ else if(prop_id >= klass->properties.type.boolean) { const LIB3270_INT_PROPERTY * prop = (lib3270_get_boolean_properties_list()+(prop_id - klass->properties.type.boolean)); - debug("%s.%s.%s",__FUNCTION__,"boolean",prop->name); +// debug("%s.%s.%s",__FUNCTION__,"boolean",prop->name); if(prop->get) g_value_set_boolean(value,prop->get(window->host) != 0 ? TRUE : FALSE); diff --git a/src/terminal/widget.c b/src/terminal/widget.c index 3d9b3d9..8412ddf 100644 --- a/src/terminal/widget.c +++ b/src/terminal/widget.c @@ -771,7 +771,8 @@ static gboolean bg_emit_save_settings(GObject *widget) void v3270_emit_save_settings(GtkWidget *widget) { - if(widget) + debug("%s(Freeze is %s)",__FUNCTION__,GTK_V3270(widget)->freeze ? "ON" : "OFF"); + if(widget && GTK_IS_V3270(widget) && !GTK_V3270(widget)->freeze) g_idle_add((GSourceFunc) bg_emit_save_settings, G_OBJECT(widget)); } -- libgit2 0.21.2