pidgin/pidgin

Convert PurpleRequestFieldList into a GObject

14 months ago, Elliott Sales de Andrade
beba61bbdf19
Parents c053558f1236
Children 7ecf7a18e627
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"),