--- a/finch/gntprefs.c Fri Mar 31 00:48:38 2023 -0500
+++ b/finch/gntprefs.c Mon Apr 03 10:02:25 2023 -0500
@@ -33,7 +33,7 @@
- GList *freestrings; /* strings to be freed when the pref-window is closed */
+ GList *list_data; /* Data to be freed when the pref-window is closed */ @@ -61,40 +61,47 @@
- GList *(*lv)(void); /* If the value is to be selected from a number of choices */
+ GList *(*choices)(void); /* If the value is to be selected from a number of choices */
+get_idle_options(void) { - list = g_list_append(list, (char *)_("Based on keyboard use"));
- list = g_list_append(list, "system");
- list = g_list_append(list, (char*)_("From last sent message"));
- list = g_list_append(list, "purple");
- list = g_list_append(list, (char*)_("Never"));
- list = g_list_append(list, "never");
+ PurpleKeyValuePair *pair = NULL; + pair = purple_key_value_pair_new(_("Based on keyboard use"), "system"); + list = g_list_append(list, pair); + pair = purple_key_value_pair_new(_("From last sent message"), "purple"); + list = g_list_append(list, pair); + pair = purple_key_value_pair_new(_("Never"), "never"); + list = g_list_append(list, pair);
+get_status_titles(void) {
- for (iter = purple_savedstatuses_get_all(); iter; iter = iter->next) {
- if (purple_savedstatus_is_transient(iter->data))
+ for(GList *iter = purple_savedstatuses_get_all(); iter; iter = iter->next) { + PurpleKeyValuePair *pair = NULL; + const char *title = NULL; + if(purple_savedstatus_is_transient(iter->data)) { str = g_strdup_printf("%ld", purple_savedstatus_get_creation_time(iter->data));
- list = g_list_append(list, (char*)purple_savedstatus_get_title(iter->data));
- list = g_list_append(list, str);
- pref_request.freestrings = g_list_prepend(pref_request.freestrings, str);
+ title = purple_savedstatus_get_title(iter->data); + pair = purple_key_value_pair_new_full(title, str, g_free); + list = g_list_append(list, pair); @@ -104,13 +111,13 @@
- const gchar *value = NULL;
+ PurpleKeyValuePair *pair = NULL; - value = purple_credential_provider_get_name(provider);
- *list = g_list_append(*list, (gpointer)value);
- value = purple_credential_provider_get_id(provider);
- *list = g_list_append(*list, (gpointer)value);
+ name = purple_credential_provider_get_name(provider); + id = purple_credential_provider_get_id(provider); + pair = purple_key_value_pair_new(name, (gpointer)id); + *list = g_list_append(*list, pair); @@ -127,109 +134,148 @@
static PurpleRequestField *
-get_pref_field(Prefs *prefs)
+get_pref_field(Prefs *prefs) { PurpleRequestField *field = NULL;
+ if(prefs->choices == NULL) { case PURPLE_PREF_BOOLEAN:
- field = purple_request_field_bool_new(prefs->pref, _(prefs->label),
- purple_prefs_get_bool(prefs->pref));
+ field = purple_request_field_bool_new(prefs->pref, + purple_prefs_get_bool(prefs->pref)); - field = purple_request_field_int_new(prefs->pref, _(prefs->label),
- purple_prefs_get_int(prefs->pref), INT_MIN, INT_MAX);
+ field = purple_request_field_int_new(prefs->pref, + purple_prefs_get_int(prefs->pref), - field = purple_request_field_string_new(prefs->pref, _(prefs->label),
- purple_prefs_get_string(prefs->pref), FALSE);
+ field = purple_request_field_string_new(prefs->pref, + purple_prefs_get_string(prefs->pref),
- PurpleRequestFieldList *lfield = NULL;
+ PurpleRequestFieldChoice *choice = NULL;
+ list = prefs->choices(); - field = purple_request_field_list_new(prefs->pref, _(prefs->label));
- lfield = PURPLE_REQUEST_FIELD_LIST(field);
+ field = purple_request_field_choice_new(prefs->pref, + _(prefs->label), NULL); + choice = PURPLE_REQUEST_FIELD_CHOICE(field); for(GList *iter = list; iter; iter = iter->next) {
+ PurpleKeyValuePair *pair = iter->data; - const char *data = iter->data;
case PURPLE_PREF_BOOLEAN:
- if (sscanf(iter->data, "%d", &idata) != 1)
+ if(sscanf(pair->value, "%d", &idata) != 1) { - if (purple_prefs_get_bool(prefs->pref) == idata)
+ if(purple_prefs_get_bool(prefs->pref) == idata) { - if (sscanf(iter->data, "%d", &idata) != 1)
+ if(sscanf(pair->value, "%d", &idata) != 1) { - if (purple_prefs_get_int(prefs->pref) == idata)
+ if(purple_prefs_get_int(prefs->pref) == idata) { - if (purple_strequal(purple_prefs_get_string(prefs->pref), iter->data))
+ if(purple_strequal(purple_prefs_get_string(prefs->pref), - purple_request_field_list_add_icon(lfield, data, NULL, iter->data);
+ purple_request_field_choice_add(choice, pair->key, pair->value); - purple_request_field_list_add_selected(lfield, data);
+ purple_request_field_choice_set_default_value(choice, + purple_request_field_choice_set_value(choice, pair->value);
+ pref_request.list_data = g_list_concat(pref_request.list_data, list);
- {PURPLE_PREF_BOOLEAN, "/finch/blist/idletime", N_("Show Idle Time"), NULL},
- {PURPLE_PREF_BOOLEAN, "/finch/blist/showoffline", N_("Show Offline Buddies"), NULL},
- {PURPLE_PREF_NONE, NULL, NULL, NULL}
+static Prefs blist[] = { + .type = PURPLE_PREF_BOOLEAN, + .pref = "/finch/blist/idletime", + .label = N_("Show Idle Time"), + .type = PURPLE_PREF_BOOLEAN, + .pref = "/finch/blist/showoffline", + .label = N_("Show Offline Buddies"),
- {PURPLE_PREF_BOOLEAN, "/finch/conversations/timestamps", N_("Show Timestamps"), NULL},
- {PURPLE_PREF_BOOLEAN, "/finch/conversations/notify_typing", N_("Notify buddies when you are typing"), NULL},
- {PURPLE_PREF_NONE, NULL, NULL, NULL}
+static Prefs convs[] = { + .type = PURPLE_PREF_BOOLEAN, + .pref = "/finch/conversations/timestamps", + .label = N_("Show Timestamps"), + .type = PURPLE_PREF_BOOLEAN, + .pref = "/finch/conversations/notify_typing", + .label = N_("Notify buddies when you are typing"),
- {PURPLE_PREF_STRING, "/purple/away/idle_reporting", N_("Report Idle time"), get_idle_options},
- {PURPLE_PREF_BOOLEAN, "/purple/away/away_when_idle", N_("Change status when idle"), NULL},
- {PURPLE_PREF_INT, "/purple/away/mins_before_away", N_("Minutes before changing status"), NULL},
- {PURPLE_PREF_INT, "/purple/savedstatus/idleaway", N_("Change status to"), get_status_titles},
- {PURPLE_PREF_NONE, NULL, NULL, NULL},
+ .type = PURPLE_PREF_STRING, + .pref = "/purple/away/idle_reporting", + .label = N_("Report Idle time"), + .choices = get_idle_options, + .type = PURPLE_PREF_BOOLEAN, + .pref = "/purple/away/away_when_idle", + .label = N_("Change status when idle"), + .type = PURPLE_PREF_INT, + .pref = "/purple/away/mins_before_away", + .label = N_("Minutes before changing status"), + .type = PURPLE_PREF_INT, + .pref = "/purple/savedstatus/idleaway", + .label = N_("Change status to"), + .choices = get_status_titles, -static Prefs credentials[] =
- {PURPLE_PREF_STRING, "/purple/credentials/active-provider", N_("Provider"), get_credential_provider_options},
- {PURPLE_PREF_NONE, NULL, NULL, NULL},
+static Prefs credentials[] = { + .type = PURPLE_PREF_STRING, + .pref = "/purple/credentials/active-provider", + .label = N_("Provider"), + .choices = get_credential_provider_options, - g_clear_list(&pref_request.freestrings, g_free);
+ g_clear_list(&pref_request.list_data, + (GDestroyNotify)purple_key_value_pair_free); pref_request.showing = FALSE;
@@ -240,18 +286,20 @@
-add_pref_group(PurpleRequestPage *page, const char *title, Prefs *prefs) {
- PurpleRequestField *field;
- PurpleRequestGroup *group;
+add_pref_group(PurpleRequestPage *page, const char *title, Prefs *prefs, + PurpleRequestGroup *group = NULL; group = purple_request_group_new(title);
purple_request_page_add_group(page, group);
- for (i = 0; prefs[i].pref; i++)
- field = get_pref_field(prefs + i);
+ for(guint i = 0; i < n_prefs; i++) { + PurpleRequestField *field = get_pref_field(&prefs[i]); + if(PURPLE_IS_REQUEST_FIELD(field)) { purple_request_group_add_field(group, field);
@@ -267,10 +315,11 @@
page = purple_request_page_new();
- add_pref_group(page, _("Buddy List"), blist);
- add_pref_group(page, _("Conversations"), convs);
- add_pref_group(page, _("Idle"), idle);
- add_pref_group(page, _("Credentials"), credentials);
+ add_pref_group(page, _("Buddy List"), blist, G_N_ELEMENTS(blist)); + add_pref_group(page, _("Conversations"), convs, G_N_ELEMENTS(convs)); + add_pref_group(page, _("Idle"), idle, G_N_ELEMENTS(idle)); + add_pref_group(page, _("Credentials"), credentials, + G_N_ELEMENTS(credentials)); pref_request.showing = TRUE;
pref_request.window = purple_request_fields(NULL, _("Preferences"), NULL, NULL, page,
--- a/finch/gntrequest.c Fri Mar 31 00:48:38 2023 -0500
+++ b/finch/gntrequest.c Mon Apr 03 10:02:25 2023 -0500
@@ -907,7 +907,10 @@
field = g_list_model_get_item(group, field_index);
id = purple_request_field_get_id(field);
- if(PURPLE_IS_REQUEST_FIELD_LIST(field)) {
+ if(PURPLE_IS_REQUEST_FIELD_CHOICE(field)) { + PurpleRequestFieldChoice *choice = PURPLE_REQUEST_FIELD_CHOICE(field); + val = purple_request_field_choice_get_value(choice); + } else if(PURPLE_IS_REQUEST_FIELD_LIST(field)) { PurpleRequestFieldList *lfield = PURPLE_REQUEST_FIELD_LIST(field);
val = purple_request_field_list_get_selected(lfield)->data;
val = purple_request_field_list_get_data(lfield, val);