--- a/finch/gntrequest.c Fri Mar 10 16:36:55 2023 -0600
+++ b/finch/gntrequest.c Fri Mar 10 16:37:41 2023 -0600
@@ -315,13 +315,12 @@
int value = (text && *text) ? atoi(text) : 0;
purple_request_field_int_set_value(PURPLE_REQUEST_FIELD_INT(field),
- else if (type == PURPLE_REQUEST_FIELD_CHOICE)
+ } else if(PURPLE_IS_REQUEST_FIELD_CHOICE(field)) { GntWidget *combo = g_object_get_data(G_OBJECT(field),
gpointer value = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo));
- purple_request_field_choice_set_value(field, value);
+ purple_request_field_choice_set_value(PURPLE_REQUEST_FIELD_CHOICE(field), else if (type == PURPLE_REQUEST_FIELD_LIST)
@@ -471,16 +470,18 @@
create_choice_field(PurpleRequestField *field)
+ PurpleRequestFieldChoice *cfield = PURPLE_REQUEST_FIELD_CHOICE(field); GntWidget *combo = gnt_combo_box_new();
- for (GList *it = purple_request_field_choice_get_elements(field); it != NULL; it = g_list_next(it))
+ for(GList *it = purple_request_field_choice_get_elements(cfield); + it != NULL; it = g_list_next(it)) PurpleKeyValuePair *choice = it->data;
gnt_combo_box_add_data(GNT_COMBO_BOX(combo), choice->value, choice->key);
gnt_combo_box_set_selected(GNT_COMBO_BOX(combo),
- purple_request_field_choice_get_default_value(field));
+ purple_request_field_choice_get_default_value(cfield)); @@ -666,7 +667,7 @@
widget = create_string_field(field, &username);
} else if(PURPLE_IS_REQUEST_FIELD_INT(field)) {
widget = create_integer_field(field);
- } else if (type == PURPLE_REQUEST_FIELD_CHOICE) {
+ } else if(PURPLE_IS_REQUEST_FIELD_CHOICE(field)) { widget = create_choice_field(field);
} else if (type == PURPLE_REQUEST_FIELD_LIST) {
widget = create_list_field(field);
@@ -928,13 +929,12 @@
ret = create_string_field(field, NULL);
} else if(PURPLE_IS_REQUEST_FIELD_INT(field)) {
ret = create_integer_field(field);
+ } else if(PURPLE_IS_REQUEST_FIELD_CHOICE(field)) { + ret = create_choice_field(field); } else if(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field)) {
ret = create_account_field(field);
switch (purple_request_field_get_field_type(field)) {
- case PURPLE_REQUEST_FIELD_CHOICE:
- ret = create_choice_field(field);
case PURPLE_REQUEST_FIELD_LIST:
ret = create_list_field(field);
--- a/libpurple/meson.build Fri Mar 10 16:36:55 2023 -0600
+++ b/libpurple/meson.build Fri Mar 10 16:37:41 2023 -0600
@@ -99,6 +99,7 @@
'request/purplerequestfieldaccount.c',
'request/purplerequestfieldbool.c',
+ 'request/purplerequestfieldchoice.c', 'request/purplerequestfieldint.c',
'request/purplerequestfieldstring.c',
@@ -226,6 +227,7 @@
purple_request_headers = [
'request/purplerequestfieldaccount.h',
'request/purplerequestfieldbool.h',
+ 'request/purplerequestfieldchoice.h', 'request/purplerequestfieldint.h',
'request/purplerequestfieldstring.h',
--- a/libpurple/protocols/demo/purpledemoprotocolactions.c Fri Mar 10 16:36:55 2023 -0600
+++ b/libpurple/protocols/demo/purpledemoprotocolactions.c Fri Mar 10 16:37:41 2023 -0600
@@ -455,6 +455,7 @@
PurpleRequestPage *page = NULL;
PurpleRequestGroup *group = NULL;
PurpleRequestField *field = NULL;
+ PurpleRequestFieldChoice *choice_field = NULL; gconstpointer icon_data = NULL;
@@ -520,10 +521,11 @@
purple_request_group_add_field(group, field);
field = purple_request_field_choice_new("choice", _("A choice"), "foo");
- purple_request_field_choice_add(field, _("foo"), "foo");
- purple_request_field_choice_add(field, _("bar"), "bar");
- purple_request_field_choice_add(field, _("baz"), "baz");
- purple_request_field_choice_add(field, _("quux"), "quux");
+ choice_field = PURPLE_REQUEST_FIELD_CHOICE(field); + purple_request_field_choice_add(choice_field, _("foo"), "foo"); + purple_request_field_choice_add(choice_field, _("bar"), "bar"); + purple_request_field_choice_add(choice_field, _("baz"), "baz"); + purple_request_field_choice_add(choice_field, _("quux"), "quux"); purple_request_group_add_field(group, field);
field = purple_request_field_list_new("list", _("A list"));
--- a/libpurple/protocols/gg/pubdir-prpl.c Fri Mar 10 16:36:55 2023 -0600
+++ b/libpurple/protocols/gg/pubdir-prpl.c Fri Mar 10 16:37:41 2023 -0600
@@ -749,6 +749,7 @@
PurpleRequestGroup *group;
PurpleRequestField *field;
+ PurpleRequestFieldChoice *choice; purple_debug_info("gg", "ggp_pubdir_search");
@@ -766,11 +767,12 @@
field = purple_request_field_choice_new(
"gender", _("Gender"), form ? GINT_TO_POINTER(form->gender) : NULL);
- purple_request_field_choice_add(field, _("Male or female"), NULL);
- purple_request_field_choice_add(field, _("Male"),
- GINT_TO_POINTER(GGP_PUBDIR_GENDER_MALE));
- purple_request_field_choice_add(field, _("Female"),
- GINT_TO_POINTER(GGP_PUBDIR_GENDER_FEMALE));
+ choice = PURPLE_REQUEST_FIELD_CHOICE(field); + purple_request_field_choice_add(choice, _("Male or female"), NULL); + purple_request_field_choice_add(choice, _("Male"), + GINT_TO_POINTER(GGP_PUBDIR_GENDER_MALE)); + purple_request_field_choice_add(choice, _("Female"), + GINT_TO_POINTER(GGP_PUBDIR_GENDER_FEMALE)); purple_request_group_add_field(group, field);
purple_request_fields(gc, _("Find buddies"), _("Find buddies"),
@@ -935,6 +937,7 @@
PurpleRequestGroup *group;
PurpleRequestField *field;
+ PurpleRequestFieldChoice *choice; const ggp_pubdir_record *record;
@@ -962,10 +965,11 @@
record ? GINT_TO_POINTER(record->gender)
: GGP_PUBDIR_GENDER_UNSPECIFIED);
+ choice = PURPLE_REQUEST_FIELD_CHOICE(field); purple_request_field_set_required(field, TRUE);
- purple_request_field_choice_add(field, _("Male"),
+ purple_request_field_choice_add(choice, _("Male"), GINT_TO_POINTER(GGP_PUBDIR_GENDER_MALE));
- purple_request_field_choice_add(field, _("Female"),
+ purple_request_field_choice_add(choice, _("Female"), GINT_TO_POINTER(GGP_PUBDIR_GENDER_FEMALE));
purple_request_group_add_field(group, field);
@@ -991,13 +995,14 @@
your language, feel free to use it. Otherwise it's probably acceptable
to leave it changed or transliterate it into your alphabet. */
field = purple_request_field_choice_new("province", _("Voivodeship"), 0);
+ choice = PURPLE_REQUEST_FIELD_CHOICE(field); purple_request_group_add_field(group, field);
for (i = 0; i < ggp_pubdir_provinces_count; i++) {
- purple_request_field_choice_add(field, ggp_pubdir_provinces[i],
+ purple_request_field_choice_add(choice, ggp_pubdir_provinces[i], if (record && i == record->province) {
- purple_request_field_choice_set_value(field, GINT_TO_POINTER(i));
- purple_request_field_choice_set_default_value(field,
+ purple_request_field_choice_set_value(choice, GINT_TO_POINTER(i)); + purple_request_field_choice_set_default_value(choice, --- a/libpurple/protocols/jabber/jabber.c Fri Mar 10 16:36:55 2023 -0600
+++ b/libpurple/protocols/jabber/jabber.c Fri Mar 10 16:37:41 2023 -0600
@@ -2622,8 +2622,7 @@
jabber_media_ok_cb(JabberMediaRequest *request, PurpleRequestPage *page) {
- PurpleRequestField *field = purple_request_page_get_field(page, "resource");
- const gchar *selected = purple_request_field_choice_get_value(field);
+ const gchar *selected = purple_request_page_get_choice(page, "resource"); gchar *who = g_strdup_printf("%s/%s", request->who, selected);
jabber_initiate_media(request->media, request->account, who, request->type);
@@ -2698,10 +2697,12 @@
PurpleRequestPage *page = NULL;
PurpleRequestField *field = NULL;
+ PurpleRequestFieldChoice *choice = NULL; PurpleRequestGroup *group = NULL;
JabberMediaRequest *request;
field = purple_request_field_choice_new("resource", _("Resource"), 0);
+ choice = PURPLE_REQUEST_FIELD_CHOICE(field); for(l = jb->resources; l; l = l->next)
JabberBuddyResource *ljbr = l->data;
@@ -2715,19 +2716,22 @@
(type & PURPLE_MEDIA_VIDEO)) {
if (caps & PURPLE_MEDIA_CAPS_AUDIO_VIDEO) {
- purple_request_field_choice_add_full(field,
- jbr->name, g_strdup(jbr->name), g_free);
+ purple_request_field_choice_add_full(choice, jbr->name, } else if (type & (PURPLE_MEDIA_AUDIO) &&
(caps & PURPLE_MEDIA_CAPS_AUDIO)) {
- purple_request_field_choice_add_full(field,
- jbr->name, g_strdup(jbr->name), g_free);
+ purple_request_field_choice_add_full(choice, jbr->name, }else if (type & (PURPLE_MEDIA_VIDEO) &&
(caps & PURPLE_MEDIA_CAPS_VIDEO)) {
- purple_request_field_choice_add_full(field,
- jbr->name, g_strdup(jbr->name), g_free);
+ purple_request_field_choice_add_full(choice, jbr->name, @@ -2737,8 +2741,7 @@
- if (g_list_length(purple_request_field_choice_get_elements(
+ if(g_list_length(purple_request_field_choice_get_elements(choice)) <= 1) { --- a/libpurple/protocols/jabber/si.c Fri Mar 10 16:36:55 2023 -0600
+++ b/libpurple/protocols/jabber/si.c Fri Mar 10 16:37:41 2023 -0600
@@ -1519,8 +1519,7 @@
resource_select_ok_cb(PurpleXfer *xfer, PurpleRequestPage *page)
- PurpleRequestField *field = purple_request_page_get_field(page, "resource");
- const char *selected_label = purple_request_field_choice_get_value(field);
+ const char *selected_label = purple_request_page_get_choice(page, "resource"); do_transfer_send(xfer, selected_label);
@@ -1587,20 +1586,31 @@
/* we've got multiple resources, we need to pick one to send to */
- char *msg = g_strdup_printf(_("Please select the resource of %s to which you would like to send a file"), purple_xfer_get_remote_user(xfer));
- PurpleRequestPage *page = purple_request_page_new();
- PurpleRequestField *field = purple_request_field_choice_new("resource", _("Resource"), 0);
- PurpleRequestGroup *group = purple_request_group_new(NULL);
+ PurpleRequestPage *page = NULL; + PurpleRequestField *field = NULL; + PurpleRequestFieldChoice *choice = NULL; + PurpleRequestGroup *group = NULL; + field = purple_request_field_choice_new("resource", _("Resource"), 0); + choice = PURPLE_REQUEST_FIELD_CHOICE(field); for(l = resources; l; l = l->next) {
- purple_request_field_choice_add_full(field, jbr->name, g_strdup(jbr->name), g_free);
+ purple_request_field_choice_add_full(choice, jbr->name, + group = purple_request_group_new(NULL); purple_request_group_add_field(group, field);
+ page = purple_request_page_new(); purple_request_page_add_group(page, group);
+ msg = g_strdup_printf(_("Please select the resource of %s to " + "which you would like to send a file"), + purple_xfer_get_remote_user(xfer)); purple_request_fields(jsx->js->gc, _("Select a Resource"), msg, NULL, page,
_("Send File"), G_CALLBACK(resource_select_ok_cb), _("Cancel"), G_CALLBACK(resource_select_cancel_cb),
purple_request_cpar_from_connection(jsx->js->gc), xfer);
--- a/libpurple/protocols/jabber/xdata.c Fri Mar 10 16:36:55 2023 -0600
+++ b/libpurple/protocols/jabber/xdata.c Fri Mar 10 16:37:41 2023 -0600
@@ -64,11 +64,12 @@
if(groups->data == data->actiongroup) {
for(flds = purple_request_group_get_fields(groups->data); flds; flds = flds->next) {
PurpleRequestField *field = flds->data;
+ PurpleRequestFieldChoice *choice = PURPLE_REQUEST_FIELD_CHOICE(field); const char *id = purple_request_field_get_id(field);
if(!purple_strequal(id, "libpurple:jabber:xdata:actions"))
- handleindex = GPOINTER_TO_INT(purple_request_field_choice_get_value(field));
+ handleindex = GPOINTER_TO_INT(purple_request_field_choice_get_value(choice)); actionhandle = g_strdup(g_list_nth_data(data->actions, handleindex));
@@ -369,22 +370,26 @@
- PurpleRequestField *actionfield;
+ PurpleRequestField *field = NULL; + PurpleRequestFieldChoice *choice = NULL; data->actiongroup = group = purple_request_group_new(_("Actions"));
purple_request_page_add_group(page, group);
- actionfield = purple_request_field_choice_new("libpurple:jabber:xdata:actions", _("Select an action"), GINT_TO_POINTER(defaultaction));
+ field = purple_request_field_choice_new("libpurple:jabber:xdata:actions", + GINT_TO_POINTER(defaultaction)); + choice = PURPLE_REQUEST_FIELD_CHOICE(field); for(i = 0, action = actions; action; action = g_list_next(action), i++) {
JabberXDataAction *a = action->data;
- purple_request_field_choice_add(actionfield, a->name, GINT_TO_POINTER(i));
+ purple_request_field_choice_add(choice, a->name, GINT_TO_POINTER(i)); data->actions = g_list_append(data->actions, g_strdup(a->handle));
- purple_request_field_set_required(actionfield,TRUE);
- purple_request_group_add_field(group, actionfield);
+ purple_request_field_set_required(field, TRUE); + purple_request_group_add_field(group, field); if((x = purple_xmlnode_get_child(packet, "title")))
--- a/libpurple/purplerequestfield.c Fri Mar 10 16:36:55 2023 -0600
+++ b/libpurple/purplerequestfield.c Fri Mar 10 16:37:41 2023 -0600
@@ -42,13 +42,6 @@
- gpointer default_value;
@@ -213,10 +206,7 @@
- if(priv->type == PURPLE_REQUEST_FIELD_CHOICE) {
- g_list_free_full(priv->u.choice.elements,
- (GDestroyNotify)purple_key_value_pair_free);
- } else if(priv->type == PURPLE_REQUEST_FIELD_LIST) {
+ 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);
@@ -661,111 +651,6 @@
-purple_request_field_choice_new(const char *id, const char *text,
- gpointer default_value)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(text != NULL, NULL);
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_CHOICE);
- purple_request_field_choice_set_default_value(field, default_value);
- purple_request_field_choice_set_value(field, default_value);
-purple_request_field_choice_add(PurpleRequestField *field, const char *label,
- purple_request_field_choice_add_full(field, label, value, NULL);
-purple_request_field_choice_add_full(PurpleRequestField *field, const char *label,
- gpointer value, GDestroyNotify destroy)
- PurpleKeyValuePair *choice;
- PurpleRequestFieldPrivate *priv = NULL;
- g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field));
- g_return_if_fail(label != NULL);
- priv = purple_request_field_get_instance_private(field);
- g_return_if_fail(priv->type == PURPLE_REQUEST_FIELD_CHOICE);
- choice = purple_key_value_pair_new_full(label, value, destroy);
- priv->u.choice.elements = g_list_append(priv->u.choice.elements, choice);
-purple_request_field_choice_set_default_value(PurpleRequestField *field,
- gpointer default_value)
- 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_CHOICE);
- priv->u.choice.default_value = default_value;
-purple_request_field_choice_set_value(PurpleRequestField *field, gpointer value)
- 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_CHOICE);
- priv->u.choice.value = value;
-purple_request_field_choice_get_default_value(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_CHOICE, NULL);
- return priv->u.choice.default_value;
-purple_request_field_choice_get_value(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_CHOICE, NULL);
- return priv->u.choice.value;
-purple_request_field_choice_get_elements(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_CHOICE, NULL);
- return priv->u.choice.elements;
purple_request_field_list_new(const char *id, const char *text)
PurpleRequestField *field;
--- a/libpurple/purplerequestfield.h Fri Mar 10 16:36:55 2023 -0600
+++ b/libpurple/purplerequestfield.h Fri Mar 10 16:37:41 2023 -0600
@@ -64,7 +64,6 @@
* PurpleRequestFieldType:
* @PURPLE_REQUEST_FIELD_NONE: No field.
- * @PURPLE_REQUEST_FIELD_CHOICE: Choice field (dropdown?).
* @PURPLE_REQUEST_FIELD_LIST: List field.
* @PURPLE_REQUEST_FIELD_LABEL: Label field.
* @PURPLE_REQUEST_FIELD_IMAGE: Image field.
@@ -75,7 +74,6 @@
PURPLE_REQUEST_FIELD_NONE,
- PURPLE_REQUEST_FIELD_CHOICE,
PURPLE_REQUEST_FIELD_LIST,
PURPLE_REQUEST_FIELD_LABEL,
PURPLE_REQUEST_FIELD_IMAGE,
@@ -313,108 +311,6 @@
gboolean purple_request_field_is_sensitive(PurpleRequestField *field);
/**************************************************************************/
-/**************************************************************************/
- * purple_request_field_choice_new:
- * @text: The optional label of the field.
- * @default_value: The default choice.
- * Creates a multiple choice field.
- * This is often represented as a group of radio buttons.
- * Returns: (transfer full): The new field.
-purple_request_field_choice_new(const char *id, const char *text,
- gpointer default_value);
- * purple_request_field_choice_add:
- * @field: The choice field.
- * @label: The choice label.
- * @data: The choice value.
- * Adds a choice to a multiple choice field.
-purple_request_field_choice_add(PurpleRequestField *field, const char *label,
- * purple_request_field_choice_add_full:
- * @field: The choice field.
- * @label: The choice label.
- * @data: The choice value.
- * @destroy: The value destroy function.
- * Adds a choice to a multiple choice field with destructor for value.
-purple_request_field_choice_add_full(PurpleRequestField *field, const char *label,
- gpointer data, GDestroyNotify destroy);
- * purple_request_field_choice_set_default_value:
- * @default_value: The default value.
- * Sets the default value in an choice field.
-purple_request_field_choice_set_default_value(PurpleRequestField *field,
- gpointer default_value);
- * purple_request_field_choice_set_value:
- * Sets the value in an choice field.
-purple_request_field_choice_set_value(PurpleRequestField *field,
- * purple_request_field_choice_get_default_value:
- * Returns the default value in an choice field.
- * Returns: The default value.
-purple_request_field_choice_get_default_value(PurpleRequestField *field);
- * purple_request_field_choice_get_value:
- * Returns the user-entered value in an choice field.
-purple_request_field_choice_get_value(PurpleRequestField *field);
- * purple_request_field_choice_get_elements:
- * Returns a list of elements in a choice field.
- * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of pairs of {label, value}.
-purple_request_field_choice_get_elements(PurpleRequestField *field);
-/**************************************************************************/
/**************************************************************************/
--- a/libpurple/purplerequestpage.c Fri Mar 10 16:36:55 2023 -0600
+++ b/libpurple/purplerequestpage.c Fri Mar 10 16:37:41 2023 -0600
@@ -25,6 +25,7 @@
#include "purplerequestpage.h"
#include "request/purplerequestfieldaccount.h"
#include "request/purplerequestfieldbool.h"
+#include "request/purplerequestfieldchoice.h" #include "request/purplerequestfieldint.h"
#include "request/purplerequestfieldstring.h"
#include "purpleprivate.h"
@@ -344,11 +345,12 @@
g_return_val_if_fail(PURPLE_IS_REQUEST_PAGE(page), NULL);
g_return_val_if_fail(id != NULL, NULL);
- if((field = purple_request_page_get_field(page, id)) == NULL) {
+ field = purple_request_page_get_field(page, id); + if(!PURPLE_IS_REQUEST_FIELD_CHOICE(field)) { - return purple_request_field_choice_get_value(field);
+ return purple_request_field_choice_get_value(PURPLE_REQUEST_FIELD_CHOICE(field)); --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/request/purplerequestfieldchoice.c Fri Mar 10 16:37:41 2023 -0600
@@ -0,0 +1,232 @@
+ * 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 + * 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 "purplerequestfield.h" +#include "request/purplerequestfieldchoice.h" +#include "purplekeyvaluepair.h" +struct _PurpleRequestFieldChoice { + PurpleRequestField parent; + gpointer default_value; +static GParamSpec *properties[N_PROPERTIES] = {NULL, }; +/****************************************************************************** + * GObject Implementation + *****************************************************************************/ +G_DEFINE_TYPE(PurpleRequestFieldChoice, purple_request_field_choice, + PURPLE_TYPE_REQUEST_FIELD) +purple_request_field_choice_get_property(GObject *obj, guint param_id, + GValue *value, GParamSpec *pspec) + PurpleRequestFieldChoice *field = PURPLE_REQUEST_FIELD_CHOICE(obj); + case PROP_DEFAULT_VALUE: + g_value_set_pointer(value, + purple_request_field_choice_get_default_value(field)); + g_value_set_pointer(value, + purple_request_field_choice_get_value(field)); + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); +purple_request_field_choice_set_property(GObject *obj, guint param_id, + const GValue *value, GParamSpec *pspec) + PurpleRequestFieldChoice *field = PURPLE_REQUEST_FIELD_CHOICE(obj); + case PROP_DEFAULT_VALUE: + purple_request_field_choice_set_default_value(field, + g_value_get_pointer(value)); + purple_request_field_choice_set_value(field, + g_value_get_pointer(value)); + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); +purple_request_field_choice_finalize(GObject *obj) { + PurpleRequestFieldChoice *field = PURPLE_REQUEST_FIELD_CHOICE(obj); + g_list_free_full(field->elements, + (GDestroyNotify)purple_key_value_pair_free); + G_OBJECT_CLASS(purple_request_field_choice_parent_class)->finalize(obj); +purple_request_field_choice_init(G_GNUC_UNUSED PurpleRequestFieldChoice *field) { +purple_request_field_choice_class_init(PurpleRequestFieldChoiceClass *klass) { + GObjectClass *obj_class = G_OBJECT_CLASS(klass); + obj_class->finalize = purple_request_field_choice_finalize; + obj_class->get_property = purple_request_field_choice_get_property; + obj_class->set_property = purple_request_field_choice_set_property; + * PurpleRequestFieldChoice:default-value: + * The default value of the field. + properties[PROP_DEFAULT_VALUE] = g_param_spec_pointer( + "default-value", "default-value", + "The default value of the field.", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + * PurpleRequestFieldChoice:value: + * The value of the field. + properties[PROP_VALUE] = g_param_spec_pointer( + "The value of the field.", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties(obj_class, N_PROPERTIES, properties); +/****************************************************************************** + *****************************************************************************/ +purple_request_field_choice_new(const char *id, const char *text, + gpointer default_value) + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + return g_object_new(PURPLE_TYPE_REQUEST_FIELD_CHOICE, + "default-value", default_value, + "value", default_value, +purple_request_field_choice_add(PurpleRequestFieldChoice *field, + const char *label, gpointer value) + purple_request_field_choice_add_full(field, label, value, NULL); +purple_request_field_choice_add_full(PurpleRequestFieldChoice *field, + const char *label, gpointer value, + GDestroyNotify destroy) + PurpleKeyValuePair *choice; + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_CHOICE(field)); + g_return_if_fail(label != NULL); + choice = purple_key_value_pair_new_full(label, value, destroy); + field->elements = g_list_append(field->elements, choice); +purple_request_field_choice_set_default_value(PurpleRequestFieldChoice *field, + gpointer default_value) + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_CHOICE(field)); + if(field->default_value == default_value) { + field->default_value = default_value; + g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_DEFAULT_VALUE]); +purple_request_field_choice_set_value(PurpleRequestFieldChoice *field, + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_CHOICE(field)); + if(field->value == value) { + g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_VALUE]); +purple_request_field_choice_get_default_value(PurpleRequestFieldChoice *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_CHOICE(field), NULL); + return field->default_value; +purple_request_field_choice_get_value(PurpleRequestFieldChoice *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_CHOICE(field), NULL); +purple_request_field_choice_get_elements(PurpleRequestFieldChoice *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_CHOICE(field), NULL); + return field->elements; --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/request/purplerequestfieldchoice.h Fri Mar 10 16:37:41 2023 -0600
@@ -0,0 +1,137 @@
+ * 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 + * 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" +#ifndef PURPLE_REQUEST_FIELD_CHOICE_H +#define PURPLE_REQUEST_FIELD_CHOICE_H +#include <glib-object.h> + * PurpleRequestFieldChoice: + * A choice request field. +typedef struct _PurpleRequestFieldChoice PurpleRequestFieldChoice; +#include "purplerequestfield.h" +#define PURPLE_TYPE_REQUEST_FIELD_CHOICE (purple_request_field_choice_get_type()) +G_DECLARE_FINAL_TYPE(PurpleRequestFieldChoice, purple_request_field_choice, + PURPLE, REQUEST_FIELD_CHOICE, PurpleRequestField) + * purple_request_field_choice_new: + * @text: The optional label of the field. + * @default_value: The default choice. + * Creates a multiple choice field. + * This is often represented as a group of radio buttons. + * Returns: (transfer full): The new field. +PurpleRequestField *purple_request_field_choice_new(const char *id, const char *text, gpointer default_value); + * purple_request_field_choice_add: + * @field: The choice field. + * @label: The choice label. + * @data: The choice value. + * Adds a choice to a multiple choice field. +void purple_request_field_choice_add(PurpleRequestFieldChoice *field, const char *label, gpointer data); + * purple_request_field_choice_add_full: + * @field: The choice field. + * @label: The choice label. + * @data: The choice value. + * @destroy: The value destroy function. + * Adds a choice to a multiple choice field with destructor for value. +void purple_request_field_choice_add_full(PurpleRequestFieldChoice *field, const char *label, gpointer data, GDestroyNotify destroy); + * purple_request_field_choice_set_default_value: + * @default_value: The default value. + * Sets the default value in a choice field. +void purple_request_field_choice_set_default_value(PurpleRequestFieldChoice *field, gpointer default_value); + * purple_request_field_choice_set_value: + * Sets the value in a choice field. +void purple_request_field_choice_set_value(PurpleRequestFieldChoice *field, gpointer value); + * purple_request_field_choice_get_default_value: + * Returns the default value in a choice field. + * Returns: The default value. +gpointer purple_request_field_choice_get_default_value(PurpleRequestFieldChoice *field); + * purple_request_field_choice_get_value: + * Returns the user-entered value in a choice field. +gpointer purple_request_field_choice_get_value(PurpleRequestFieldChoice *field); + * purple_request_field_choice_get_elements: + * Returns a list of elements in a choice field. + * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of pairs of {label, value}. +GList *purple_request_field_choice_get_elements(PurpleRequestFieldChoice *field); +#endif /* PURPLE_REQUEST_FIELD_CHOICE_H */ --- a/pidgin/gtkrequest.c Fri Mar 10 16:36:55 2023 -0600
+++ b/pidgin/gtkrequest.c Fri Mar 10 16:37:41 2023 -0600
@@ -257,7 +257,8 @@
gpointer value = g_object_get_data(item, "choice_value");
- purple_request_field_choice_set_value(field, value);
+ purple_request_field_choice_set_value(PURPLE_REQUEST_FIELD_CHOICE(field), @@ -1243,6 +1244,7 @@
create_choice_field(PurpleRequestField *field) {
+ PurpleRequestFieldChoice *choicefield = PURPLE_REQUEST_FIELD_CHOICE(field); GListModel *model = NULL;
@@ -1250,12 +1252,12 @@
- default_value = purple_request_field_choice_get_value(field);
+ default_value = purple_request_field_choice_get_value(choicefield); widget = gtk_drop_down_new_from_strings(NULL);
model = gtk_drop_down_get_model(GTK_DROP_DOWN(widget));
- elements = purple_request_field_choice_get_elements(field);
+ elements = purple_request_field_choice_get_elements(choicefield); for(GList *l = elements; l != NULL; l = g_list_next(l)) {
PurpleKeyValuePair *choice = l->data;
@@ -1281,7 +1283,7 @@
if(default_index == GTK_INVALID_LIST_POSITION && index > 0) {
GObject *item = g_list_model_get_item(model, 0);
gpointer value = g_object_get_data(item, "choice_value");
- purple_request_field_choice_set_value(field, value);
+ purple_request_field_choice_set_value(choicefield, value); @@ -2150,9 +2152,9 @@
widget = create_int_field(field);
} else if(PURPLE_IS_REQUEST_FIELD_BOOL(field)) {
widget = create_bool_field(field, cpar);
- } else if (type == PURPLE_REQUEST_FIELD_CHOICE)
+ } else if(PURPLE_IS_REQUEST_FIELD_CHOICE(field)) { widget = create_choice_field(field);
- else if (type == PURPLE_REQUEST_FIELD_LIST)
+ } else if (type == PURPLE_REQUEST_FIELD_LIST) widget = create_list_field(field);
else if (type == PURPLE_REQUEST_FIELD_IMAGE)
widget = create_image_field(field);