pidgin/pidgin

Make PurpleRequestFieldAccount into a GObject

14 months ago, Elliott Sales de Andrade
1b5ce0f4302d
Parents e9a794bfe183
Children 1a89a067a0d5
Make PurpleRequestFieldAccount 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, and I should just make these new files entirely?

Note, I didn't bother re-indenting some of the blocks, because they'll all eventually be moved when everything is subclassed.

Testing Done:
Compiled, and opened Request Fields from the Demo protocol.

Reviewed at https://reviews.imfreedom.org/r/2331/
--- a/finch/gntblist.c Fri Mar 10 01:10:24 2023 -0600
+++ b/finch/gntblist.c Fri Mar 10 01:15:41 2023 -0600
@@ -601,9 +601,12 @@
purple_request_field_set_type_hint(field, "group");
field = purple_request_field_account_new("account", _("Account"), NULL);
- purple_request_field_account_set_show_all(field, FALSE);
- if (account)
- purple_request_field_account_set_value(field, account);
+ purple_request_field_account_set_show_all(PURPLE_REQUEST_FIELD_ACCOUNT(field),
+ FALSE);
+ if(account) {
+ purple_request_field_account_set_value(PURPLE_REQUEST_FIELD_ACCOUNT(field),
+ account);
+ }
purple_request_group_add_field(group, field);
purple_request_fields(NULL, _("Add Buddy"), NULL, _("Please enter buddy information."),
@@ -689,9 +692,12 @@
purple_request_page_add_group(page, group);
field = purple_request_field_account_new("account", _("Account"), NULL);
- purple_request_field_account_set_show_all(field, FALSE);
- if (account)
- purple_request_field_account_set_value(field, account);
+ purple_request_field_account_set_show_all(PURPLE_REQUEST_FIELD_ACCOUNT(field),
+ FALSE);
+ if(account) {
+ purple_request_field_account_set_value(PURPLE_REQUEST_FIELD_ACCOUNT(field),
+ account);
+ }
purple_request_group_add_field(group, field);
field = purple_request_field_string_new("name", _("Name"), name, FALSE);
--- a/finch/gntrequest.c Fri Mar 10 01:10:24 2023 -0600
+++ b/finch/gntrequest.c Fri Mar 10 01:15:41 2023 -0600
@@ -360,12 +360,16 @@
purple_request_field_list_set_selected(field, selected);
g_list_free(selected);
- }
- else if (type == PURPLE_REQUEST_FIELD_ACCOUNT)
- {
- GntWidget *combo = g_object_get_data(G_OBJECT(field), "finch-ui-data");
- PurpleAccount *acc = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo));
- purple_request_field_account_set_value(field, acc);
+
+ } else if (PURPLE_IS_REQUEST_FIELD_ACCOUNT(field)) {
+ GntWidget *combo = NULL;
+ PurpleAccount *acc = NULL;
+ PurpleRequestFieldAccount *afield = NULL;
+
+ combo = g_object_get_data(G_OBJECT(field), "finch-ui-data");
+ acc = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo));
+ afield = PURPLE_REQUEST_FIELD_ACCOUNT(field);
+ purple_request_field_account_set_value(afield, acc);
}
}
}
@@ -529,14 +533,15 @@
static GntWidget*
create_account_field(PurpleRequestField *field)
{
+ PurpleRequestFieldAccount *afield = PURPLE_REQUEST_FIELD_ACCOUNT(field);
gboolean all;
PurpleAccount *def;
GntWidget *combo = gnt_combo_box_new();
- all = purple_request_field_account_get_show_all(field);
- def = purple_request_field_account_get_value(field);
- if (!def) {
- def = purple_request_field_account_get_default_value(field);
+ all = purple_request_field_account_get_show_all(afield);
+ def = purple_request_field_account_get_value(afield);
+ if(!PURPLE_IS_ACCOUNT(def)) {
+ def = purple_request_field_account_get_default_value(afield);
}
if(all) {
@@ -662,7 +667,7 @@
widget = create_choice_field(field);
} else if (type == PURPLE_REQUEST_FIELD_LIST) {
widget = create_list_field(field);
- } else if (type == PURPLE_REQUEST_FIELD_ACCOUNT) {
+ } else if(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field)) {
accountlist = create_account_field(field);
widget = accountlist;
} else {
@@ -912,6 +917,9 @@
GntWidget *finch_request_field_get_widget(PurpleRequestField *field)
{
GntWidget *ret = NULL;
+ if(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field)) {
+ ret = create_account_field(field);
+ } else {
switch (purple_request_field_get_field_type(field)) {
case PURPLE_REQUEST_FIELD_BOOLEAN:
ret = create_boolean_field(field);
@@ -928,14 +936,12 @@
case PURPLE_REQUEST_FIELD_LIST:
ret = create_list_field(field);
break;
- case PURPLE_REQUEST_FIELD_ACCOUNT:
- ret = create_account_field(field);
- break;
default:
purple_debug_error("GntRequest", "Unimplemented request-field %d\n",
purple_request_field_get_field_type(field));
break;
}
+ }
return ret;
}
--- a/libpurple/meson.build Fri Mar 10 01:10:24 2023 -0600
+++ b/libpurple/meson.build Fri Mar 10 01:15:41 2023 -0600
@@ -97,6 +97,7 @@
'purplewhiteboarduiops.c',
'queuedoutputstream.c',
'request.c',
+ 'request/purplerequestfieldaccount.c',
'request-datasheet.c',
'roomlist.c',
'savedstatuses.c',
@@ -219,6 +220,10 @@
'xmlnode.h',
]
+purple_request_headers = [
+ 'request/purplerequestfieldaccount.h',
+]
+
purple_generated_sources = []
# An environment for unit tests.
@@ -292,7 +297,7 @@
enums_h = enums[1]
PURPLE_H_INCLUDES = []
-foreach header : purple_coreheaders + purple_mediaheaders + ['version.h', 'purpleenums.h']
+foreach header : purple_coreheaders + purple_mediaheaders + purple_request_headers + ['version.h', 'purpleenums.h']
PURPLE_H_INCLUDES += f'#include <libpurple/@header@>'
endforeach
purple_h_conf = configuration_data()
@@ -339,6 +344,9 @@
install_headers(purple_mediaheaders,
subdir : purple_include_base / 'media')
+install_headers(purple_request_headers,
+ subdir : purple_include_base / 'request')
+
pkgconfig.generate(
libpurple,
name : 'libpurple3',
--- a/libpurple/plugins/idle/idle.c Fri Mar 10 01:10:24 2023 -0600
+++ b/libpurple/plugins/idle/idle.c Fri Mar 10 01:15:41 2023 -0600
@@ -158,12 +158,14 @@
PurpleRequestPage *request;
PurpleRequestGroup *group;
PurpleRequestField *field;
+ PurpleRequestFieldAccount *afield;
group = purple_request_group_new(NULL);
field = purple_request_field_account_new("acct", _("Account"), NULL);
- purple_request_field_account_set_filter(field, idleable_filter);
- purple_request_field_account_set_show_all(field, FALSE);
+ afield = PURPLE_REQUEST_FIELD_ACCOUNT(field);
+ purple_request_field_account_set_filter(afield, idleable_filter);
+ purple_request_field_account_set_show_all(afield, FALSE);
purple_request_group_add_field(group, field);
field = purple_request_field_int_new("mins", _("Minutes"), 10, 0, 9999);
@@ -190,6 +192,7 @@
PurpleRequestPage *request;
PurpleRequestGroup *group;
PurpleRequestField *field;
+ PurpleRequestFieldAccount *afield;
if (idled_accts == NULL)
{
@@ -200,8 +203,9 @@
group = purple_request_group_new(NULL);
field = purple_request_field_account_new("acct", _("Account"), NULL);
- purple_request_field_account_set_filter(field, unidle_filter);
- purple_request_field_account_set_show_all(field, FALSE);
+ afield = PURPLE_REQUEST_FIELD_ACCOUNT(field);
+ purple_request_field_account_set_filter(afield, unidle_filter);
+ purple_request_field_account_set_show_all(afield, FALSE);
purple_request_group_add_field(group, field);
request = purple_request_page_new();
--- a/libpurple/purplerequestfield.c Fri Mar 10 01:10:24 2023 -0600
+++ b/libpurple/purplerequestfield.c Fri Mar 10 01:15:41 2023 -0600
@@ -24,7 +24,6 @@
#include "glibcompat.h"
#include "request.h"
#include "debug.h"
-#include "purpleaccountmanager.h"
#include "purplekeyvaluepair.h"
#include "purpleprivate.h"
@@ -78,14 +77,6 @@
} list;
struct {
- PurpleAccount *default_account;
- PurpleAccount *account;
- gboolean show_all;
-
- PurpleFilterAccountFunc filter_func;
- } account;
-
- struct {
unsigned int scale_x;
unsigned int scale_y;
char *buffer;
@@ -1414,158 +1405,6 @@
}
PurpleRequestField *
-purple_request_field_account_new(const char *id, const char *text,
- PurpleAccount *account)
-{
- 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_ACCOUNT);
-
- if(account == NULL) {
- PurpleAccountManager *manager = purple_account_manager_get_default();
- GList *accounts = purple_account_manager_get_connected(manager);
-
- if(accounts != NULL) {
- account = accounts->data;
- g_list_free(accounts);
- }
- }
-
- purple_request_field_account_set_default_value(field, account);
- purple_request_field_account_set_value(field, account);
-
- return field;
-}
-
-void
-purple_request_field_account_set_default_value(PurpleRequestField *field,
- PurpleAccount *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_ACCOUNT);
-
- priv->u.account.default_account = default_value;
-}
-
-void
-purple_request_field_account_set_value(PurpleRequestField *field,
- PurpleAccount *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_ACCOUNT);
-
- priv->u.account.account = value;
-}
-
-void
-purple_request_field_account_set_show_all(PurpleRequestField *field,
- gboolean show_all)
-{
- 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_ACCOUNT);
-
- if(priv->u.account.show_all == show_all) {
- return;
- }
-
- priv->u.account.show_all = show_all;
-
- if(!show_all) {
- PurpleAccountManager *manager = purple_account_manager_get_default();
- GList *accounts = purple_account_manager_get_connected(manager);
-
- if(purple_account_is_connected(priv->u.account.default_account)) {
- purple_request_field_account_set_default_value(field,
- accounts->data);
- }
-
- if(purple_account_is_connected(priv->u.account.account)) {
- purple_request_field_account_set_value(field,
- accounts->data);
- }
-
- g_list_free(accounts);
- }
-}
-
-void
-purple_request_field_account_set_filter(PurpleRequestField *field,
- PurpleFilterAccountFunc filter_func)
-{
- 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_ACCOUNT);
-
- priv->u.account.filter_func = filter_func;
-}
-
-PurpleAccount *
-purple_request_field_account_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_ACCOUNT, NULL);
-
- return priv->u.account.default_account;
-}
-
-PurpleAccount *
-purple_request_field_account_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_ACCOUNT, NULL);
-
- return priv->u.account.account;
-}
-
-gboolean
-purple_request_field_account_get_show_all(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_ACCOUNT, FALSE);
-
- return priv->u.account.show_all;
-}
-
-PurpleFilterAccountFunc
-purple_request_field_account_get_filter(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_ACCOUNT, FALSE);
-
- return priv->u.account.filter_func;
-}
-
-PurpleRequestField *
purple_request_field_datasheet_new(const char *id,
const gchar *text, PurpleRequestDatasheet *sheet)
{
--- a/libpurple/purplerequestfield.h Fri Mar 10 01:10:24 2023 -0600
+++ b/libpurple/purplerequestfield.h Fri Mar 10 01:15:41 2023 -0600
@@ -39,7 +39,7 @@
*/
typedef struct _PurpleRequestField PurpleRequestField;
-#include "account.h"
+#include "request.h"
#include "request-datasheet.h"
#define PURPLE_DEFAULT_ACTION_NONE -1
@@ -71,7 +71,6 @@
* @PURPLE_REQUEST_FIELD_LIST: List field.
* @PURPLE_REQUEST_FIELD_LABEL: Label field.
* @PURPLE_REQUEST_FIELD_IMAGE: Image field.
- * @PURPLE_REQUEST_FIELD_ACCOUNT: #PurpleAccount field.
* @PURPLE_REQUEST_FIELD_DATASHEET: Datasheet field.
*
* A type of field.
@@ -86,7 +85,6 @@
PURPLE_REQUEST_FIELD_LIST,
PURPLE_REQUEST_FIELD_LABEL,
PURPLE_REQUEST_FIELD_IMAGE,
- PURPLE_REQUEST_FIELD_ACCOUNT,
PURPLE_REQUEST_FIELD_DATASHEET
} PurpleRequestFieldType;
@@ -887,118 +885,6 @@
unsigned int purple_request_field_image_get_scale_y(PurpleRequestField *field);
/**************************************************************************/
-/* Account Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_account_new:
- * @id: The field ID.
- * @text: The text label of the field.
- * @account: The optional default account.
- *
- * Creates an account field.
- *
- * By default, this field will not show offline accounts.
- *
- * Returns: (transfer full): The new field.
- */
-PurpleRequestField *purple_request_field_account_new(const char *id,
- const char *text,
- PurpleAccount *account);
-
-/**
- * purple_request_field_account_set_default_value:
- * @field: The account field.
- * @default_value: The default account.
- *
- * Sets the default account on an account field.
- */
-void purple_request_field_account_set_default_value(PurpleRequestField *field,
- PurpleAccount *default_value);
-
-/**
- * purple_request_field_account_set_value:
- * @field: The account field.
- * @value: The account.
- *
- * Sets the account in an account field.
- */
-void purple_request_field_account_set_value(PurpleRequestField *field,
- PurpleAccount *value);
-
-/**
- * purple_request_field_account_set_show_all:
- * @field: The account field.
- * @show_all: Whether or not to show all accounts.
- *
- * Sets whether or not to show all accounts in an account field.
- *
- * If TRUE, all accounts, online or offline, will be shown. If FALSE,
- * only online accounts will be shown.
- */
-void purple_request_field_account_set_show_all(PurpleRequestField *field,
- gboolean show_all);
-
-/**
- * purple_request_field_account_set_filter:
- * @field: The account field.
- * @filter_func: (scope notified): The account filter function.
- *
- * Sets the account filter function in an account field.
- *
- * This function will determine which accounts get displayed and which
- * don't.
- */
-void purple_request_field_account_set_filter(PurpleRequestField *field,
- PurpleFilterAccountFunc filter_func);
-
-/**
- * purple_request_field_account_get_default_value:
- * @field: The field.
- *
- * Returns the default account in an account field.
- *
- * Returns: (transfer none): The default account.
- */
-PurpleAccount *purple_request_field_account_get_default_value(PurpleRequestField *field);
-
-/**
- * purple_request_field_account_get_value:
- * @field: The field.
- *
- * Returns the user-entered account in an account field.
- *
- * Returns: (transfer none): The user-entered account.
- */
-PurpleAccount *purple_request_field_account_get_value(PurpleRequestField *field);
-
-/**
- * purple_request_field_account_get_show_all:
- * @field: The account field.
- *
- * Returns whether or not to show all accounts in an account field.
- *
- * If TRUE, all accounts, online or offline, will be shown. If FALSE,
- * only online accounts will be shown.
- *
- * Returns: Whether or not to show all accounts.
- */
-gboolean purple_request_field_account_get_show_all(PurpleRequestField *field);
-
-/**
- * purple_request_field_account_get_filter:
- * @field: The account field.
- *
- * Returns the account filter function in an account field.
- *
- * This function will determine which accounts get displayed and which
- * don't.
- *
- * Returns: (transfer none): The account filter function.
- */
-PurpleFilterAccountFunc purple_request_field_account_get_filter(PurpleRequestField *field);
-
-/**************************************************************************/
/* Datasheet Field API */
/**************************************************************************/
--- a/libpurple/purplerequestpage.c Fri Mar 10 01:10:24 2023 -0600
+++ b/libpurple/purplerequestpage.c Fri Mar 10 01:15:41 2023 -0600
@@ -23,6 +23,7 @@
#include "glibcompat.h"
#include "purplerequestpage.h"
+#include "request/purplerequestfieldaccount.h"
#include "purpleprivate.h"
struct _PurpleRequestPage {
@@ -351,9 +352,10 @@
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_ACCOUNT(field)) {
return NULL;
}
- return purple_request_field_account_get_value(field);
+ return purple_request_field_account_get_value(PURPLE_REQUEST_FIELD_ACCOUNT(field));
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/request/purplerequestfieldaccount.c Fri Mar 10 01:15:41 2023 -0600
@@ -0,0 +1,295 @@
+/* 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 "purpleaccountmanager.h"
+#include "purplerequestfield.h"
+#include "purplerequestfieldaccount.h"
+
+struct _PurpleRequestFieldAccount {
+ PurpleRequestField parent;
+
+ PurpleAccount *default_account;
+ PurpleAccount *account;
+ gboolean show_all;
+
+ PurpleFilterAccountFunc filter_func;
+};
+
+enum {
+ PROP_0,
+ PROP_DEFAULT_VALUE,
+ PROP_VALUE,
+ PROP_SHOW_ALL,
+ N_PROPERTIES,
+};
+static GParamSpec *properties[N_PROPERTIES] = {NULL, };
+
+G_DEFINE_TYPE(PurpleRequestFieldAccount, purple_request_field_account,
+ PURPLE_TYPE_REQUEST_FIELD)
+
+/******************************************************************************
+ * GObject Implementation
+ *****************************************************************************/
+static void
+purple_request_field_account_get_property(GObject *obj, guint param_id,
+ GValue *value, GParamSpec *pspec)
+{
+ PurpleRequestFieldAccount *field = PURPLE_REQUEST_FIELD_ACCOUNT(obj);
+
+ switch(param_id) {
+ case PROP_DEFAULT_VALUE:
+ g_value_set_object(value,
+ purple_request_field_account_get_default_value(field));
+ break;
+ case PROP_VALUE:
+ g_value_set_object(value,
+ purple_request_field_account_get_value(field));
+ break;
+ case PROP_SHOW_ALL:
+ g_value_set_boolean(value,
+ purple_request_field_account_get_show_all(field));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
+ break;
+ }
+}
+
+static void
+purple_request_field_account_set_property(GObject *obj, guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ PurpleRequestFieldAccount *field = PURPLE_REQUEST_FIELD_ACCOUNT(obj);
+
+ switch(param_id) {
+ case PROP_DEFAULT_VALUE:
+ purple_request_field_account_set_default_value(field,
+ g_value_get_object(value));
+ break;
+ case PROP_VALUE:
+ purple_request_field_account_set_value(field,
+ g_value_get_object(value));
+ break;
+ case PROP_SHOW_ALL:
+ purple_request_field_account_set_show_all(field,
+ g_value_get_boolean(value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
+ break;
+ }
+}
+
+static void
+purple_request_field_account_finalize(GObject *obj) {
+ PurpleRequestFieldAccount *field = PURPLE_REQUEST_FIELD_ACCOUNT(obj);
+
+ g_clear_object(&field->default_account);
+ g_clear_object(&field->account);
+
+ G_OBJECT_CLASS(purple_request_field_account_parent_class)->finalize(obj);
+}
+
+static void
+purple_request_field_account_init(G_GNUC_UNUSED PurpleRequestFieldAccount *field)
+{
+}
+
+static void
+purple_request_field_account_class_init(PurpleRequestFieldAccountClass *klass) {
+ GObjectClass *obj_class = G_OBJECT_CLASS(klass);
+
+ obj_class->finalize = purple_request_field_account_finalize;
+ obj_class->get_property = purple_request_field_account_get_property;
+ obj_class->set_property = purple_request_field_account_set_property;
+
+ /**
+ * PurpleRequestFieldAccount:default-value:
+ *
+ * The default value of the field.
+ *
+ * Since: 3.0.0
+ */
+ properties[PROP_DEFAULT_VALUE] = g_param_spec_object(
+ "default-value", "default-value",
+ "The default value of the field.",
+ PURPLE_TYPE_ACCOUNT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ /**
+ * PurpleRequestFieldAccount:value:
+ *
+ * The value of the field.
+ *
+ * Since: 3.0.0
+ */
+ properties[PROP_VALUE] = g_param_spec_object(
+ "value", "value",
+ "The value of the field.",
+ PURPLE_TYPE_ACCOUNT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ /**
+ * PurpleRequestFieldAccount:show-all:
+ *
+ * Whether to show all accounts in an account field.
+ *
+ * If %TRUE, all accounts, online or offline, will be shown. If %FALSE,
+ * only online accounts will be shown.
+ *
+ * Since: 3.0.0
+ */
+ properties[PROP_SHOW_ALL] = g_param_spec_boolean(
+ "show-all", "show-all",
+ "Whether to show all accounts in an account field.",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
+}
+
+/******************************************************************************
+ * Public API
+ *****************************************************************************/
+PurpleRequestField *
+purple_request_field_account_new(const char *id, const char *text,
+ PurpleAccount *account)
+{
+ g_return_val_if_fail(id != NULL, NULL);
+ g_return_val_if_fail(text != NULL, NULL);
+
+ if(account == NULL) {
+ PurpleAccountManager *manager = purple_account_manager_get_default();
+ GList *accounts = purple_account_manager_get_connected(manager);
+
+ if(accounts != NULL) {
+ account = accounts->data;
+ g_list_free(accounts);
+ }
+ }
+
+ return g_object_new(PURPLE_TYPE_REQUEST_FIELD_ACCOUNT,
+ "id", id,
+ "label", text,
+ "default-value", account,
+ "value", account,
+ NULL);
+}
+
+void
+purple_request_field_account_set_default_value(PurpleRequestFieldAccount *field,
+ PurpleAccount *default_value)
+{
+ g_return_if_fail(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field));
+
+ if(g_set_object(&field->default_account, default_value)) {
+ g_object_notify_by_pspec(G_OBJECT(field),
+ properties[PROP_DEFAULT_VALUE]);
+ }
+}
+
+void
+purple_request_field_account_set_value(PurpleRequestFieldAccount *field,
+ PurpleAccount *value)
+{
+ g_return_if_fail(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field));
+
+ if(g_set_object(&field->account, value)) {
+ g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_VALUE]);
+ }
+}
+
+void
+purple_request_field_account_set_show_all(PurpleRequestFieldAccount *field,
+ gboolean show_all)
+{
+ g_return_if_fail(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field));
+
+ if(field->show_all == show_all) {
+ return;
+ }
+
+ field->show_all = show_all;
+
+ g_object_freeze_notify(G_OBJECT(field));
+
+ if(!show_all) {
+ PurpleAccountManager *manager = purple_account_manager_get_default();
+ GList *accounts = purple_account_manager_get_connected(manager);
+
+ if(purple_account_is_connected(field->default_account)) {
+ purple_request_field_account_set_default_value(field,
+ accounts->data);
+ }
+
+ if(purple_account_is_connected(field->account)) {
+ purple_request_field_account_set_value(field, accounts->data);
+ }
+
+ g_list_free(accounts);
+ }
+
+ g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_SHOW_ALL]);
+
+ g_object_thaw_notify(G_OBJECT(field));
+}
+
+void
+purple_request_field_account_set_filter(PurpleRequestFieldAccount *field,
+ PurpleFilterAccountFunc filter_func)
+{
+ g_return_if_fail(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field));
+
+ field->filter_func = filter_func;
+}
+
+PurpleAccount *
+purple_request_field_account_get_default_value(PurpleRequestFieldAccount *field)
+{
+ g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field), NULL);
+
+ return field->default_account;
+}
+
+PurpleAccount *
+purple_request_field_account_get_value(PurpleRequestFieldAccount *field) {
+ g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field), NULL);
+
+ return field->account;
+}
+
+gboolean
+purple_request_field_account_get_show_all(PurpleRequestFieldAccount *field) {
+ g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), FALSE);
+
+ return field->show_all;
+}
+
+PurpleFilterAccountFunc
+purple_request_field_account_get_filter(PurpleRequestFieldAccount *field) {
+ g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), NULL);
+
+ return field->filter_func;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/request/purplerequestfieldaccount.h Fri Mar 10 01:15:41 2023 -0600
@@ -0,0 +1,154 @@
+/*
+ * 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_ACCOUNT_H
+#define PURPLE_REQUEST_FIELD_ACCOUNT_H
+
+#include <stdlib.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+/**
+ * PurpleRequestFieldAccount:
+ *
+ * An account request field.
+ */
+typedef struct _PurpleRequestFieldAccount PurpleRequestFieldAccount;
+
+#include "account.h"
+
+G_BEGIN_DECLS
+
+#define PURPLE_TYPE_REQUEST_FIELD_ACCOUNT (purple_request_field_account_get_type())
+G_DECLARE_FINAL_TYPE(PurpleRequestFieldAccount, purple_request_field_account,
+ PURPLE, REQUEST_FIELD_ACCOUNT, PurpleRequestField)
+
+/**
+ * purple_request_field_account_new:
+ * @id: The field ID.
+ * @text: The text label of the field.
+ * @account: (transfer none): The optional default account.
+ *
+ * Creates an account field.
+ *
+ * By default, this field will not show offline accounts.
+ *
+ * Returns: (transfer full): The new field.
+ */
+PurpleRequestField *purple_request_field_account_new(const char *id, const char *text, PurpleAccount *account);
+
+/**
+ * purple_request_field_account_set_default_value:
+ * @field: The account field.
+ * @default_value: (transfer none): The default account.
+ *
+ * Sets the default account on an account field.
+ */
+void purple_request_field_account_set_default_value(PurpleRequestFieldAccount *field, PurpleAccount *default_value);
+
+/**
+ * purple_request_field_account_set_value:
+ * @field: The account field.
+ * @value: (transfer none): The account.
+ *
+ * Sets the account in an account field.
+ */
+void purple_request_field_account_set_value(PurpleRequestFieldAccount *field, PurpleAccount *value);
+
+/**
+ * purple_request_field_account_set_show_all:
+ * @field: The account field.
+ * @show_all: Whether or not to show all accounts.
+ *
+ * Sets whether or not to show all accounts in an account field.
+ *
+ * If TRUE, all accounts, online or offline, will be shown. If FALSE,
+ * only online accounts will be shown.
+ */
+void purple_request_field_account_set_show_all(PurpleRequestFieldAccount *field, gboolean show_all);
+
+/**
+ * purple_request_field_account_set_filter:
+ * @field: The account field.
+ * @filter_func: (scope notified): The account filter function.
+ *
+ * Sets the account filter function in an account field.
+ *
+ * This function will determine which accounts get displayed and which
+ * don't.
+ */
+void purple_request_field_account_set_filter(PurpleRequestFieldAccount *field, PurpleFilterAccountFunc filter_func);
+
+/**
+ * purple_request_field_account_get_default_value:
+ * @field: The field.
+ *
+ * Returns the default account in an account field.
+ *
+ * Returns: (transfer none): The default account.
+ */
+PurpleAccount *purple_request_field_account_get_default_value(PurpleRequestFieldAccount *field);
+
+/**
+ * purple_request_field_account_get_value:
+ * @field: The field.
+ *
+ * Returns the user-entered account in an account field.
+ *
+ * Returns: (transfer none): The user-entered account.
+ */
+PurpleAccount *purple_request_field_account_get_value(PurpleRequestFieldAccount *field);
+
+/**
+ * purple_request_field_account_get_show_all:
+ * @field: The account field.
+ *
+ * Returns whether or not to show all accounts in an account field.
+ *
+ * If TRUE, all accounts, online or offline, will be shown. If FALSE,
+ * only online accounts will be shown.
+ *
+ * Returns: Whether or not to show all accounts.
+ */
+gboolean purple_request_field_account_get_show_all(PurpleRequestFieldAccount *field);
+
+/**
+ * purple_request_field_account_get_filter:
+ * @field: The account field.
+ *
+ * Returns the account filter function in an account field.
+ *
+ * This function will determine which accounts get displayed and which
+ * don't.
+ *
+ * Returns: (transfer none): The account filter function.
+ */
+PurpleFilterAccountFunc purple_request_field_account_get_filter(PurpleRequestFieldAccount *field);
+
+G_END_DECLS
+
+#endif /* PURPLE_REQUEST_FIELD_ACCOUNT_H */
--- a/pidgin/gtkrequest.c Fri Mar 10 01:10:24 2023 -0600
+++ b/pidgin/gtkrequest.c Fri Mar 10 01:15:41 2023 -0600
@@ -268,7 +268,8 @@
PidginAccountChooser *chooser = PIDGIN_ACCOUNT_CHOOSER(obj);
purple_request_field_account_set_value(
- field, pidgin_account_chooser_get_selected(chooser));
+ PURPLE_REQUEST_FIELD_ACCOUNT(field),
+ pidgin_account_chooser_get_selected(chooser));
req_field_changed_common(GTK_WIDGET(obj), field);
}
@@ -1083,8 +1084,8 @@
PurpleRequestField *fld = fields->data;
fields = fields->next;
- if (purple_request_field_get_field_type(fld) == PURPLE_REQUEST_FIELD_ACCOUNT &&
- purple_request_field_is_visible(fld))
+ if(PURPLE_IS_REQUEST_FIELD_ACCOUNT(fld) &&
+ purple_request_field_is_visible(fld))
{
const char *type_hint = purple_request_field_get_type_hint(fld);
if (purple_strequal(type_hint, "account"))
@@ -1316,15 +1317,17 @@
static GtkWidget *
create_account_field(PurpleRequestField *field)
{
+ PurpleRequestFieldAccount *afield = NULL;
GtkWidget *widget = NULL;
PurpleAccount *account = NULL;
PurpleFilterAccountFunc account_filter = NULL;
GtkFilter *filter = NULL;
widget = pidgin_account_chooser_new();
- account = purple_request_field_account_get_default_value(field);
-
- account_filter = purple_request_field_account_get_filter(field);
+ afield = PURPLE_REQUEST_FIELD_ACCOUNT(field);
+ account = purple_request_field_account_get_default_value(afield);
+
+ account_filter = purple_request_field_account_get_filter(afield);
if(account_filter != NULL) {
GtkCustomFilter *custom_filter = NULL;
@@ -1334,7 +1337,7 @@
filter = GTK_FILTER(custom_filter);
}
- if(!purple_request_field_account_get_show_all(field)) {
+ if(!purple_request_field_account_get_show_all(afield)) {
GtkEveryFilter *every = NULL;
every = gtk_every_filter_new();
@@ -2144,9 +2147,9 @@
widget = create_list_field(field);
else if (type == PURPLE_REQUEST_FIELD_IMAGE)
widget = create_image_field(field);
- else if (type == PURPLE_REQUEST_FIELD_ACCOUNT)
+ else if(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field)) {
widget = create_account_field(field);
- else if (type == PURPLE_REQUEST_FIELD_DATASHEET)
+ } else if (type == PURPLE_REQUEST_FIELD_DATASHEET)
widget = create_datasheet_field(field, datasheet_buttons_sg);
else
continue;