| 38 ADW_TYPE_PREFERENCES_PAGE) |
38 ADW_TYPE_PREFERENCES_PAGE) |
| 39 |
39 |
| 40 /****************************************************************************** |
40 /****************************************************************************** |
| 41 * Helpers |
41 * Helpers |
| 42 *****************************************************************************/ |
42 *****************************************************************************/ |
| 43 static void |
43 static GtkWidget * |
| 44 pidgin_credential_prefs_create_row(PurpleCredentialProvider *provider, |
44 pidgin_credential_prefs_create_row(GObject *item, |
| 45 gpointer data) |
45 G_GNUC_UNUSED gpointer data) |
| 46 { |
46 { |
| 47 GtkListBox *box = GTK_LIST_BOX(data); |
47 return pidgin_credential_provider_row_new(PURPLE_CREDENTIAL_PROVIDER(item)); |
| 48 GtkWidget *row = NULL; |
|
| 49 |
|
| 50 row = pidgin_credential_provider_row_new(provider); |
|
| 51 gtk_list_box_prepend(box, row); |
|
| 52 } |
48 } |
| 53 |
49 |
| 54 static gint |
50 static int |
| 55 pidgin_credential_prefs_sort_rows(GtkListBoxRow *row1, GtkListBoxRow *row2, |
51 pidgin_credential_prefs_sort_rows(gconstpointer a, gconstpointer b, |
| 56 G_GNUC_UNUSED gpointer user_data) |
52 G_GNUC_UNUSED gpointer user_data) |
| 57 { |
53 { |
| 58 PidginCredentialProviderRow *pcprow = NULL; |
54 PurpleCredentialProvider *provider_a = (gpointer)a; |
| 59 PurpleCredentialProvider *provider = NULL; |
55 PurpleCredentialProvider *provider_b = (gpointer)b; |
| 60 const gchar *id1 = NULL; |
56 const char *id1 = NULL; |
| 61 gboolean is_noop1 = FALSE; |
57 gboolean is_noop1 = FALSE; |
| 62 const gchar *id2 = NULL; |
58 const char *id2 = NULL; |
| 63 gboolean is_noop2 = FALSE; |
59 gboolean is_noop2 = FALSE; |
| 64 |
60 |
| 65 pcprow = PIDGIN_CREDENTIAL_PROVIDER_ROW(row1); |
61 id1 = purple_credential_provider_get_id(provider_a); |
| 66 provider = pidgin_credential_provider_row_get_provider(pcprow); |
|
| 67 id1 = purple_credential_provider_get_id(provider); |
|
| 68 is_noop1 = purple_strequal(id1, "noop-provider"); |
62 is_noop1 = purple_strequal(id1, "noop-provider"); |
| 69 |
63 |
| 70 pcprow = PIDGIN_CREDENTIAL_PROVIDER_ROW(row2); |
64 id2 = purple_credential_provider_get_id(provider_b); |
| 71 provider = pidgin_credential_provider_row_get_provider(pcprow); |
|
| 72 id2 = purple_credential_provider_get_id(provider); |
|
| 73 is_noop2 = purple_strequal(id2, "noop-provider"); |
65 is_noop2 = purple_strequal(id2, "noop-provider"); |
| 74 |
66 |
| 75 /* Sort None provider after everything else. */ |
67 /* Sort None provider after everything else. */ |
| 76 if (is_noop1 && is_noop2) { |
68 if (is_noop1 && is_noop2) { |
| 77 return 0; |
69 return 0; |
| 78 } else if (is_noop1 && !is_noop2) { |
70 } else if (is_noop1 && !is_noop2) { |
| 79 return 1; |
71 return 1; |
| 80 } else if (!is_noop1 && is_noop2) { |
72 } else if (!is_noop1 && is_noop2) { |
| 81 return -1; |
73 return -1; |
| 82 } |
74 } |
| |
75 |
| 83 /* Sort normally by ID. */ |
76 /* Sort normally by ID. */ |
| 84 return g_strcmp0(id1, id2); |
77 return g_strcmp0(id1, id2); |
| 85 } |
78 } |
| 86 |
79 |
| 87 static void |
80 static void |
| 89 GtkListBoxRow *row, |
82 GtkListBoxRow *row, |
| 90 G_GNUC_UNUSED gpointer data) |
83 G_GNUC_UNUSED gpointer data) |
| 91 { |
84 { |
| 92 PurpleCredentialManager *manager = NULL; |
85 PurpleCredentialManager *manager = NULL; |
| 93 PurpleCredentialProvider *provider = NULL; |
86 PurpleCredentialProvider *provider = NULL; |
| 94 const gchar *id = NULL; |
87 const char *id = NULL; |
| 95 GError *error = NULL; |
88 GError *error = NULL; |
| 96 |
89 |
| 97 provider = pidgin_credential_provider_row_get_provider( |
90 provider = pidgin_credential_provider_row_get_provider( |
| 98 PIDGIN_CREDENTIAL_PROVIDER_ROW(row)); |
91 PIDGIN_CREDENTIAL_PROVIDER_ROW(row)); |
| 99 id = purple_credential_provider_get_id(provider); |
92 id = purple_credential_provider_get_id(provider); |
| 146 *****************************************************************************/ |
139 *****************************************************************************/ |
| 147 static void |
140 static void |
| 148 pidgin_credential_prefs_init(PidginCredentialPrefs *prefs) { |
141 pidgin_credential_prefs_init(PidginCredentialPrefs *prefs) { |
| 149 PurpleCredentialManager *manager = NULL; |
142 PurpleCredentialManager *manager = NULL; |
| 150 PurpleCredentialProvider *active = NULL; |
143 PurpleCredentialProvider *active = NULL; |
| |
144 GtkCustomSorter *sorter = NULL; |
| |
145 GtkSortListModel *sorted = NULL; |
| |
146 GListModel *model = NULL; |
| 151 |
147 |
| 152 gtk_widget_init_template(GTK_WIDGET(prefs)); |
148 gtk_widget_init_template(GTK_WIDGET(prefs)); |
| 153 |
149 |
| |
150 sorter = gtk_custom_sorter_new(pidgin_credential_prefs_sort_rows, NULL, |
| |
151 NULL); |
| |
152 |
| |
153 model = purple_credential_manager_get_default_as_model(); |
| |
154 sorted = gtk_sort_list_model_new(model, GTK_SORTER(sorter)); |
| |
155 gtk_list_box_bind_model(GTK_LIST_BOX(prefs->credential_list), |
| |
156 G_LIST_MODEL(sorted), |
| |
157 (GtkListBoxCreateWidgetFunc)pidgin_credential_prefs_create_row, |
| |
158 prefs->credential_list, NULL); |
| |
159 |
| 154 manager = purple_credential_manager_get_default(); |
160 manager = purple_credential_manager_get_default(); |
| 155 purple_credential_manager_foreach( |
|
| 156 manager, |
|
| 157 pidgin_credential_prefs_create_row, |
|
| 158 prefs->credential_list); |
|
| 159 gtk_list_box_set_sort_func(GTK_LIST_BOX(prefs->credential_list), |
|
| 160 pidgin_credential_prefs_sort_rows, NULL, NULL); |
|
| 161 |
|
| 162 g_signal_connect_object(manager, "active-changed", |
161 g_signal_connect_object(manager, "active-changed", |
| 163 G_CALLBACK(pidgin_credential_prefs_active_provider_changed_cb), |
162 G_CALLBACK(pidgin_credential_prefs_active_provider_changed_cb), |
| 164 prefs, 0); |
163 prefs, 0); |
| 165 |
164 |
| 166 active = purple_credential_manager_get_active(manager); |
165 active = purple_credential_manager_get_active(manager); |