Fri, 10 Mar 2023 17:17:53 -0600
Convert PurpleRequestFieldList into a GObject
This also does an `hg cp`, though with all the renaming of the parameter names, maybe that wasn't as useful for tracking the diff.
Also could implement `GListModel`, but it takes arbitrary pointers too, so not right now.
Testing Done:
Compiled, and opened Request Fields from the Demo protocol.
Reviewed at https://reviews.imfreedom.org/r/2336/
--- a/finch/gntplugin.c Fri Mar 10 16:37:41 2023 -0600 +++ b/finch/gntplugin.c Fri Mar 10 17:17:53 2023 -0600 @@ -581,7 +581,8 @@ } field = purple_request_field_list_new(name, label); - purple_request_field_list_set_multi_select(field, FALSE); + purple_request_field_list_set_multi_select(PURPLE_REQUEST_FIELD_LIST(field), + FALSE); for (GList *list = purple_plugin_pref_get_choices(pref); list != NULL; list = list->next) { const PurpleKeyValuePair *choice = list->data; char *value = NULL; @@ -599,9 +600,12 @@ break; } stringlist = g_list_prepend(stringlist, value); - purple_request_field_list_add_icon(field, choice->key, NULL, value); - if (purple_strequal(value, current_value)) - purple_request_field_list_add_selected(field, choice->key); + purple_request_field_list_add_icon(PURPLE_REQUEST_FIELD_LIST(field), + choice->key, NULL, value); + if(purple_strequal(value, current_value)) { + purple_request_field_list_add_selected(PURPLE_REQUEST_FIELD_LIST(field), + choice->key); + } } g_free(current_value); } else {
--- a/finch/gntprefs.c Fri Mar 10 16:37:41 2023 -0600 +++ b/finch/gntprefs.c Fri Mar 10 17:17:53 2023 -0600 @@ -153,11 +153,15 @@ } else { - GList *list = prefs->lv(), *iter; - if (list) + PurpleRequestFieldList *lfield = NULL; + GList *list = NULL; + + list = prefs->lv(); + if(list != NULL) { field = purple_request_field_list_new(prefs->pref, _(prefs->label)); - for (iter = list; iter; iter = iter->next) - { + lfield = PURPLE_REQUEST_FIELD_LIST(field); + } + for(GList *iter = list; iter; iter = iter->next) { gboolean select = FALSE; const char *data = iter->data; int idata; @@ -183,9 +187,10 @@ default: break; } - purple_request_field_list_add_icon(field, data, NULL, iter->data); - if (select) - purple_request_field_list_add_selected(field, data); + purple_request_field_list_add_icon(lfield, data, NULL, iter->data); + if(select) { + purple_request_field_list_add_selected(lfield, data); + } } g_list_free(list); }
--- a/finch/gntrequest.c Fri Mar 10 16:37:41 2023 -0600 +++ b/finch/gntrequest.c Fri Mar 10 17:17:53 2023 -0600 @@ -290,7 +290,6 @@ for (; fields ; fields = fields->next) { PurpleRequestField *field = fields->data; - PurpleRequestFieldType type = purple_request_field_get_field_type(field); if (!purple_request_field_is_visible(field)) continue; if(PURPLE_IS_REQUEST_FIELD_BOOL(field)) { @@ -321,13 +320,11 @@ gpointer value = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)); purple_request_field_choice_set_value(PURPLE_REQUEST_FIELD_CHOICE(field), value); - } - else if (type == PURPLE_REQUEST_FIELD_LIST) - { + } else if(PURPLE_IS_REQUEST_FIELD_LIST(field)) { + PurpleRequestFieldList *lfield = PURPLE_REQUEST_FIELD_LIST(field); GList *selected = NULL; - GList *list = purple_request_field_list_get_items(field); - if (purple_request_field_list_get_multi_select(field)) - { + GList *list = purple_request_field_list_get_items(lfield); + if(purple_request_field_list_get_multi_select(lfield)) { GntWidget *tree = g_object_get_data(G_OBJECT(field), "finch-ui-data"); @@ -335,7 +332,9 @@ { PurpleKeyValuePair *item = list->data; const char *text = item->key; - gpointer key = purple_request_field_list_get_data(field, text); + gpointer key = NULL; + + key = purple_request_field_list_get_data(lfield, text); if (gnt_tree_get_choice(GNT_TREE(tree), key)) { selected = g_list_prepend(selected, (gpointer)text); } @@ -350,7 +349,9 @@ for (; list; list = list->next) { PurpleKeyValuePair *item = list->data; const char *text = item->key; - gpointer key = purple_request_field_list_get_data(field, text); + gpointer key = NULL; + + key = purple_request_field_list_get_data(lfield, text); if (key == data) { selected = g_list_prepend(selected, (gpointer)text); break; @@ -358,7 +359,7 @@ } } - purple_request_field_list_set_selected(field, selected); + purple_request_field_list_set_selected(lfield, selected); g_list_free(selected); } else if (PURPLE_IS_REQUEST_FIELD_ACCOUNT(field)) { @@ -488,20 +489,22 @@ static GntWidget* create_list_field(PurpleRequestField *field) { + PurpleRequestFieldList *lfield = PURPLE_REQUEST_FIELD_LIST(field); GntWidget *ret = NULL; - GList *list = purple_request_field_list_get_items(field); - if (purple_request_field_list_get_multi_select(field)) { + GList *list = purple_request_field_list_get_items(lfield); + if(purple_request_field_list_get_multi_select(lfield)) { GntWidget *tree = gnt_tree_new(); for (; list; list = list->next) { PurpleKeyValuePair *item = list->data; const char *text = item->key; - gpointer key = purple_request_field_list_get_data(field, text); + gpointer key = purple_request_field_list_get_data(lfield, text); gnt_tree_add_choice(GNT_TREE(tree), key, gnt_tree_create_row(GNT_TREE(tree), text), NULL, NULL); - if (purple_request_field_list_is_selected(field, text)) + if(purple_request_field_list_is_selected(lfield, text)) { gnt_tree_set_choice(GNT_TREE(tree), key, TRUE); + } } ret = tree; } @@ -513,10 +516,11 @@ { PurpleKeyValuePair *item = list->data; const char *text = item->key; - gpointer key = purple_request_field_list_get_data(field, text); + gpointer key = purple_request_field_list_get_data(lfield, text); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), key, text); - if (purple_request_field_list_is_selected(field, text)) + if(purple_request_field_list_is_selected(lfield, text)) { gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), key); + } } ret = combo; } @@ -641,7 +645,6 @@ for (; fields ; fields = fields->next) { PurpleRequestField *field = fields->data; - PurpleRequestFieldType type = purple_request_field_get_field_type(field); const char *label = purple_request_field_get_label(field); GntWidget *widget = NULL; @@ -669,7 +672,7 @@ widget = create_integer_field(field); } else if(PURPLE_IS_REQUEST_FIELD_CHOICE(field)) { widget = create_choice_field(field); - } else if (type == PURPLE_REQUEST_FIELD_LIST) { + } else if(PURPLE_IS_REQUEST_FIELD_LIST(field)) { widget = create_list_field(field); } else if(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field)) { accountlist = create_account_field(field); @@ -869,12 +872,15 @@ for (; fields ; fields = fields->next) { PurpleRequestField *field = fields->data; - PurpleRequestFieldType type = purple_request_field_get_field_type(field); PurplePrefType pt; gpointer val = NULL; const char *id = purple_request_field_get_id(field); - if(PURPLE_IS_REQUEST_FIELD_BOOL(field)) { + 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); + } else if(PURPLE_IS_REQUEST_FIELD_BOOL(field)) { PurpleRequestFieldBool *bfield = PURPLE_REQUEST_FIELD_BOOL(field); val = GINT_TO_POINTER(purple_request_field_bool_get_value(bfield)); } else if(PURPLE_IS_REQUEST_FIELD_INT(field)) { @@ -883,15 +889,6 @@ } else if(PURPLE_IS_REQUEST_FIELD_STRING(field)) { PurpleRequestFieldString *sfield = PURPLE_REQUEST_FIELD_STRING(field); val = (gpointer)purple_request_field_string_get_value(sfield); - } else { - switch (type) { - case PURPLE_REQUEST_FIELD_LIST: - val = purple_request_field_list_get_selected(field)->data; - val = purple_request_field_list_get_data(field, val); - break; - default: - break; - } } pt = purple_prefs_get_pref_type(id); @@ -899,7 +896,7 @@ case PURPLE_PREF_INT: { long int tmp = GPOINTER_TO_INT(val); - if (type == PURPLE_REQUEST_FIELD_LIST) { + if(PURPLE_IS_REQUEST_FIELD_LIST(field)) { /* Lists always return string */ if (sscanf(val, "%ld", &tmp) != 1) tmp = 0; @@ -933,16 +930,11 @@ ret = create_choice_field(field); } else if(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field)) { ret = create_account_field(field); + } else if(PURPLE_IS_REQUEST_FIELD_LIST(field)) { + ret = create_list_field(field); } else { - switch (purple_request_field_get_field_type(field)) { - case PURPLE_REQUEST_FIELD_LIST: - ret = create_list_field(field); - break; - default: - purple_debug_error("GntRequest", "Unimplemented request-field %d\n", - purple_request_field_get_field_type(field)); - break; - } + purple_debug_error("GntRequest", "Unimplemented request-field %s", + G_OBJECT_TYPE_NAME(field)); } return ret; }
--- a/libpurple/meson.build Fri Mar 10 16:37:41 2023 -0600 +++ b/libpurple/meson.build Fri Mar 10 17:17:53 2023 -0600 @@ -101,6 +101,7 @@ 'request/purplerequestfieldbool.c', 'request/purplerequestfieldchoice.c', 'request/purplerequestfieldint.c', + 'request/purplerequestfieldlist.c', 'request/purplerequestfieldstring.c', 'request-datasheet.c', 'roomlist.c', @@ -229,6 +230,7 @@ 'request/purplerequestfieldbool.h', 'request/purplerequestfieldchoice.h', 'request/purplerequestfieldint.h', + 'request/purplerequestfieldlist.h', 'request/purplerequestfieldstring.h', ]
--- a/libpurple/protocols/demo/purpledemoprotocolactions.c Fri Mar 10 16:37:41 2023 -0600 +++ b/libpurple/protocols/demo/purpledemoprotocolactions.c Fri Mar 10 17:17:53 2023 -0600 @@ -370,7 +370,7 @@ PurpleRequestPage *page) { PurpleAccount *account = NULL; - PurpleRequestField *field = NULL; + PurpleRequestFieldList *field = NULL; GList *list = NULL; const char *tmp = NULL; GString *info = NULL; @@ -401,7 +401,8 @@ tmp = (const char *)purple_request_page_get_choice(page, "choice"); g_string_append_printf(info, _("\tChoice: %s\n"), tmp); - field = purple_request_page_get_field(page, "list"); + field = PURPLE_REQUEST_FIELD_LIST(purple_request_page_get_field(page, + "list")); list = purple_request_field_list_get_selected(field); if(list != NULL) { tmp = (const char *)list->data; @@ -410,7 +411,8 @@ } g_string_append_printf(info, _("\tList: %s\n"), tmp); - field = purple_request_page_get_field(page, "multilist"); + field = PURPLE_REQUEST_FIELD_LIST(purple_request_page_get_field(page, + "multilist")); list = purple_request_field_list_get_selected(field); g_string_append(info, _("\tMulti-list: [")); while(list != NULL) { @@ -456,6 +458,7 @@ PurpleRequestGroup *group = NULL; PurpleRequestField *field = NULL; PurpleRequestFieldChoice *choice_field = NULL; + PurpleRequestFieldList *list_field = NULL; GBytes *icon = NULL; gconstpointer icon_data = NULL; gsize icon_len = 0; @@ -529,18 +532,20 @@ purple_request_group_add_field(group, field); field = purple_request_field_list_new("list", _("A list")); - purple_request_field_list_add_icon(field, _("foo"), NULL, "foo"); - purple_request_field_list_add_icon(field, _("bar"), NULL, "bar"); - purple_request_field_list_add_icon(field, _("baz"), NULL, "baz"); - purple_request_field_list_add_icon(field, _("quux"), NULL, "quux"); + list_field = PURPLE_REQUEST_FIELD_LIST(field); + purple_request_field_list_add_icon(list_field, _("foo"), NULL, "foo"); + purple_request_field_list_add_icon(list_field, _("bar"), NULL, "bar"); + purple_request_field_list_add_icon(list_field, _("baz"), NULL, "baz"); + purple_request_field_list_add_icon(list_field, _("quux"), NULL, "quux"); purple_request_group_add_field(group, field); field = purple_request_field_list_new("multilist", _("A multi-select list")); - purple_request_field_list_set_multi_select(field, TRUE); - purple_request_field_list_add_icon(field, _("foo"), NULL, "foo"); - purple_request_field_list_add_icon(field, _("bar"), NULL, "bar"); - purple_request_field_list_add_icon(field, _("baz"), NULL, "baz"); - purple_request_field_list_add_icon(field, _("quux"), NULL, "quux"); + list_field = PURPLE_REQUEST_FIELD_LIST(field); + purple_request_field_list_set_multi_select(list_field, TRUE); + purple_request_field_list_add_icon(list_field, _("foo"), NULL, "foo"); + purple_request_field_list_add_icon(list_field, _("bar"), NULL, "bar"); + purple_request_field_list_add_icon(list_field, _("baz"), NULL, "baz"); + purple_request_field_list_add_icon(list_field, _("quux"), NULL, "quux"); purple_request_group_add_field(group, field); /* This group will contain specialized fields. */
--- a/libpurple/protocols/facebook/util.c Fri Mar 10 16:37:41 2023 -0600 +++ b/libpurple/protocols/facebook/util.c Fri Mar 10 17:17:53 2023 -0600 @@ -302,14 +302,15 @@ gpointer data = request_data[2]; GSList *ret = NULL; PurpleBuddy *bdy; - PurpleRequestField *field; + PurpleRequestFieldList *field; if (func == NULL) { g_free(request_data); return; } - field = purple_request_page_get_field(page, "buddy"); + field = PURPLE_REQUEST_FIELD_LIST(purple_request_page_get_field(page, + "buddy")); select = purple_request_field_list_get_selected(field); for (l = select; l != NULL; l = l->next) { @@ -380,6 +381,7 @@ PurpleAccount *acct; PurpleRequestCommonParameters *cpar; PurpleRequestField *field; + PurpleRequestFieldList *list; PurpleRequestGroup *group; PurpleRequestPage *page; @@ -397,7 +399,8 @@ purple_request_page_add_group(page, group); field = purple_request_field_list_new("buddy", NULL); - purple_request_field_list_set_multi_select(field, multi); + list = PURPLE_REQUEST_FIELD_LIST(field); + purple_request_field_list_set_multi_select(list, multi); purple_request_field_set_required(field, TRUE); purple_request_group_add_field(group, field); @@ -405,7 +408,7 @@ name = purple_buddy_get_name(l->data); alias = purple_buddy_get_alias(l->data); str = g_strdup_printf("%s (%s)", alias, name); - purple_request_field_list_add_icon(field, str, NULL, l->data); + purple_request_field_list_add_icon(list, str, NULL, l->data); g_free(str); } @@ -416,7 +419,7 @@ items = g_list_append(items, str); } - purple_request_field_list_set_selected(field, items); + purple_request_field_list_set_selected(list, items); g_slist_free(buddies); g_list_free_full(items, g_free);
--- a/libpurple/protocols/jabber/xdata.c Fri Mar 10 16:37:41 2023 -0600 +++ b/libpurple/protocols/jabber/xdata.c Fri Mar 10 17:17:53 2023 -0600 @@ -116,13 +116,14 @@ case JABBER_X_DATA_LIST_SINGLE: case JABBER_X_DATA_LIST_MULTI: { - GList *selected = purple_request_field_list_get_selected(field); + PurpleRequestFieldList *lfield = PURPLE_REQUEST_FIELD_LIST(field); + GList *selected = purple_request_field_list_get_selected(lfield); char *value; fieldnode = purple_xmlnode_new_child(result, "field"); purple_xmlnode_set_attrib(fieldnode, "var", id); while(selected) { - value = purple_request_field_list_get_data(field, selected->data); + value = purple_request_field_list_get_data(lfield, selected->data); valuenode = purple_xmlnode_new_child(fieldnode, "value"); if(value) purple_xmlnode_insert_data(valuenode, value, -1); @@ -265,13 +266,15 @@ g_string_free(str, TRUE); } else if(purple_strequal(type, "list-single") || purple_strequal(type, "list-multi")) { + PurpleRequestFieldList *list_field = NULL; PurpleXmlNode *optnode; GList *selected = NULL; field = purple_request_field_list_new(var, label); + list_field = PURPLE_REQUEST_FIELD_LIST(field); if(purple_strequal(type, "list-multi")) { - purple_request_field_list_set_multi_select(field, TRUE); + purple_request_field_list_set_multi_select(list_field, TRUE); g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_LIST_MULTI)); } else { @@ -302,9 +305,10 @@ data->values = g_slist_prepend(data->values, value); - purple_request_field_list_add_icon(field, lbl, NULL, value); - if(g_list_find_custom(selected, value, (GCompareFunc)strcmp)) - purple_request_field_list_add_selected(field, lbl); + purple_request_field_list_add_icon(list_field, lbl, NULL, value); + if(g_list_find_custom(selected, value, (GCompareFunc)strcmp)) { + purple_request_field_list_add_selected(list_field, lbl); + } } purple_request_group_add_field(group, field);
--- a/libpurple/purplerequestfield.c Fri Mar 10 16:37:41 2023 -0600 +++ b/libpurple/purplerequestfield.c Fri Mar 10 17:17:53 2023 -0600 @@ -42,16 +42,6 @@ union { struct { - GList *items; - gboolean has_icons; - GHashTable *item_data; - GList *selected; - GHashTable *selected_table; - - gboolean multiple_selection; - } list; - - struct { unsigned int scale_x; unsigned int scale_y; char *buffer; @@ -206,13 +196,7 @@ g_free(priv->type_hint); g_free(priv->tooltip); - if(priv->type == PURPLE_REQUEST_FIELD_LIST) { - g_list_free_full(priv->u.list.items, - (GDestroyNotify)purple_key_value_pair_free); - g_list_free_full(priv->u.list.selected, g_free); - g_hash_table_destroy(priv->u.list.item_data); - g_hash_table_destroy(priv->u.list.selected_table); - } else if(priv->type == PURPLE_REQUEST_FIELD_DATASHEET) { + if(priv->type == PURPLE_REQUEST_FIELD_DATASHEET) { purple_request_datasheet_free(priv->u.datasheet.sheet); } else if(priv->type == PURPLE_REQUEST_FIELD_IMAGE) { g_free(priv->u.image.buffer); @@ -651,212 +635,6 @@ } PurpleRequestField * -purple_request_field_list_new(const char *id, const char *text) -{ - PurpleRequestField *field; - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(id != NULL, NULL); - - field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_LIST); - priv = purple_request_field_get_instance_private(field); - - priv->u.list.item_data = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, NULL); - - priv->u.list.selected_table = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, NULL); - - return field; -} - -void -purple_request_field_list_set_multi_select(PurpleRequestField *field, - gboolean multi_select) -{ - PurpleRequestFieldPrivate *priv = NULL; - - g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field)); - - priv = purple_request_field_get_instance_private(field); - g_return_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST); - - priv->u.list.multiple_selection = multi_select; -} - -gboolean -purple_request_field_list_get_multi_select(PurpleRequestField *field) { - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), FALSE); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST, FALSE); - - return priv->u.list.multiple_selection; -} - -void * -purple_request_field_list_get_data(PurpleRequestField *field, const char *text) -{ - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), NULL); - g_return_val_if_fail(text != NULL, NULL); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST, NULL); - - return g_hash_table_lookup(priv->u.list.item_data, text); -} - -void -purple_request_field_list_add_icon(PurpleRequestField *field, const char *item, const char* icon_path, - void *data) -{ - PurpleKeyValuePair *kvp; - PurpleRequestFieldPrivate *priv = NULL; - - g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field)); - g_return_if_fail(item != NULL); - g_return_if_fail(data != NULL); - - priv = purple_request_field_get_instance_private(field); - g_return_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST); - - priv->u.list.has_icons = priv->u.list.has_icons || (icon_path != NULL); - kvp = purple_key_value_pair_new_full(item, g_strdup(icon_path), g_free); - priv->u.list.items = g_list_append(priv->u.list.items, kvp); - g_hash_table_insert(priv->u.list.item_data, g_strdup(item), data); -} - -void -purple_request_field_list_add_selected(PurpleRequestField *field, const char *item) -{ - PurpleRequestFieldPrivate *priv = NULL; - - g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field)); - g_return_if_fail(item != NULL); - - priv = purple_request_field_get_instance_private(field); - g_return_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST); - - if(!purple_request_field_list_get_multi_select(field) && - priv->u.list.selected != NULL) - { - purple_debug_warning("request", - "More than one item added to non-multi-select " - "field %s\n", - purple_request_field_get_id(field)); - return; - } - - priv->u.list.selected = g_list_append(priv->u.list.selected, - g_strdup(item)); - - g_hash_table_add(priv->u.list.selected_table, g_strdup(item)); -} - -void -purple_request_field_list_clear_selected(PurpleRequestField *field) -{ - PurpleRequestFieldPrivate *priv = NULL; - - g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field)); - - priv = purple_request_field_get_instance_private(field); - g_return_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST); - - if(priv->u.list.selected != NULL) { - g_list_free_full(priv->u.list.selected, g_free); - priv->u.list.selected = NULL; - } - - g_hash_table_remove_all(priv->u.list.selected_table); -} - -void -purple_request_field_list_set_selected(PurpleRequestField *field, GList *items) -{ - PurpleRequestFieldPrivate *priv = NULL; - GList *l; - - g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field)); - g_return_if_fail(items != NULL); - - priv = purple_request_field_get_instance_private(field); - g_return_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST); - - purple_request_field_list_clear_selected(field); - - if (!purple_request_field_list_get_multi_select(field) && items->next) { - purple_debug_warning("request", - "More than one item added to non-multi-select " - "field %s\n", - purple_request_field_get_id(field)); - return; - } - - for (l = items; l != NULL; l = l->next) { - char *selected = l->data; - priv->u.list.selected = g_list_append(priv->u.list.selected, - g_strdup(selected)); - g_hash_table_add(priv->u.list.selected_table, g_strdup(selected)); - } -} - -gboolean -purple_request_field_list_is_selected(PurpleRequestField *field, - const char *item) -{ - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), FALSE); - g_return_val_if_fail(item != NULL, FALSE); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST, FALSE); - - return g_hash_table_contains(priv->u.list.selected_table, item); -} - -GList * -purple_request_field_list_get_selected(PurpleRequestField *field) { - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), NULL); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST, NULL); - - return priv->u.list.selected; -} - -GList * -purple_request_field_list_get_items(PurpleRequestField *field) { - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), NULL); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST, NULL); - - return priv->u.list.items; -} - -gboolean -purple_request_field_list_has_icons(PurpleRequestField *field) { - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), FALSE); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_LIST, FALSE); - - return priv->u.list.has_icons; -} - -PurpleRequestField * purple_request_field_label_new(const char *id, const char *text) { PurpleRequestField *field;
--- a/libpurple/purplerequestfield.h Fri Mar 10 16:37:41 2023 -0600 +++ b/libpurple/purplerequestfield.h Fri Mar 10 17:17:53 2023 -0600 @@ -64,7 +64,6 @@ /** * PurpleRequestFieldType: * @PURPLE_REQUEST_FIELD_NONE: No field. - * @PURPLE_REQUEST_FIELD_LIST: List field. * @PURPLE_REQUEST_FIELD_LABEL: Label field. * @PURPLE_REQUEST_FIELD_IMAGE: Image field. * @PURPLE_REQUEST_FIELD_DATASHEET: Datasheet field. @@ -74,7 +73,6 @@ typedef enum { PURPLE_REQUEST_FIELD_NONE, - PURPLE_REQUEST_FIELD_LIST, PURPLE_REQUEST_FIELD_LABEL, PURPLE_REQUEST_FIELD_IMAGE, PURPLE_REQUEST_FIELD_DATASHEET @@ -311,139 +309,6 @@ gboolean purple_request_field_is_sensitive(PurpleRequestField *field); /**************************************************************************/ -/* List Field API */ -/**************************************************************************/ - -/** - * purple_request_field_list_new: - * @id: The field ID. - * @text: The optional label of the field. - * - * Creates a multiple list item field. - * - * Returns: (transfer full): The new field. - */ -PurpleRequestField *purple_request_field_list_new(const char *id, const char *text); - -/** - * purple_request_field_list_set_multi_select: - * @field: The list field. - * @multi_select: TRUE if multiple selection is enabled, - * or FALSE otherwise. - * - * Sets whether or not a list field allows multiple selection. - */ -void purple_request_field_list_set_multi_select(PurpleRequestField *field, - gboolean multi_select); - -/** - * purple_request_field_list_get_multi_select: - * @field: The list field. - * - * Returns whether or not a list field allows multiple selection. - * - * Returns: TRUE if multiple selection is enabled, or FALSE otherwise. - */ -gboolean purple_request_field_list_get_multi_select(PurpleRequestField *field); - -/** - * purple_request_field_list_get_data: - * @field: The list field. - * @text: The item text. - * - * Returns the data for a particular item. - * - * Returns: The data associated with the item. - */ -void *purple_request_field_list_get_data(PurpleRequestField *field, const char *text); - -/** - * purple_request_field_list_add_icon: - * @field: The list field. - * @item: The list item. - * @icon_path: The path to icon file, or %NULL for no icon. - * @data: The associated data. - * - * Adds an item to a list field. - */ -void purple_request_field_list_add_icon(PurpleRequestField *field, - const char *item, const char* icon_path, void* data); - -/** - * purple_request_field_list_add_selected: - * @field: The field. - * @item: The item to add. - * - * Adds a selected item to the list field. - */ -void purple_request_field_list_add_selected(PurpleRequestField *field, - const char *item); - -/** - * purple_request_field_list_clear_selected: - * @field: The field. - * - * Clears the list of selected items in a list field. - */ -void purple_request_field_list_clear_selected(PurpleRequestField *field); - -/** - * purple_request_field_list_set_selected: - * @field: The field. - * @items: (element-type utf8) (transfer none): The list of selected items. - * - * Sets a list of selected items in a list field. - */ -void purple_request_field_list_set_selected(PurpleRequestField *field, - GList *items); - -/** - * purple_request_field_list_is_selected: - * @field: The field. - * @item: The item. - * - * Returns whether or not a particular item is selected in a list field. - * - * Returns: TRUE if the item is selected. FALSE otherwise. - */ -gboolean purple_request_field_list_is_selected(PurpleRequestField *field, const char *item); - -/** - * purple_request_field_list_get_selected: - * @field: The field. - * - * Returns a list of selected items in a list field. - * - * To retrieve the data for each item, use - * purple_request_field_list_get_data(). - * - * Returns: (element-type utf8) (transfer none): The list of selected items. - */ -GList *purple_request_field_list_get_selected(PurpleRequestField *field); - -/** - * purple_request_field_list_get_items: - * @field: The field. - * - * Returns a list of items in a list field. - * - * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of items. - */ -GList *purple_request_field_list_get_items(PurpleRequestField *field); - -/** - * purple_request_field_list_has_icons: - * @field: The field. - * - * Indicates if list field has icons. - * - * Returns: TRUE if list field has icons, FALSE otherwise. - * - * Since: 3.0.0 - */ -gboolean purple_request_field_list_has_icons(PurpleRequestField *field); - -/**************************************************************************/ /* Label Field API */ /**************************************************************************/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/request/purplerequestfieldlist.c Fri Mar 10 17:17:53 2023 -0600 @@ -0,0 +1,281 @@ +/* purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#include <glib/gi18n-lib.h> + +#include "glibcompat.h" +#include "purplerequestfield.h" +#include "request/purplerequestfieldlist.h" +#include "debug.h" +#include "purplekeyvaluepair.h" + +struct _PurpleRequestFieldList { + PurpleRequestField parent; + + GList *items; + gboolean has_icons; + GHashTable *item_data; + GList *selected; + GHashTable *selected_table; + + gboolean multiple_selection; +}; + +enum { + PROP_0, + PROP_MULTI_SELECT, + N_PROPERTIES, +}; +static GParamSpec *properties[N_PROPERTIES] = {NULL, }; + +/****************************************************************************** + * GObject Implementation + *****************************************************************************/ +G_DEFINE_TYPE(PurpleRequestFieldList, purple_request_field_list, + PURPLE_TYPE_REQUEST_FIELD) + +static void +purple_request_field_list_get_property(GObject *obj, guint param_id, GValue *value, + GParamSpec *pspec) +{ + PurpleRequestFieldList *field = PURPLE_REQUEST_FIELD_LIST(obj); + + switch(param_id) { + case PROP_MULTI_SELECT: + g_value_set_boolean(value, + purple_request_field_list_get_multi_select(field)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +static void +purple_request_field_list_set_property(GObject *obj, guint param_id, + const GValue *value, GParamSpec *pspec) +{ + PurpleRequestFieldList *field = PURPLE_REQUEST_FIELD_LIST(obj); + + switch(param_id) { + case PROP_MULTI_SELECT: + purple_request_field_list_set_multi_select(field, + g_value_get_boolean(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +static void +purple_request_field_list_finalize(GObject *obj) { + PurpleRequestFieldList *field = PURPLE_REQUEST_FIELD_LIST(obj); + + g_list_free_full(field->items, (GDestroyNotify)purple_key_value_pair_free); + g_list_free_full(field->selected, g_free); + g_hash_table_destroy(field->item_data); + g_hash_table_destroy(field->selected_table); + + G_OBJECT_CLASS(purple_request_field_list_parent_class)->finalize(obj); +} + +static void +purple_request_field_list_init(PurpleRequestFieldList *field) { + field->item_data = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, NULL); + + field->selected_table = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, NULL); +} + +static void +purple_request_field_list_class_init(PurpleRequestFieldListClass *klass) { + GObjectClass *obj_class = G_OBJECT_CLASS(klass); + + obj_class->finalize = purple_request_field_list_finalize; + obj_class->get_property = purple_request_field_list_get_property; + obj_class->set_property = purple_request_field_list_set_property; + + /** + * PurpleRequestFieldChoice:multi-select: + * + * Whether the field should allow multiple selections. + * + * Since: 3.0.0 + */ + properties[PROP_MULTI_SELECT] = g_param_spec_boolean( + "multi-select", "multi-select", + "Whether the field should allow multiple selections.", + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties(obj_class, N_PROPERTIES, properties); +} + +/****************************************************************************** + * Public API + *****************************************************************************/ +PurpleRequestField * +purple_request_field_list_new(const char *id, const char *text) { + g_return_val_if_fail(id != NULL, NULL); + + return g_object_new(PURPLE_TYPE_REQUEST_FIELD_LIST, + "id", id, + "label", text, + NULL); +} + +void +purple_request_field_list_set_multi_select(PurpleRequestFieldList *field, + gboolean multi_select) +{ + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field)); + + if(field->multiple_selection == multi_select) { + return; + } + + field->multiple_selection = multi_select; + + g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_MULTI_SELECT]); +} + +gboolean +purple_request_field_list_get_multi_select(PurpleRequestFieldList *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field), FALSE); + + return field->multiple_selection; +} + +gpointer +purple_request_field_list_get_data(PurpleRequestFieldList *field, + const char *text) +{ + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field), NULL); + g_return_val_if_fail(text != NULL, NULL); + + return g_hash_table_lookup(field->item_data, text); +} + +void +purple_request_field_list_add_icon(PurpleRequestFieldList *field, + const char *item, const char *icon_path, + gpointer data) +{ + PurpleKeyValuePair *kvp; + + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field)); + g_return_if_fail(item != NULL); + g_return_if_fail(data != NULL); + + field->has_icons = field->has_icons || (icon_path != NULL); + kvp = purple_key_value_pair_new_full(item, g_strdup(icon_path), g_free); + field->items = g_list_append(field->items, kvp); + g_hash_table_insert(field->item_data, g_strdup(item), data); +} + +void +purple_request_field_list_add_selected(PurpleRequestFieldList *field, + const char *item) +{ + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field)); + g_return_if_fail(item != NULL); + + if(!field->multiple_selection && field->selected != NULL) { + purple_debug_warning("request", + "More than one item added to non-multi-select " + "field %s\n", + purple_request_field_get_id(PURPLE_REQUEST_FIELD(field))); + return; + } + + field->selected = g_list_append(field->selected, g_strdup(item)); + + g_hash_table_add(field->selected_table, g_strdup(item)); +} + +void +purple_request_field_list_clear_selected(PurpleRequestFieldList *field) { + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field)); + + g_list_free_full(field->selected, g_free); + field->selected = NULL; + + g_hash_table_remove_all(field->selected_table); +} + +void +purple_request_field_list_set_selected(PurpleRequestFieldList *field, + GList *items) +{ + GList *l; + + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field)); + g_return_if_fail(items != NULL); + + purple_request_field_list_clear_selected(field); + + if (!purple_request_field_list_get_multi_select(field) && items->next) { + purple_debug_warning("request", + "More than one item added to non-multi-select " + "field %s\n", + purple_request_field_get_id(PURPLE_REQUEST_FIELD(field))); + return; + } + + for (l = items; l != NULL; l = l->next) { + char *selected = l->data; + field->selected = g_list_append(field->selected, g_strdup(selected)); + g_hash_table_add(field->selected_table, g_strdup(selected)); + } +} + +gboolean +purple_request_field_list_is_selected(PurpleRequestFieldList *field, + const char *item) +{ + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field), FALSE); + g_return_val_if_fail(item != NULL, FALSE); + + return g_hash_table_contains(field->selected_table, item); +} + +GList * +purple_request_field_list_get_selected(PurpleRequestFieldList *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field), NULL); + + return field->selected; +} + +GList * +purple_request_field_list_get_items(PurpleRequestFieldList *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field), NULL); + + return field->items; +} + +gboolean +purple_request_field_list_has_icons(PurpleRequestFieldList *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_LIST(field), FALSE); + + return field->has_icons; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/request/purplerequestfieldlist.h Fri Mar 10 17:17:53 2023 -0600 @@ -0,0 +1,177 @@ +/* + * Purple - Internet Messaging Library + * Copyright (C) Pidgin Developers <devel@pidgin.im> + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <https://www.gnu.org/licenses/>. + */ + +#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION) +# error "only <purple.h> may be included directly" +#endif + +#ifndef PURPLE_REQUEST_FIELD_LIST_H +#define PURPLE_REQUEST_FIELD_LIST_H + +#include <stdlib.h> + +#include <glib.h> +#include <glib-object.h> + +/** + * PurpleRequestFieldList: + * + * A list request field. + */ +typedef struct _PurpleRequestFieldList PurpleRequestFieldList; + +#include "purplerequestfield.h" + +G_BEGIN_DECLS + +#define PURPLE_TYPE_REQUEST_FIELD_LIST (purple_request_field_list_get_type()) +G_DECLARE_FINAL_TYPE(PurpleRequestFieldList, purple_request_field_list, + PURPLE, REQUEST_FIELD_LIST, PurpleRequestField) + +/** + * purple_request_field_list_new: + * @id: The field ID. + * @text: The optional label of the field. + * + * Creates a multiple list item field. + * + * Returns: (transfer full): The new field. + */ +PurpleRequestField *purple_request_field_list_new(const char *id, const char *text); + +/** + * purple_request_field_list_set_multi_select: + * @field: The list field. + * @multi_select: TRUE if multiple selection is enabled, + * or FALSE otherwise. + * + * Sets whether or not a list field allows multiple selection. + */ +void purple_request_field_list_set_multi_select(PurpleRequestFieldList *field, gboolean multi_select); + +/** + * purple_request_field_list_get_multi_select: + * @field: The list field. + * + * Returns whether or not a list field allows multiple selection. + * + * Returns: TRUE if multiple selection is enabled, or FALSE otherwise. + */ +gboolean purple_request_field_list_get_multi_select(PurpleRequestFieldList *field); + +/** + * purple_request_field_list_get_data: + * @field: The list field. + * @text: The item text. + * + * Returns the data for a particular item. + * + * Returns: The data associated with the item. + */ +gpointer purple_request_field_list_get_data(PurpleRequestFieldList *field, const char *text); + +/** + * purple_request_field_list_add_icon: + * @field: The list field. + * @item: The list item. + * @icon_path: The path to icon file, or %NULL for no icon. + * @data: The associated data. + * + * Adds an item to a list field. + */ +void purple_request_field_list_add_icon(PurpleRequestFieldList *field, const char *item, const char *icon_path, gpointer data); + +/** + * purple_request_field_list_add_selected: + * @field: The field. + * @item: The item to add. + * + * Adds a selected item to the list field. + */ +void purple_request_field_list_add_selected(PurpleRequestFieldList *field, const char *item); + +/** + * purple_request_field_list_clear_selected: + * @field: The field. + * + * Clears the list of selected items in a list field. + */ +void purple_request_field_list_clear_selected(PurpleRequestFieldList *field); + +/** + * purple_request_field_list_set_selected: + * @field: The field. + * @items: (element-type utf8) (transfer none): The list of selected items. + * + * Sets a list of selected items in a list field. + */ +void purple_request_field_list_set_selected(PurpleRequestFieldList *field, GList *items); + +/** + * purple_request_field_list_is_selected: + * @field: The field. + * @item: The item. + * + * Returns whether or not a particular item is selected in a list field. + * + * Returns: TRUE if the item is selected. FALSE otherwise. + */ +gboolean purple_request_field_list_is_selected(PurpleRequestFieldList *field, const char *item); + +/** + * purple_request_field_list_get_selected: + * @field: The field. + * + * Returns a list of selected items in a list field. + * + * To retrieve the data for each item, use + * purple_request_field_list_get_data(). + * + * Returns: (element-type utf8) (transfer none): The list of selected items. + */ +GList *purple_request_field_list_get_selected(PurpleRequestFieldList *field); + +/** + * purple_request_field_list_get_items: + * @field: The field. + * + * Returns a list of items in a list field. + * + * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of items. + */ +GList *purple_request_field_list_get_items(PurpleRequestFieldList *field); + +/** + * purple_request_field_list_has_icons: + * @field: The field. + * + * Indicates if list field has icons. + * + * Returns: TRUE if list field has icons, FALSE otherwise. + * + * Since: 3.0.0 + */ +gboolean purple_request_field_list_has_icons(PurpleRequestFieldList *field); + +G_END_DECLS + +#endif /* PURPLE_REQUEST_FIELD_LIST_H */
--- a/pidgin/gtkrequest.c Fri Mar 10 16:37:41 2023 -0600 +++ b/pidgin/gtkrequest.c Fri Mar 10 17:17:53 2023 -0600 @@ -1383,7 +1383,7 @@ setup_list_field_listitem_cb(G_GNUC_UNUSED GtkSignalListItemFactory *self, GtkListItem *item, gpointer data) { - PurpleRequestField *field = data; + PurpleRequestFieldList *field = data; GtkWidget *box = NULL; GtkWidget *widget = NULL; @@ -1403,7 +1403,7 @@ bind_list_field_listitem_cb(G_GNUC_UNUSED GtkSignalListItemFactory *self, GtkListItem *item, gpointer data) { - PurpleRequestField *field = data; + PurpleRequestFieldList *field = data; GtkWidget *box = NULL; GtkWidget *label = NULL; GObject *wrapper = NULL; @@ -1428,7 +1428,7 @@ G_GNUC_UNUSED guint position, G_GNUC_UNUSED guint n_items, gpointer data) { - PurpleRequestField *field = data; + PurpleRequestFieldList *field = data; GtkBitset *bitset = NULL; purple_request_field_list_clear_selected(field); @@ -1453,8 +1453,8 @@ } static GtkWidget * -create_list_field(PurpleRequestField *field) -{ +create_list_field(PurpleRequestField *field) { + PurpleRequestFieldList *listfield = PURPLE_REQUEST_FIELD_LIST(field); GtkWidget *sw; GtkWidget *listview = NULL; GtkSelectionModel *sel = NULL; @@ -1464,11 +1464,11 @@ GList *l; gboolean has_icons; - has_icons = purple_request_field_list_has_icons(field); + has_icons = purple_request_field_list_has_icons(listfield); /* Create the list store */ store = g_list_store_new(G_TYPE_OBJECT); - if(purple_request_field_list_get_multi_select(field)) { + if(purple_request_field_list_get_multi_select(listfield)) { sel = GTK_SELECTION_MODEL(gtk_multi_selection_new(G_LIST_MODEL(store))); } else { sel = GTK_SELECTION_MODEL(gtk_single_selection_new(G_LIST_MODEL(store))); @@ -1488,7 +1488,7 @@ gtk_widget_set_size_request(listview, 200, 400); } - for(index = 0, l = purple_request_field_list_get_items(field); + for(index = 0, l = purple_request_field_list_get_items(listfield); l != NULL; index++, l = l->next) { @@ -1500,7 +1500,7 @@ g_list_store_append(store, wrapper); g_object_set_data(wrapper, "data", - purple_request_field_list_get_data(field, text)); + purple_request_field_list_get_data(listfield, text)); g_object_set_data_full(wrapper, "text", g_strdup(text), g_free); if(has_icons) { @@ -1514,7 +1514,7 @@ g_object_set_data_full(wrapper, "pixbuf", pixbuf, g_object_unref); } - if(purple_request_field_list_is_selected(field, text)) { + if(purple_request_field_list_is_selected(listfield, text)) { gtk_selection_model_select_item(sel, index, FALSE); } @@ -2054,7 +2054,7 @@ { rows++; } - else if ((type == PURPLE_REQUEST_FIELD_LIST) || + else if(PURPLE_IS_REQUEST_FIELD_LIST(field) || (PURPLE_IS_REQUEST_FIELD_STRING(field) && purple_request_field_string_is_multiline(PURPLE_REQUEST_FIELD_STRING(field)))) { @@ -2124,7 +2124,7 @@ gtk_size_group_add_widget(sg, label); if (type == PURPLE_REQUEST_FIELD_LABEL || - type == PURPLE_REQUEST_FIELD_LIST || + PURPLE_IS_REQUEST_FIELD_LIST(field) || (PURPLE_IS_REQUEST_FIELD_STRING(field) && purple_request_field_string_is_multiline(PURPLE_REQUEST_FIELD_STRING(field)))) { @@ -2154,9 +2154,9 @@ widget = create_bool_field(field, cpar); } else if(PURPLE_IS_REQUEST_FIELD_CHOICE(field)) { widget = create_choice_field(field); - } else if (type == PURPLE_REQUEST_FIELD_LIST) + } else if(PURPLE_IS_REQUEST_FIELD_LIST(field)) { widget = create_list_field(field); - else if (type == PURPLE_REQUEST_FIELD_IMAGE) + } else if (type == PURPLE_REQUEST_FIELD_IMAGE) widget = create_image_field(field); else if(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field)) { widget = create_account_field(field); @@ -2182,9 +2182,7 @@ { gtk_grid_attach(GTK_GRID(grid), widget, 0, row_num, 2 * cols, 1); - } - else if (type == PURPLE_REQUEST_FIELD_LIST) - { + } else if(PURPLE_IS_REQUEST_FIELD_LIST(field)) { gtk_grid_attach(GTK_GRID(grid), widget, 0, row_num, 2 * cols, 1); } else if(PURPLE_IS_REQUEST_FIELD_BOOL(field)) {
--- a/pidgin/pidginmooddialog.c Fri Mar 10 16:37:41 2023 -0600 +++ b/pidgin/pidginmooddialog.c Fri Mar 10 17:17:53 2023 -0600 @@ -65,11 +65,12 @@ pidgin_mood_dialog_edit_cb(PurpleConnection *connection, PurpleRequestPage *page) { - PurpleRequestField *mood_field = NULL; + PurpleRequestFieldList *mood_field = NULL; GList *l = NULL; const gchar *mood = NULL; - mood_field = purple_request_page_get_field(page, "mood"); + mood_field = PURPLE_REQUEST_FIELD_LIST(purple_request_page_get_field(page, + "mood")); l = purple_request_field_list_get_selected(mood_field); if(l == NULL) { @@ -243,8 +244,9 @@ pidgin_mood_dialog_show(PurpleAccount *account) { const gchar *current_mood; PurpleRequestPage *page; - PurpleRequestGroup *g; - PurpleRequestField *f; + PurpleRequestGroup *group = NULL; + PurpleRequestField *field = NULL; + PurpleRequestFieldList *fieldlist = NULL; PurpleConnection *gc = NULL; PurpleProtocol *protocol = NULL; PurpleMood *mood = NULL; @@ -262,12 +264,15 @@ } page = purple_request_page_new(); - g = purple_request_group_new(NULL); - f = purple_request_field_list_new("mood", _("Please select your mood from the list")); + group = purple_request_group_new(NULL); + field = purple_request_field_list_new("mood", + _("Please select your mood from the list")); + fieldlist = PURPLE_REQUEST_FIELD_LIST(field); - purple_request_field_list_add_icon(f, _("None"), NULL, ""); - if (current_mood == NULL) - purple_request_field_list_add_selected(f, _("None")); + purple_request_field_list_add_icon(fieldlist, _("None"), NULL, ""); + if(current_mood == NULL) { + purple_request_field_list_add_selected(fieldlist, _("None")); + } /* TODO: rlaager wants this sorted. */ /* TODO: darkrain wants it sorted post-translation */ @@ -287,24 +292,24 @@ } path = pidgin_mood_get_icon_path(mood->mood); - purple_request_field_list_add_icon(f, _(mood->description), - path, (gpointer)mood->mood); + purple_request_field_list_add_icon(fieldlist, _(mood->description), + path, (gpointer)mood->mood); g_free(path); if (current_mood && purple_strequal(current_mood, mood->mood)) - purple_request_field_list_add_selected(f, _(mood->description)); + purple_request_field_list_add_selected(fieldlist, _(mood->description)); } - purple_request_group_add_field(g, f); + purple_request_group_add_field(group, field); - purple_request_page_add_group(page, g); + purple_request_page_add_group(page, group); /* if the connection allows setting a mood message */ if (gc && (purple_connection_get_flags(gc) & PURPLE_CONNECTION_FLAG_SUPPORT_MOOD_MESSAGES)) { - g = purple_request_group_new(NULL); - f = purple_request_field_string_new("text", - _("Message (optional)"), NULL, FALSE); - purple_request_group_add_field(g, f); - purple_request_page_add_group(page, g); + group = purple_request_group_new(NULL); + field = purple_request_field_string_new("text", _("Message (optional)"), + NULL, FALSE); + purple_request_group_add_field(group, field); + purple_request_page_add_group(page, group); } purple_request_fields(gc, _("Edit User Mood"), _("Edit User Mood"),