pidgin/gtkprefs.c

changeset 39749
e2dd6507d83e
parent 39748
afe5a040286c
child 39750
1ead9afaa71e
--- a/pidgin/gtkprefs.c	Mon Aug 05 04:01:58 2019 -0400
+++ b/pidgin/gtkprefs.c	Mon Aug 05 04:19:43 2019 -0400
@@ -210,6 +210,15 @@
 		GtkWidget *password;
 	} proxy;
 
+	/* Keyrings page */
+	struct {
+		PidginPrefCombo active;
+		GtkWidget *vbox;
+		PurpleRequestFields *settings;
+		GtkWidget *settings_box;
+		GtkWidget *apply;
+	} keyring;
+
 	/* Sounds page */
 	struct {
 		PidginPrefCombo method;
@@ -249,14 +258,6 @@
 static GtkWidget *prefs_smiley_themes_combo_box;
 static PurpleHttpConnection *prefs_themes_running_request = NULL;
 
-/* Keyrings page */
-static GtkWidget *keyring_page_instance = NULL;
-static GtkComboBox *keyring_combo = NULL;
-static GtkBox *keyring_vbox = NULL;
-static PurpleRequestFields *keyring_settings = NULL;
-static GtkBox *keyring_settings_box = NULL;
-static GtkWidget *keyring_apply = NULL;
-
 /* Sound theme specific */
 static int sound_row_sel = 0;
 static gboolean prefs_sound_themes_loading;
@@ -447,18 +448,15 @@
 	cb(combo_box, active);
 }
 
-static void pidgin_prefs_dropdown_revert_active(GtkComboBox *combo_box)
+static void
+pidgin_prefs_bind_dropdown_revert_active(PidginPrefCombo *combo)
 {
-	gint previously_active;
-
-	g_return_if_fail(combo_box != NULL);
-
-	previously_active = GPOINTER_TO_INT(g_object_get_data(
-		G_OBJECT(combo_box), "previously_active"));
-	g_object_set_data(G_OBJECT(combo_box), "current_active",
-		GINT_TO_POINTER(previously_active));
-
-	gtk_combo_box_set_active(combo_box, previously_active);
+	g_return_if_fail(combo != NULL);
+
+	combo->current_active = combo->previously_active;
+
+	gtk_combo_box_set_active(GTK_COMBO_BOX(combo->combo),
+	                         combo->previously_active);
 }
 
 static GtkWidget *
@@ -873,7 +871,7 @@
 			G_CALLBACK(set_bool_pref), (char *)key);
 }
 
-static void keyring_page_cleanup(void);
+static void keyring_page_cleanup(PidginPrefsWindow *win);
 
 static void
 delete_prefs(GtkWidget *asdf, void *gdsa)
@@ -895,7 +893,7 @@
 	prefs_status_themes_combo_box = NULL;
 	prefs_smiley_themes_combo_box = NULL;
 
-	keyring_page_cleanup();
+	keyring_page_cleanup(prefs);
 
 #ifdef USE_VV
 	voice_level = NULL;
@@ -2371,7 +2369,7 @@
 	PurpleRequestField *setting = _setting;
 	PurpleRequestFieldType field_type;
 
-	gtk_widget_set_sensitive(keyring_apply, TRUE);
+	gtk_widget_set_sensitive(prefs->keyring.apply, TRUE);
 
 	field_type = purple_request_field_get_field_type(setting);
 
@@ -2433,19 +2431,19 @@
 }
 
 /* XXX: it could be available for all plugins, not keyrings only */
