summaryrefslogtreecommitdiff
path: root/libpurple
diff options
context:
space:
mode:
authorElliott Sales de Andrade <quantum.analyst@gmail.com>2023-04-25 01:02:47 -0500
committerElliott Sales de Andrade <quantum.analyst@gmail.com>2023-04-25 01:02:47 -0500
commit6ef5b320d4ab0cda827749a54184c2a1e1146d9d (patch)
tree1f093eafc4369a41e3227a13d7a3a143db1a6c94 /libpurple
parent4c706c2b0b728e39c977672a8f9ca1b034fbd3eb (diff)
downloadpidgin-6ef5b320d4ab0cda827749a54184c2a1e1146d9d.tar.gz
Make PurpleRequestFieldAccount work like a GtkCustomFilter
This makes the filtering better for introspection. Also, fixed an incorrect type check. Testing Done: Enabled Demo and XMPP accounts, then tried the I'dle Mak'er plugin and confirmed that only XMPP showed in its "Set Account Idle Time" action request. Bugs closed: PIDGIN-17780 Reviewed at https://reviews.imfreedom.org/r/2442/
Diffstat (limited to 'libpurple')
-rw-r--r--libpurple/account.h2
-rw-r--r--libpurple/plugins/idle/idle.c12
-rw-r--r--libpurple/request/purplerequestfieldaccount.c46
-rw-r--r--libpurple/request/purplerequestfieldaccount.h35
4 files changed, 71 insertions, 24 deletions
diff --git a/libpurple/account.h b/libpurple/account.h
index 3992cfe203..711fa1b7c1 100644
--- a/libpurple/account.h
+++ b/libpurple/account.h
@@ -33,8 +33,6 @@
typedef struct _PurpleAccount PurpleAccount;
-typedef gboolean (*PurpleFilterAccountFunc)(PurpleAccount *account);
-
#include "buddy.h"
#include "connection.h"
#include "group.h"
diff --git a/libpurple/plugins/idle/idle.c b/libpurple/plugins/idle/idle.c
index 220f928303..5fe38ba957 100644
--- a/libpurple/plugins/idle/idle.c
+++ b/libpurple/plugins/idle/idle.c
@@ -35,7 +35,7 @@
static GList *idled_accts = NULL;
static gboolean
-unidle_filter(PurpleAccount *acct)
+unidle_filter(PurpleAccount *acct, G_GNUC_UNUSED gpointer data)
{
if (g_list_find(idled_accts, acct))
return TRUE;
@@ -44,7 +44,7 @@ unidle_filter(PurpleAccount *acct)
}
static gboolean
-idleable_filter(PurpleAccount *account)
+idleable_filter(PurpleAccount *account, G_GNUC_UNUSED gpointer data)
{
PurpleProtocol *protocol;
@@ -89,7 +89,7 @@ idle_action_ok(G_GNUC_UNUSED gpointer data, PurpleRequestPage *page) {
int tm = purple_request_page_get_integer(page, "mins");
/* only add the account to the GList if it's not already been idled */
- if(!unidle_filter(acct)) {
+ if(!unidle_filter(acct, NULL)) {
purple_debug_misc("idle", "%s hasn't been idled yet; adding to list.",
purple_contact_info_get_username(info));
idled_accts = g_list_append(idled_accts, acct);
@@ -110,7 +110,7 @@ idle_all_action_ok(G_GNUC_UNUSED gpointer data, PurpleRequestPage *page) {
for(iter = list; iter; iter = iter->next) {
acct = (PurpleAccount *)(iter->data);
- if(acct && idleable_filter(acct)) {
+ if(acct && idleable_filter(acct, NULL)) {
PurpleContactInfo *info = PURPLE_CONTACT_INFO(acct);
purple_debug_misc("idle", "Idling %s.\n",
@@ -164,7 +164,7 @@ purple_idle_set_account_idle_time(G_GNUC_UNUSED GSimpleAction *action,
field = purple_request_field_account_new("acct", _("Account"), NULL);
afield = PURPLE_REQUEST_FIELD_ACCOUNT(field);
- purple_request_field_account_set_filter(afield, idleable_filter);
+ purple_request_field_account_set_filter(afield, idleable_filter, NULL, NULL);
purple_request_field_account_set_show_all(afield, FALSE);
purple_request_group_add_field(group, field);
@@ -204,7 +204,7 @@ purple_idle_unset_account_idle_time(G_GNUC_UNUSED GSimpleAction *action,
field = purple_request_field_account_new("acct", _("Account"), NULL);
afield = PURPLE_REQUEST_FIELD_ACCOUNT(field);
- purple_request_field_account_set_filter(afield, unidle_filter);
+ purple_request_field_account_set_filter(afield, unidle_filter, NULL, NULL);
purple_request_field_account_set_show_all(afield, FALSE);
purple_request_group_add_field(group, field);
diff --git a/libpurple/request/purplerequestfieldaccount.c b/libpurple/request/purplerequestfieldaccount.c
index 2c7bed194b..1e8ffb72c9 100644
--- a/libpurple/request/purplerequestfieldaccount.c
+++ b/libpurple/request/purplerequestfieldaccount.c
@@ -33,7 +33,7 @@ struct _PurpleRequestFieldAccount {
PurpleAccount *account;
gboolean show_all;
- PurpleFilterAccountFunc filter_func;
+ GClosure *filter_func;
};
enum {
@@ -108,6 +108,7 @@ purple_request_field_account_finalize(GObject *obj) {
g_clear_object(&field->default_account);
g_clear_object(&field->account);
+ g_clear_pointer(&field->filter_func, g_closure_unref);
G_OBJECT_CLASS(purple_request_field_account_parent_class)->finalize(obj);
}
@@ -261,11 +262,20 @@ purple_request_field_account_set_show_all(PurpleRequestFieldAccount *field,
void
purple_request_field_account_set_filter(PurpleRequestFieldAccount *field,
- PurpleFilterAccountFunc filter_func)
+ PurpleRequestFieldAccountFilterFunc filter_func,
+ gpointer user_data,
+ GDestroyNotify destroy_data)
{
g_return_if_fail(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field));
- field->filter_func = filter_func;
+ g_clear_pointer(&field->filter_func, g_closure_unref);
+ if(filter_func != NULL) {
+ field->filter_func = g_cclosure_new(G_CALLBACK(filter_func), user_data,
+ (GClosureNotify)G_CALLBACK(destroy_data));
+ g_closure_ref(field->filter_func);
+ g_closure_sink(field->filter_func);
+ g_closure_set_marshal(field->filter_func, g_cclosure_marshal_generic);
+ }
}
PurpleAccount *
@@ -285,14 +295,34 @@ purple_request_field_account_get_value(PurpleRequestFieldAccount *field) {
gboolean
purple_request_field_account_get_show_all(PurpleRequestFieldAccount *field) {
- g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), FALSE);
+ g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_ACCOUNT(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);
+gboolean
+purple_request_field_account_match(PurpleRequestFieldAccount *field,
+ PurpleAccount *account)
+{
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_ACCOUNT(field), FALSE);
+
+ if(field->filter_func != NULL) {
+ GValue result = G_VALUE_INIT;
+ GValue params[] = {G_VALUE_INIT};
+ g_value_init(&result, G_TYPE_BOOLEAN);
+ g_value_set_instance(g_value_init(&params[0], PURPLE_TYPE_ACCOUNT),
+ account);
+ g_closure_invoke(field->filter_func, &result,
+ G_N_ELEMENTS(params), params, NULL);
+ ret = g_value_get_boolean(&result);
+ g_value_unset(&result);
+ for(gsize i = 0; i < G_N_ELEMENTS(params); i++) {
+ g_value_unset(&params[i]);
+ }
+ }
+
- return field->filter_func;
+ return ret;
}
diff --git a/libpurple/request/purplerequestfieldaccount.h b/libpurple/request/purplerequestfieldaccount.h
index af027a9575..592c2f6362 100644
--- a/libpurple/request/purplerequestfieldaccount.h
+++ b/libpurple/request/purplerequestfieldaccount.h
@@ -33,6 +33,22 @@
#include "account.h"
#include "purplerequestfield.h"
+/**
+ * PurpleRequestFieldAccountFilterFunc:
+ * @account: The account.
+ * @user_data: The data passed to [method@Purple.RequestFieldAccount.set_filter].
+ *
+ * A function that is called to determine if the account should be matched.
+ *
+ * If the filter matches the account, this function must return %TRUE. If the
+ * account should be filtered out, %FALSE must be returned.
+ *
+ * Returns: %TRUE to keep the account.
+ *
+ * Since: 3.0.0
+ */
+typedef gboolean (*PurpleRequestFieldAccountFilterFunc)(PurpleAccount *account, gpointer user_data);
+
G_BEGIN_DECLS
/**
@@ -93,14 +109,17 @@ void purple_request_field_account_set_show_all(PurpleRequestFieldAccount *field,
/**
* purple_request_field_account_set_filter:
* @field: The account field.
- * @filter_func: (scope notified): The account filter function.
+ * @filter_func: (scope notified) (closure user_data): The account filter
+ * function, or %NULL to disable additional filtering.
+ * @user_data: The data to pass to the filter callback.
+ * @destroy_data: A cleanup function for @user_data.
*
* 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);
+void purple_request_field_account_set_filter(PurpleRequestFieldAccount *field, PurpleRequestFieldAccountFilterFunc filter_func, gpointer user_data, GDestroyNotify destroy_data);
/**
* purple_request_field_account_get_default_value:
@@ -136,17 +155,17 @@ PurpleAccount *purple_request_field_account_get_value(PurpleRequestFieldAccount
gboolean purple_request_field_account_get_show_all(PurpleRequestFieldAccount *field);
/**
- * purple_request_field_account_get_filter: (skip):
+ * purple_request_field_account_match:
* @field: The account field.
+ * @account: The account to check.
*
- * Returns the account filter function in an account field.
+ * Returns whether the specified account is matched by the filter or not.
*
- * This function will determine which accounts get displayed and which
- * don't.
+ * Returns: Whether or not to show the account.
*
- * Returns: (transfer none): The account filter function.
+ * Since: 3.0.0
*/
-PurpleFilterAccountFunc purple_request_field_account_get_filter(PurpleRequestFieldAccount *field);
+gboolean purple_request_field_account_match(PurpleRequestFieldAccount *field, PurpleAccount *account);
G_END_DECLS