diff options
author | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2023-03-10 01:15:41 -0600 |
---|---|---|
committer | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2023-03-10 01:15:41 -0600 |
commit | 33dea489fea7bca54847b5c4275017676fcd2c5b (patch) | |
tree | a01ee35485a78a6694fa65d1e461447e965694ab | |
parent | 36dee2d7f7b622d9e1ecf873b4bfa4779179e13d (diff) | |
download | pidgin-33dea489fea7bca54847b5c4275017676fcd2c5b.tar.gz |
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/
-rw-r--r-- | finch/gntblist.c | 18 | ||||
-rw-r--r-- | finch/gntrequest.c | 34 | ||||
-rw-r--r-- | libpurple/meson.build | 10 | ||||
-rw-r--r-- | libpurple/plugins/idle/idle.c | 12 | ||||
-rw-r--r-- | libpurple/purplerequestfield.c | 161 | ||||
-rw-r--r-- | libpurple/purplerequestfield.h | 116 | ||||
-rw-r--r-- | libpurple/purplerequestpage.c | 6 | ||||
-rw-r--r-- | libpurple/request/purplerequestfieldaccount.c | 295 | ||||
-rw-r--r-- | libpurple/request/purplerequestfieldaccount.h | 154 | ||||
-rw-r--r-- | pidgin/gtkrequest.c | 19 |
10 files changed, 514 insertions, 311 deletions
diff --git a/finch/gntblist.c b/finch/gntblist.c index 7fdd79a0ee..8536671adc 100644 --- a/finch/gntblist.c +++ b/finch/gntblist.c @@ -601,9 +601,12 @@ finch_request_add_buddy(G_GNUC_UNUSED PurpleBuddyList *list, 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 @@ finch_request_add_chat(G_GNUC_UNUSED PurpleBuddyList *list, 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); diff --git a/finch/gntrequest.c b/finch/gntrequest.c index 9385574657..224be0f40d 100644 --- a/finch/gntrequest.c +++ b/finch/gntrequest.c @@ -360,12 +360,16 @@ request_fields_cb(GntWidget *button, PurpleRequestPage *page) { 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 @@ add_account_to_combo(GntWidget *combo, PurpleAccount *account) { 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 @@ finch_request_fields(const char *title, const char *primary, 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 @@ finch_request_save_in_prefs(G_GNUC_UNUSED gpointer data, 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 @@ GntWidget *finch_request_field_get_widget(PurpleRequestField *field) 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; } diff --git a/libpurple/meson.build b/libpurple/meson.build index c83466958c..4292dcba20 100644 --- a/libpurple/meson.build +++ b/libpurple/meson.build @@ -97,6 +97,7 @@ purple_coresources = [ 'purplewhiteboarduiops.c', 'queuedoutputstream.c', 'request.c', + 'request/purplerequestfieldaccount.c', 'request-datasheet.c', 'roomlist.c', 'savedstatuses.c', @@ -219,6 +220,10 @@ purple_coreheaders = [ 'xmlnode.h', ] +purple_request_headers = [ + 'request/purplerequestfieldaccount.h', +] + purple_generated_sources = [] # An environment for unit tests. @@ -292,7 +297,7 @@ enums_c = enums[0] 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_coreheaders, install_headers(purple_mediaheaders, subdir : purple_include_base / 'media') +install_headers(purple_request_headers, + subdir : purple_include_base / 'request') + pkgconfig.generate( libpurple, name : 'libpurple3', diff --git a/libpurple/plugins/idle/idle.c b/libpurple/plugins/idle/idle.c index 55cdf78f36..1e5ee0894b 100644 --- a/libpurple/plugins/idle/idle.c +++ b/libpurple/plugins/idle/idle.c @@ -158,12 +158,14 @@ purple_idle_set_account_idle_time(G_GNUC_UNUSED GSimpleAction *action, 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 @@ purple_idle_unset_account_idle_time(G_GNUC_UNUSED GSimpleAction *action, PurpleRequestPage *request; PurpleRequestGroup *group; PurpleRequestField *field; + PurpleRequestFieldAccount *afield; if (idled_accts == NULL) { @@ -200,8 +203,9 @@ purple_idle_unset_account_idle_time(G_GNUC_UNUSED GSimpleAction *action, 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(); diff --git a/libpurple/purplerequestfield.c b/libpurple/purplerequestfield.c index d6bd858970..116cf2ba6a 100644 --- a/libpurple/purplerequestfield.c +++ b/libpurple/purplerequestfield.c @@ -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 @@ typedef struct { } 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 @@ purple_request_field_image_get_scale_y(PurpleRequestField *field) } 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) { diff --git a/libpurple/purplerequestfield.h b/libpurple/purplerequestfield.h index 3f73cbb311..3849c3dec7 100644 --- a/libpurple/purplerequestfield.h +++ b/libpurple/purplerequestfield.h @@ -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 @@ struct _PurpleRequestFieldClass { * @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 @@ typedef enum 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_x(PurpleRequestField *field); 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 */ /**************************************************************************/ diff --git a/libpurple/purplerequestpage.c b/libpurple/purplerequestpage.c index 7774a9a6d6..8868934bda 100644 --- a/libpurple/purplerequestpage.c +++ b/libpurple/purplerequestpage.c @@ -23,6 +23,7 @@ #include "glibcompat.h" #include "purplerequestpage.h" +#include "request/purplerequestfieldaccount.h" #include "purpleprivate.h" struct _PurpleRequestPage { @@ -351,9 +352,10 @@ purple_request_page_get_account(PurpleRequestPage *page, const char *id) { 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)); } diff --git a/libpurple/request/purplerequestfieldaccount.c b/libpurple/request/purplerequestfieldaccount.c new file mode 100644 index 0000000000..5e6ffec2db --- /dev/null +++ b/libpurple/request/purplerequestfieldaccount.c @@ -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; +} diff --git a/libpurple/request/purplerequestfieldaccount.h b/libpurple/request/purplerequestfieldaccount.h new file mode 100644 index 0000000000..9632a2fca1 --- /dev/null +++ b/libpurple/request/purplerequestfieldaccount.h @@ -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 */ diff --git a/pidgin/gtkrequest.c b/pidgin/gtkrequest.c index 3443978ffe..12c6adb0cf 100644 --- a/pidgin/gtkrequest.c +++ b/pidgin/gtkrequest.c @@ -268,7 +268,8 @@ field_account_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec, gpointer data) 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 @@ setup_entry_field(GtkWidget *entry, PurpleRequestField *field) 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 @@ field_custom_account_filter_cb(gpointer item, G_GNUC_UNUSED gpointer data) { 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); + afield = PURPLE_REQUEST_FIELD_ACCOUNT(field); + account = purple_request_field_account_get_default_value(afield); - account_filter = purple_request_field_account_get_filter(field); + account_filter = purple_request_field_account_get_filter(afield); if(account_filter != NULL) { GtkCustomFilter *custom_filter = NULL; @@ -1334,7 +1337,7 @@ create_account_field(PurpleRequestField *field) 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 @@ pidgin_request_fields(const char *title, const char *primary, 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; |