-static GtkBox *
-keyring_page_add_settings(PurpleRequestFields *settings)
+static void
+keyring_page_add_settings(PidginPrefsWindow *win)
 {
-	GtkWidget *ret;
+	GtkWidget *box;
 	GList *it, *groups;
 	GtkSizeGroup *sg;
 
-	ret = gtk_box_new(GTK_ORIENTATION_VERTICAL, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(keyring_vbox, ret, FALSE, FALSE, 0);
+	box = gtk_box_new(GTK_ORIENTATION_VERTICAL, PIDGIN_HIG_BOX_SPACE);
+	gtk_box_pack_start(GTK_BOX(win->keyring.vbox), box, FALSE, FALSE, 0);
 
 	sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 
-	groups = purple_request_fields_get_groups(settings);
+	groups = purple_request_fields_get_groups(win->keyring.settings);
 	for (it = g_list_first(groups); it != NULL; it = g_list_next(it)) {
 		GList *it2, *fields;
 		GtkBox *vbox;
@@ -2455,9 +2453,9 @@
 		group = it->data;
 		group_title = purple_request_field_group_get_title(group);
 		if (group_title) {
-			vbox = GTK_BOX(pidgin_make_frame(ret, group_title));
+			vbox = GTK_BOX(pidgin_make_frame(box, group_title));
 		} else {
-			vbox = GTK_BOX(ret);
+			vbox = GTK_BOX(box);
 		}
 
 		fields = purple_request_field_group_get_fields(group);
@@ -2469,52 +2467,57 @@
 
 	g_object_unref(sg);
 
-	return GTK_BOX(ret);
+	win->keyring.settings_box = box;
 }
 
 static void
-keyring_page_settings_apply(GtkButton *button, gpointer _unused)
+keyring_page_settings_apply(GtkButton *button, gpointer data)
 {
-	if (!purple_keyring_apply_settings(prefs, keyring_settings))
+	PidginPrefsWindow *win = PIDGIN_PREFS_WINDOW(data);
+
+	if (!purple_keyring_apply_settings(win, win->keyring.settings)) {
 		return;
-
-	gtk_widget_set_sensitive(keyring_apply, FALSE);
+	}
+
+	gtk_widget_set_sensitive(win->keyring.apply, FALSE);
 }
 
 static void
-keyring_page_update_settings()
+keyring_page_update_settings(PidginPrefsWindow *win)
 {
-	if (keyring_settings != NULL)
-		purple_request_fields_destroy(keyring_settings);
-	keyring_settings = purple_keyring_read_settings();
-	if (!keyring_settings)
+	g_clear_pointer(&win->keyring.settings, purple_request_fields_destroy);
+	win->keyring.settings = purple_keyring_read_settings();
+	if (!win->keyring.settings) {
 		return;
-
-	keyring_settings_box = keyring_page_add_settings(keyring_settings);
-
-	keyring_apply = gtk_button_new_with_mnemonic(_("_Apply"));
-	gtk_box_pack_start(keyring_settings_box, keyring_apply, FALSE, FALSE, 1);
-	gtk_widget_set_sensitive(keyring_apply, FALSE);
-	g_signal_connect(G_OBJECT(keyring_apply), "clicked",
-		G_CALLBACK(keyring_page_settings_apply), NULL);
-
-	gtk_widget_show_all(keyring_page_instance);
+	}
+
+	keyring_page_add_settings(win);
+
+	win->keyring.apply = gtk_button_new_with_mnemonic(_("_Apply"));
+	gtk_box_pack_start(GTK_BOX(win->keyring.settings_box),
+	                   win->keyring.apply, FALSE, FALSE, 1);
+	gtk_widget_set_sensitive(win->keyring.apply, FALSE);
+	g_signal_connect(G_OBJECT(win->keyring.apply), "clicked",
+	                 G_CALLBACK(keyring_page_settings_apply), win);
+
+	gtk_widget_show_all(win->keyring.settings_box);
 }
 
 static void
-keyring_page_pref_set_inuse(GError *error, gpointer _keyring_page_instance)
+keyring_page_pref_set_inuse(GError *error, G_GNUC_UNUSED gpointer unused)
 {
 	PurpleKeyring *in_use = purple_keyring_get_inuse();
 
-	if (_keyring_page_instance != keyring_page_instance) {
+	if (prefs == NULL) {
 		purple_debug_info("gtkprefs", "pref window already closed\n");
 		return;
 	}
 
-	gtk_widget_set_sensitive(GTK_WIDGET(keyring_combo), TRUE);
+	gtk_widget_set_sensitive(GTK_WIDGET(prefs->keyring.active.combo), TRUE);
 
 	if (error != NULL) {
-		pidgin_prefs_dropdown_revert_active(keyring_combo);
+		pidgin_prefs_bind_dropdown_revert_active(
+		        &prefs->keyring.active);
 		purple_notify_error(NULL, _("Keyring"),
 			_("Failed to set new keyring"), error->message, NULL);
 		return;
@@ -2524,22 +2527,21 @@
 	purple_prefs_set_string("/purple/keyring/active",
 		purple_keyring_get_id(in_use));
 
-	keyring_page_update_settings();
+	keyring_page_update_settings(prefs);
 }
 
 static void
-keyring_page_pref_changed(GtkComboBox *combo_box, PidginPrefValue value)
+keyring_page_pref_changed(GtkComboBox *combo_box, PidginPrefCombo *combo)
 {
 	const char *keyring_id;
 	PurpleKeyring *keyring;
 
 	g_return_if_fail(combo_box != NULL);
-	g_return_if_fail(value.type == PURPLE_PREF_STRING);
-
-	keyring_id = value.value.string;
+
+	keyring_id = combo->value.string;
 	keyring = purple_keyring_find_keyring_by_id(keyring_id);
 	if (keyring == NULL) {
-		pidgin_prefs_dropdown_revert_active(keyring_combo);
+		pidgin_prefs_bind_dropdown_revert_active(combo);
 		purple_notify_error(NULL, _("Keyring"),
 			_("Selected keyring is disabled"), NULL, NULL);
 		return;
@@ -2547,58 +2549,35 @@
 
 	gtk_widget_set_sensitive(GTK_WIDGET(combo_box), FALSE);
 
-	g_clear_pointer(&keyring_settings_box, gtk_widget_destroy);
-	gtk_widget_show_all(keyring_page_instance);
-	if (keyring_settings)
-		purple_request_fields_destroy(keyring_settings);
-	keyring_settings = NULL;
+	g_clear_pointer(&prefs->keyring.settings_box, gtk_widget_destroy);
+	g_clear_pointer(&prefs->keyring.settings,
+	                purple_request_fields_destroy);
 
 	purple_keyring_set_inuse(keyring, FALSE, keyring_page_pref_set_inuse,
-		keyring_page_instance);
+	                         NULL);
+}
+
+static void
+keyring_page_cleanup(PidginPrefsWindow *win)
+{
+	g_clear_pointer(&win->keyring.settings, purple_request_fields_destroy);
 }
 
 static void
-keyring_page_cleanup(void)
-{
-	keyring_page_instance = NULL;
-	keyring_combo = NULL;
-	keyring_vbox = NULL;
-	keyring_settings_box = NULL;
-	if (keyring_settings)
-		purple_request_fields_destroy(keyring_settings);
-	keyring_settings = NULL;
-	keyring_apply = NULL;
-}
-
-static GtkWidget *
-keyring_page(void)
+bind_keyring_page(PidginPrefsWindow *win)
 {
 	GList *names;
-	PidginPrefValue initial;
-
-	g_return_val_if_fail(keyring_page_instance == NULL,
-		keyring_page_instance);
-
-	keyring_page_instance = gtk_box_new(GTK_ORIENTATION_VERTICAL, PIDGIN_HIG_CAT_SPACE);
-	gtk_container_set_border_width(GTK_CONTAINER(keyring_page_instance),
-		PIDGIN_HIG_BORDER);
 
 	/* Keyring selection */
-	keyring_vbox = GTK_BOX(pidgin_make_frame(keyring_page_instance,
-		_("Keyring")));
 	names = purple_keyring_get_options();
-	initial.type = PURPLE_PREF_STRING;
-	initial.value.string = purple_prefs_get_string("/purple/keyring/active");
-	pidgin_prefs_dropdown_from_list_with_cb(GTK_WIDGET(keyring_vbox),
-		_("Keyring:"), &keyring_combo, names, initial,
-		keyring_page_pref_changed);
+	win->keyring.active.type = PURPLE_PREF_STRING;
+	win->keyring.active.key = "/purple/keyring/active";
+	pidgin_prefs_bind_dropdown_from_list(&win->keyring.active, names);
+	/* Override the usual callback to defer changing the pref. */
+	win->keyring.active.cb = keyring_page_pref_changed;
 	g_list_free(names);
 
-	keyring_page_update_settings();
-
-	gtk_widget_show_all(keyring_page_instance);
-
-	return keyring_page_instance;
+	keyring_page_update_settings(win);
 }
 
 /*** keyring page - end *************************************************/
@@ -3561,7 +3540,8 @@
 	notebook_page++;
 	bind_proxy_page(win);
 	notebook_page++;
-	prefs_notebook_add_page(notebook, _("Password Storage"), keyring_page(), notebook_page++);
+	bind_keyring_page(win);
+	notebook_page++;
 
 	bind_sound_page(win);
 	notebook_page++;
@@ -3785,6 +3765,12 @@
 	gtk_widget_class_bind_template_callback(widget_class,
 			proxy_print_option);
 
+	/* Keyrings page */
+	gtk_widget_class_bind_template_child(
+			widget_class, PidginPrefsWindow, keyring.active.combo);
+	gtk_widget_class_bind_template_child(
+			widget_class, PidginPrefsWindow, keyring.vbox);
+
 	/* Sounds page */
 	gtk_widget_class_bind_template_child(widget_class, PidginPrefsWindow,
 	                                     sound.method.combo);

mercurial