[calls] settings: Break settings binding cycle
- From: Evangelos Ribeiro Tzaras <devrtz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [calls] settings: Break settings binding cycle
- Date: Thu, 19 May 2022 09:31:54 +0000 (UTC)
commit 46f46cf3ec50a589410a33f6b3eee870f9d107c2
Author: Evangelos Ribeiro Tzaras <devrtz fortysixandtwo eu>
Date: Tue Apr 12 09:25:55 2022 +0200
settings: Break settings binding cycle
This breaks the settings binding cycle for the "autoload-plugins" and
"preferred-audio-codecs" settings which went something like this:
g_settings_bind () is used with
G_SETTINGS_BIND_DEFAULT (G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET).
It grabs the value of our setting and sets it for the bound property.
This emits the notify signal causing the same value to be set for the
setting.
In effect this caused the setting to be marked as non-default because
Calls had changed the setting without user action. This caused updated
defaults not to apply for existing installations.
src/calls-settings.c | 56 +++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 45 insertions(+), 11 deletions(-)
---
diff --git a/src/calls-settings.c b/src/calls-settings.c
index ca34fdaf..2816f641 100644
--- a/src/calls-settings.c
+++ b/src/calls-settings.c
@@ -50,6 +50,9 @@ struct _CallsSettings {
GObject parent_instance;
GSettings *settings;
+
+ GStrv autoload_plugins;
+ GStrv preferred_audio_codecs;
};
G_DEFINE_TYPE (CallsSettings, calls_settings, G_TYPE_OBJECT)
@@ -126,10 +129,14 @@ calls_settings_constructed (GObject *object)
G_OBJECT_CLASS (calls_settings_parent_class)->constructed (object);
- g_settings_bind (self->settings, "auto-use-default-origins",
- self, "auto-use-default-origins", G_SETTINGS_BIND_DEFAULT);
+ /**
+ * The country code is the only persistent setting which should be written
+ * from within Calls (by looking at the MCC of the network the modem is connected to)
+ */
g_settings_bind (self->settings, "country-code",
self, "country-code", G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind (self->settings, "auto-use-default-origins",
+ self, "auto-use-default-origins", G_SETTINGS_BIND_DEFAULT);
g_settings_bind (self->settings, "autoload-plugins",
self, "autoload-plugins", G_SETTINGS_BIND_DEFAULT);
g_settings_bind (self->settings, "preferred-audio-codecs",
@@ -163,27 +170,27 @@ calls_settings_class_init (CallsSettingsClass *klass)
"auto use default origins",
"Automatically use default origins",
TRUE,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
props[PROP_COUNTRY_CODE] =
g_param_spec_string ("country-code",
"country code",
"The country code (usually from the modem)",
"",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
props[PROP_AUTOLOAD_PLUGINS] =
g_param_spec_boxed ("autoload-plugins",
"autoload plugins",
"The plugins to automatically load on startup",
G_TYPE_STRV,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
props[PROP_PREFERRED_AUDIO_CODECS] =
g_param_spec_boxed ("preferred-audio-codecs",
"Preferred audio codecs",
"The audio codecs to prefer for VoIP calls",
G_TYPE_STRV,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (object_class, PROP_LAST_PROP, props);
}
@@ -296,7 +303,7 @@ calls_settings_get_autoload_plugins (CallsSettings *self)
/**
* calls_settings_set_autoload_plugins:
* @self: A #CallsSettings
- * @plugins: (nullable) (array zero-terminated=1): The plugins to autoload
+ * @plugins: (array zero-terminated=1): The plugins to autoload
*
* Sets the plugins that should be loaded on startup.
*/
@@ -304,9 +311,22 @@ void
calls_settings_set_autoload_plugins (CallsSettings *self,
const char * const *plugins)
{
+ gboolean initial = TRUE;
+
g_return_if_fail (CALLS_IS_SETTINGS (self));
+ g_return_if_fail (plugins);
+
+ if (self->autoload_plugins) {
+ initial = FALSE;
+ if (g_strv_equal (plugins, (const char * const *) self->autoload_plugins))
+ return;
+ }
+
+ g_free (self->autoload_plugins);
+ self->autoload_plugins = g_strdupv ((char **) plugins);
- g_settings_set_strv (G_SETTINGS (self->settings), "autoload-plugins", plugins);
+ if (!initial)
+ g_object_notify_by_pspec (G_OBJECT (self), props[PROP_AUTOLOAD_PLUGINS]);
}
@@ -322,13 +342,13 @@ calls_settings_get_preferred_audio_codecs (CallsSettings *self)
{
g_return_val_if_fail (CALLS_IS_SETTINGS (self), NULL);
- return g_settings_get_strv (self->settings, "preferred-audio-codecs");
+ return g_strdupv (self->preferred_audio_codecs);
}
/**
* calls_settings_set_preferred_audio_codecs:
* @self: A #CallsSettings
- * @codecs: (nullable) (array zero-terminated=1): The preferred codecs
+ * @codecs: (array zero-terminated=1): The preferred codecs
*
* Set the preferred audio codecs for VoIP calls.
*/
@@ -336,7 +356,21 @@ void
calls_settings_set_preferred_audio_codecs (CallsSettings *self,
const char * const *codecs)
{
+ gboolean initial = TRUE;
+
g_return_if_fail (CALLS_IS_SETTINGS (self));
+ g_return_if_fail (codecs);
+
+ if (self->preferred_audio_codecs) {
+ initial = FALSE;
+
+ if (g_strv_equal (codecs, (const char * const *) self->preferred_audio_codecs))
+ return;
+ }
+
+ g_free (self->preferred_audio_codecs);
+ self->preferred_audio_codecs = g_strdupv ((char **) codecs);
- g_settings_set_strv (self->settings, "preferred-audio-codecs", codecs);
+ if (!initial)
+ g_object_notify_by_pspec (G_OBJECT (self), props[PROP_PREFERRED_AUDIO_CODECS]);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]