Add a filter property to PidginAccountChooser

Sat, 29 Oct 2022 00:52:04 -0500

author
Elliott Sales de Andrade <quantum.analyst@gmail.com>
date
Sat, 29 Oct 2022 00:52:04 -0500
changeset 41857
ff94f8ff8a70
parent 41856
3c3901fbe549
child 41858
38e61d11b89f

Add a filter property to PidginAccountChooser

This replaces the old `pidgin_account_chooser_set_filter_func`.

It also currently does nothing, but neither did the old code.

Testing Done:
Compiled only.

Reviewed at https://reviews.imfreedom.org/r/1995/

pidgin/gtkblist.c file | annotate | diff | comparison | revisions
pidgin/gtkrequest.c file | annotate | diff | comparison | revisions
pidgin/gtkroomlist.c file | annotate | diff | comparison | revisions
pidgin/pidginaccountchooser.c file | annotate | diff | comparison | revisions
pidgin/pidginaccountchooser.h file | annotate | diff | comparison | revisions
--- a/pidgin/gtkblist.c	Sat Oct 29 00:08:34 2022 -0500
+++ b/pidgin/gtkblist.c	Sat Oct 29 00:52:04 2022 -0500
@@ -948,13 +948,18 @@
 }
 
 static gboolean
-chat_account_filter_func(PurpleAccount *account)
-{
-	PurpleConnection *gc = purple_account_get_connection(account);
+chat_account_filter_func(gpointer item, G_GNUC_UNUSED gpointer data) {
+	PurpleConnection *gc = NULL;
 	PurpleProtocol *protocol = NULL;
 
-	if (gc == NULL)
+	if(!PURPLE_IS_ACCOUNT(item)) {
 		return FALSE;
+	}
+
+	gc = purple_account_get_connection(PURPLE_ACCOUNT(item));
+	if(gc == NULL) {
+		return FALSE;
+	}
 
 	protocol = purple_connection_get_protocol(gc);
 
@@ -970,8 +975,9 @@
 	for (c = purple_connections_get_all(); c != NULL; c = c->next) {
 		gc = c->data;
 
-		if (chat_account_filter_func(purple_connection_get_account(gc)))
+		if(chat_account_filter_func(purple_connection_get_account(gc), NULL)) {
 			return TRUE;
+		}
 	}
 
 	return FALSE;
@@ -980,7 +986,7 @@
 static void
 make_blist_request_dialog(PidginBlistRequestData *data, PurpleAccount *account,
 	const char *title, const char *window_role, const char *label_text,
-	GCallback callback_func, PurpleFilterAccountFunc filter_func,
+	GCallback callback_func, GtkCustomFilterFunc filter_func,
 	GCallback response_cb)
 {
 	GtkWidget *label;
@@ -990,6 +996,7 @@
 	GtkWidget *vbox;
 	GtkWindow *blist_window;
 	GtkTreeModel *model = NULL, *filter = NULL;
+	GtkCustomFilter *custom_filter = NULL;
 	PidginBuddyList *gtkblist;
 
 	data->account = account;
@@ -1040,8 +1047,12 @@
 		gtk_combo_box_set_active(GTK_COMBO_BOX(data->account_menu), 0);
 	}
 
-	pidgin_account_chooser_set_filter_func(
-	        PIDGIN_ACCOUNT_CHOOSER(data->account_menu), filter_func);
+	custom_filter = gtk_custom_filter_new(filter_func, NULL, NULL);
+	pidgin_account_chooser_set_filter(
+	        PIDGIN_ACCOUNT_CHOOSER(data->account_menu),
+	        GTK_FILTER(custom_filter));
+	g_object_unref(custom_filter);
+
 	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_ccount"), data->sg, data->account_menu, TRUE, NULL);
 	g_signal_connect(data->account_menu, "changed",
 	                 G_CALLBACK(callback_func), data);
--- a/pidgin/gtkrequest.c	Sat Oct 29 00:08:34 2022 -0500
+++ b/pidgin/gtkrequest.c	Sat Oct 29 00:52:04 2022 -0500
@@ -1385,11 +1385,24 @@
 	return widget;
 }
 
+static gboolean
+field_custom_account_filter_cb(gpointer item, G_GNUC_UNUSED gpointer data) {
+	PurpleFilterAccountFunc func = data;
+	gboolean ret = FALSE;
+
+	if(PURPLE_IS_ACCOUNT(item)) {
+		ret = func(PURPLE_ACCOUNT(item));
+	}
+
+	return ret;
+}
+
 static GtkWidget *
 create_account_field(PurpleRequestField *field)
 {
 	GtkWidget *widget;
 	PurpleAccount *account;
+	GtkCustomFilter *custom_filter = NULL;
 
 	widget = pidgin_account_chooser_new();
 	account  = purple_request_field_account_get_default_value(field);
@@ -1415,9 +1428,15 @@
 
 	pidgin_account_chooser_set_selected(PIDGIN_ACCOUNT_CHOOSER(widget),
 	                                    account);
-	pidgin_account_chooser_set_filter_func(
+	custom_filter = gtk_custom_filter_new(
+	        field_custom_account_filter_cb,
+	        purple_request_field_account_get_filter(field),
+	        NULL);
+	pidgin_account_chooser_set_filter(
 	        PIDGIN_ACCOUNT_CHOOSER(widget),
-	        purple_request_field_account_get_filter(field));
+	        GTK_FILTER(custom_filter));
+	g_object_unref(custom_filter);
+
 	g_signal_connect(widget, "changed", G_CALLBACK(field_account_cb),
 	                 field);
 
--- a/pidgin/gtkroomlist.c	Sat Oct 29 00:08:34 2022 -0500
+++ b/pidgin/gtkroomlist.c	Sat Oct 29 00:52:04 2022 -0500
@@ -444,13 +444,17 @@
 	return TRUE;
 }
 
-static gboolean account_filter_func(PurpleAccount *account)
-{
-	PurpleConnection *conn = purple_account_get_connection(account);
+static gboolean
+account_filter_func(gpointer item, G_GNUC_UNUSED gpointer data) {
 	PurpleProtocol *protocol = NULL;
 
-	if (conn && PURPLE_CONNECTION_IS_CONNECTED(conn))
-		protocol = purple_connection_get_protocol(conn);
+	if(PURPLE_IS_ACCOUNT(item)) {
+		PurpleAccount *account = PURPLE_ACCOUNT(item);
+		PurpleConnection *conn = purple_account_get_connection(account);
+		if(conn && PURPLE_CONNECTION_IS_CONNECTED(conn)) {
+			protocol = purple_connection_get_protocol(conn);
+		}
+	}
 
 	return (protocol && PURPLE_PROTOCOL_IMPLEMENTS(protocol, ROOMLIST, get_list));
 }
@@ -464,8 +468,9 @@
 	for (c = purple_connections_get_all(); c != NULL; c = c->next) {
 		gc = c->data;
 
-		if (account_filter_func(purple_connection_get_account(gc)))
+		if(account_filter_func(purple_connection_get_account(gc), NULL)) {
 			return TRUE;
+		}
 	}
 
 	return FALSE;
@@ -517,12 +522,15 @@
 pidgin_roomlist_dialog_init(PidginRoomlistDialog *self)
 {
 	GSimpleActionGroup *group = NULL;
+	GtkCustomFilter *filter = NULL;
 
 	gtk_widget_init_template(GTK_WIDGET(self));
 
-	pidgin_account_chooser_set_filter_func(
+	filter = gtk_custom_filter_new(account_filter_func, NULL, NULL);
+	pidgin_account_chooser_set_filter(
 	        PIDGIN_ACCOUNT_CHOOSER(self->account_widget),
-	        account_filter_func);
+	        GTK_FILTER(filter));
+	g_object_unref(filter);
 
 	gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(self->tree),
 	                                    _search_func, NULL, NULL);
--- a/pidgin/pidginaccountchooser.c	Sat Oct 29 00:08:34 2022 -0500
+++ b/pidgin/pidginaccountchooser.c	Sat Oct 29 00:52:04 2022 -0500
@@ -29,13 +29,14 @@
 struct _PidginAccountChooser {
 	GtkComboBox parent;
 
-	PurpleFilterAccountFunc filter_func;
+	GtkFilter *filter;
 };
 
 enum
 {
 	PROP_0,
 	PROP_ACCOUNT,
+	PROP_FILTER,
 	PROP_LAST
 };
 
@@ -64,6 +65,9 @@
 		case PROP_ACCOUNT:
 			g_value_set_object(value, pidgin_account_chooser_get_selected(chooser));
 			break;
+		case PROP_FILTER:
+			g_value_set_object(value, pidgin_account_chooser_get_filter(chooser));
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
 			break;
@@ -81,6 +85,10 @@
 			pidgin_account_chooser_set_selected(chooser,
 			                                    g_value_get_object(value));
 			break;
+		case PROP_FILTER:
+			pidgin_account_chooser_set_filter(chooser,
+			                                  g_value_get_object(value));
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
 			break;
@@ -99,7 +107,14 @@
 
 	properties[PROP_ACCOUNT] = g_param_spec_object(
 	        "account", "Account", "The account that is currently selected.",
-	        PURPLE_TYPE_ACCOUNT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+	        PURPLE_TYPE_ACCOUNT,
+	        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+	properties[PROP_FILTER] = g_param_spec_object(
+	        "filter", "filter",
+	        "The filter to be applied on the list of accounts.",
+	        GTK_TYPE_FILTER,
+	        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
 
 	g_object_class_install_properties(obj_class, PROP_LAST, properties);
 
@@ -129,13 +144,22 @@
 	return GTK_WIDGET(chooser);
 }
 
+GtkFilter *
+pidgin_account_chooser_get_filter(PidginAccountChooser *chooser) {
+	g_return_val_if_fail(PIDGIN_IS_ACCOUNT_CHOOSER(chooser), NULL);
+
+	return chooser->filter;
+}
+
 void
-pidgin_account_chooser_set_filter_func(PidginAccountChooser *chooser,
-                                       PurpleFilterAccountFunc filter_func)
+pidgin_account_chooser_set_filter(PidginAccountChooser *chooser,
+                                  GtkFilter *filter)
 {
 	g_return_if_fail(PIDGIN_IS_ACCOUNT_CHOOSER(chooser));
 
-	chooser->filter_func = filter_func;
+	if(g_set_object(&chooser->filter, filter)) {
+		g_object_notify_by_pspec(G_OBJECT(chooser), properties[PROP_FILTER]);
+	}
 }
 
 PurpleAccount *
--- a/pidgin/pidginaccountchooser.h	Sat Oct 29 00:08:34 2022 -0500
+++ b/pidgin/pidginaccountchooser.h	Sat Oct 29 00:52:04 2022 -0500
@@ -49,17 +49,28 @@
 GtkWidget *pidgin_account_chooser_new(void);
 
 /**
- * pidgin_account_chooser_set_filter_func:
- * @chooser: The account chooser combo box.
- * @filter_func: (scope notified): A function for checking if an account should be shown. This
- *               can be %NULL to remove any filter.
+ * pidgin_account_chooser_get_filter:
+ * @chooser: The chooser.
  *
- * Set the filter function used to determine which accounts to show.
+ * Gets the filter used to determine which accounts to show.
+ *
+ * Returns: (transfer none): Returns the #GtkFilter that is currently
+ *          displayed.
  *
  * Since: 3.0.0
  */
-void pidgin_account_chooser_set_filter_func(
-        PidginAccountChooser *chooser, PurpleFilterAccountFunc filter_func);
+GtkFilter *pidgin_account_chooser_get_filter(PidginAccountChooser *chooser);
+
+/**
+ * pidgin_account_chooser_set_filter:
+ * @chooser: The chooser.
+ * @filter: The filter.
+ *
+ * Sets the current list filter for the account chooser.
+ *
+ * Since: 3.0.0
+ */
+void pidgin_account_chooser_set_filter(PidginAccountChooser *chooser, GtkFilter *filter);
 
 /**
  * pidgin_account_chooser_get_selected:

mercurial