aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanielle Madeley <danielle.madeley@collabora.co.uk>2011-03-01 12:19:36 +0800
committerEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>2011-03-19 02:49:54 +0800
commitf921e3446d5bf0f6e704b20033d5884fd5fd2558 (patch)
tree97308031d36a786c1c2ff190292e4b7e2039b8d0
parent7e1fd85aaff87fbbae2f3ebfbd395534b4b335d3 (diff)
downloadgsoc2013-empathy-f921e3446d5bf0f6e704b20033d5884fd5fd2558.tar
gsoc2013-empathy-f921e3446d5bf0f6e704b20033d5884fd5fd2558.tar.gz
gsoc2013-empathy-f921e3446d5bf0f6e704b20033d5884fd5fd2558.tar.bz2
gsoc2013-empathy-f921e3446d5bf0f6e704b20033d5884fd5fd2558.tar.lz
gsoc2013-empathy-f921e3446d5bf0f6e704b20033d5884fd5fd2558.tar.xz
gsoc2013-empathy-f921e3446d5bf0f6e704b20033d5884fd5fd2558.tar.zst
gsoc2013-empathy-f921e3446d5bf0f6e704b20033d5884fd5fd2558.zip
Track changes to privacy settings coming from Psyke
-rw-r--r--libempathy-gtk/empathy-account-widget.c150
1 files changed, 110 insertions, 40 deletions
diff --git a/libempathy-gtk/empathy-account-widget.c b/libempathy-gtk/empathy-account-widget.c
index 84bbe9ef8..044522b74 100644
--- a/libempathy-gtk/empathy-account-widget.c
+++ b/libempathy-gtk/empathy-account-widget.c
@@ -1544,6 +1544,67 @@ account_widget_skype_toggle_changed_cb (GtkToggleButton *toggle,
}
static void
+account_widget_skype_set_value (EmpathyAccountWidget *self,
+ GtkWidget *widget,
+ GValue *value)
+{
+ g_return_if_fail (value != NULL);
+
+ if (GTK_IS_COMBO_BOX (widget))
+ {
+ GtkTreeModel *model =
+ gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
+ guint prop_value;
+ GtkTreeIter iter;
+ gboolean valid;
+
+ g_return_if_fail (G_VALUE_HOLDS_UINT (value));
+
+ prop_value = g_value_get_uint (value);
+
+ g_signal_handlers_block_by_func (widget,
+ account_widget_skype_combo_changed_cb, self);
+
+ for (valid = gtk_tree_model_get_iter_first (model, &iter);
+ valid;
+ valid = gtk_tree_model_iter_next (model, &iter))
+ {
+ guint v;
+
+ gtk_tree_model_get (model, &iter,
+ PS_COL_ENUM_VALUE, &v,
+ -1);
+
+ if (v == prop_value)
+ {
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
+ break;
+ }
+ }
+
+ g_signal_handlers_unblock_by_func (widget,
+ account_widget_skype_combo_changed_cb, self);
+ }
+ else if (GTK_IS_TOGGLE_BUTTON (widget))
+ {
+ g_return_if_fail (G_VALUE_HOLDS_BOOLEAN (value));
+
+ g_signal_handlers_block_by_func (widget,
+ account_widget_skype_toggle_changed_cb, self);
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget),
+ g_value_get_boolean (value));
+
+ g_signal_handlers_unblock_by_func (widget,
+ account_widget_skype_toggle_changed_cb, self);
+ }
+ else
+ {
+ g_assert_not_reached ();
+ }
+}
+
+static void
account_widget_build_skype_get_privacy_settings_cb (TpProxy *cm,
GHashTable *props,
const GError *in_error,
@@ -1580,50 +1641,51 @@ account_widget_build_skype_get_privacy_settings_cb (TpProxy *cm,
DEBUG ("Widget '%s' (%s), prop = %s",
widgets[i], G_OBJECT_TYPE_NAME (widget), prop_name);
- if (GTK_IS_COMBO_BOX (widget))
- {
- GtkTreeModel *model =
- gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
- GtkTreeIter iter;
- gboolean valid;
-
- guint prop_value = tp_asv_get_uint32 (props, prop_name, NULL);
+ account_widget_skype_set_value (self, widget,
+ g_hash_table_lookup (props, prop_name));
+ }
+}
- DEBUG ("prop_value = %u", prop_value);
+static void
+account_widget_skype_properties_changed_cb (TpProxy *conn,
+ const char *interface,
+ GHashTable *props,
+ const char **invalidated,
+ gpointer user_data,
+ GObject *weak_obj)
+{
+ EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (weak_obj);
+ GtkWidget *table = user_data;
+ GHashTableIter iter;
+ const char *prop;
+ GValue *value;
- for (valid = gtk_tree_model_get_iter_first (model, &iter);
- valid;
- valid = gtk_tree_model_iter_next (model, &iter))
- {
- guint v;
+ g_hash_table_iter_init (&iter, props);
+ while (g_hash_table_iter_next (&iter, (gpointer) &prop, (gpointer) &value))
+ {
+ GList *children, *ptr;
- gtk_tree_model_get (model, &iter,
- PS_COL_ENUM_VALUE, &v,
- -1);
+ DEBUG ("Property changed: %s", prop);
- if (v == prop_value)
- {
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
- break;
- }
- }
+ /* find this value in the widget tree */
+ children = gtk_container_get_children (GTK_CONTAINER (table));
- g_signal_connect (widget, "changed",
- G_CALLBACK (account_widget_skype_combo_changed_cb), self);
- }
- else if (GTK_IS_TOGGLE_BUTTON (widget))
+ for (ptr = children; ptr != NULL; ptr = ptr->next)
{
- gboolean prop_value = tp_asv_get_boolean (props, prop_name, NULL);
+ GtkWidget *widget = ptr->data;
+ const char *prop_name = g_object_get_data (G_OBJECT (widget),
+ "dbus-property");
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), prop_value);
+ if (!tp_strdiff (prop_name, prop))
+ {
+ DEBUG ("Got child %p (%s)", widget, G_OBJECT_TYPE_NAME (widget));
- g_signal_connect (widget, "toggled",
- G_CALLBACK (account_widget_skype_toggle_changed_cb), self);
- }
- else
- {
- g_assert_not_reached ();
+ account_widget_skype_set_value (self, widget, value);
+ break;
+ }
}
+
+ g_list_free (children);
}
}
@@ -1634,7 +1696,8 @@ account_widget_build_skype_get_privacy_settings_cb (TpProxy *cm,
* @first_option: a list of options from the enum, terminated by -1
*/
static void
-account_widget_build_skype_setup_combo (GtkBuilder *gui,
+account_widget_build_skype_setup_combo (EmpathyAccountWidget *self,
+ GtkBuilder *gui,
const char *widget,
const char *prop_name,
int first_option,
@@ -1675,6 +1738,8 @@ account_widget_build_skype_setup_combo (GtkBuilder *gui,
va_end (var_args);
g_object_set_data (G_OBJECT (combo), "dbus-property", (gpointer) prop_name);
+ g_signal_connect (combo, "changed",
+ G_CALLBACK (account_widget_skype_combo_changed_cb), self);
}
static gboolean
@@ -1750,23 +1815,23 @@ account_widget_skype_privacy_settings (GtkWidget *button,
g_object_bind_property (table, "sensitive", infobar, "visible",
G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN);
- account_widget_build_skype_setup_combo (gui,
+ account_widget_build_skype_setup_combo (self, gui,
"allow-text-chats-from", "AllowTextChannelsFrom",
EMP_PRIVACY_SETTING_ANYONE,
EMP_PRIVACY_SETTING_CONTACTS,
-1);
- account_widget_build_skype_setup_combo (gui,
+ account_widget_build_skype_setup_combo (self, gui,
"allow-skype-calls-from", "AllowCallChannelsFrom",
EMP_PRIVACY_SETTING_ANYONE,
EMP_PRIVACY_SETTING_CONTACTS,
-1);
- account_widget_build_skype_setup_combo (gui,
+ account_widget_build_skype_setup_combo (self, gui,
"allow-outside-calls-from", "AllowOutsideCallsFrom",
EMP_PRIVACY_SETTING_ANYONE,
EMP_PRIVACY_SETTING_KNOWN_NUMBERS,
EMP_PRIVACY_SETTING_CONTACTS,
-1);
- account_widget_build_skype_setup_combo (gui,
+ account_widget_build_skype_setup_combo (self, gui,
"show-my-avatar-to", "ShowMyAvatarTo",
EMP_PRIVACY_SETTING_ANYONE,
EMP_PRIVACY_SETTING_CONTACTS,
@@ -1774,6 +1839,8 @@ account_widget_skype_privacy_settings (GtkWidget *button,
g_object_set_data (G_OBJECT (show_my_web_status), "dbus-property",
"ShowMyWebStatus");
+ g_signal_connect (show_my_web_status, "toggled",
+ G_CALLBACK (account_widget_skype_toggle_changed_cb), self);
/* get the current parameter values from psyke */
conn = tp_account_get_connection (
@@ -1784,6 +1851,9 @@ account_widget_skype_privacy_settings (GtkWidget *button,
account_widget_build_skype_get_privacy_settings_cb,
g_object_ref (gui), g_object_unref,
G_OBJECT (self));
+ tp_cli_dbus_properties_connect_to_properties_changed (conn,
+ account_widget_skype_properties_changed_cb,
+ table, NULL, G_OBJECT (self), NULL);
g_object_unref (gui);