Use PidginAccountChooser in XMPP console

Wed, 25 May 2022 23:52:45 -0500

author
Elliott Sales de Andrade <quantum.analyst@gmail.com>
date
Wed, 25 May 2022 23:52:45 -0500
changeset 41409
f18c86c63885
parent 41408
5323c0b51ddc
child 41410
3c68dae90dc5

Use PidginAccountChooser in XMPP console

pidgin/plugins/xmppconsole/console.ui file | annotate | diff | comparison | revisions
pidgin/plugins/xmppconsole/xmppconsole.c file | annotate | diff | comparison | revisions
--- a/pidgin/plugins/xmppconsole/console.ui	Wed May 25 23:52:45 2022 -0500
+++ b/pidgin/plugins/xmppconsole/console.ui	Wed May 25 23:52:45 2022 -0500
@@ -21,10 +21,19 @@
 -->
 <interface>
   <requires lib="gtk+" version="3.18"/>
+  <requires lib="pidgin" version="3.0"/>
   <!-- interface-license-type gplv2 -->
   <!-- interface-name Pidgin -->
   <!-- interface-description Internet Messenger -->
   <!-- interface-copyright Pidgin Developers <devel@pidgin.im> -->
+  <object class="PidginAccountStore" id="accounts"/>
+  <object class="PidginAccountFilterConnected" id="connected_accounts">
+    <property name="child-model">accounts</property>
+  </object>
+  <object class="PidginAccountFilterProtocol" id="connected_xmpp_accounts">
+    <property name="child-model">connected_accounts</property>
+    <property name="protocol-id">prpl-jabber</property>
+  </object>
   <object class="GtkTextBuffer" id="entry_buffer">
     <signal name="changed" handler="entry_changed_cb" object="PidginXmppConsole" swapped="no"/>
   </object>
@@ -93,7 +102,7 @@
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
         <child>
-          <object class="GtkBox" id="hbox">
+          <object class="GtkBox">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="margin_left">6</property>
@@ -111,9 +120,11 @@
               </packing>
             </child>
             <child>
-              <object class="GtkComboBoxText" id="dropdown">
+              <object class="PidginAccountChooser">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
+                <property name="model">connected_xmpp_accounts</property>
+                <property name="active">0</property>
                 <signal name="changed" handler="dropdown_changed_cb" object="PidginXmppConsole" swapped="no"/>
               </object>
               <packing>
--- a/pidgin/plugins/xmppconsole/xmppconsole.c	Wed May 25 23:52:45 2022 -0500
+++ b/pidgin/plugins/xmppconsole/xmppconsole.c	Wed May 25 23:52:45 2022 -0500
@@ -36,8 +36,6 @@
 	GtkWindow parent;
 
 	PurpleConnection *gc;
-	GtkWidget *hbox;
-	GtkWidget *dropdown;
 	GtkTextBuffer *buffer;
 	struct {
 		GtkTextTag *info;
@@ -52,8 +50,6 @@
 	GtkWidget *entry;
 	GtkTextBuffer *entry_buffer;
 	GtkWidget *sw;
-	int count;
-	GList *accounts;
 
 	struct {
 		GtkPopover *popover;
@@ -87,16 +83,6 @@
 /******************************************************************************
  * Helpers
  *****************************************************************************/
-static gboolean
-xmppconsole_is_xmpp_account(PurpleAccount *account)
-{
-	const gchar *prpl_name;
-
-	prpl_name = purple_account_get_protocol_id(account);
-
-	return purple_strequal("prpl-jabber", prpl_name);
-}
-
 static void
 xmppconsole_append_xmlnode(PidginXmppConsole *console, PurpleXmlNode *node,
                            gint indent_level, GtkTextIter *iter,
@@ -485,98 +471,40 @@
 }
 
 static void
-signing_on_cb(PurpleConnection *gc)
-{
-	PurpleAccount *account;
-
-	if (console == NULL) {
-		return;
-	}
-
-	account = purple_connection_get_account(gc);
-	if (!xmppconsole_is_xmpp_account(account))
-		return;
-
-	gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(console->dropdown),
-		purple_account_get_username(account));
-	console->accounts = g_list_append(console->accounts, gc);
-	console->count++;
-
-	if (console->count == 1) {
-		console->gc = gc;
-		gtk_text_buffer_set_text(console->buffer, "", 0);
-		gtk_combo_box_set_active(GTK_COMBO_BOX(console->dropdown), 0);
-	} else
-		gtk_widget_show_all(console->hbox);
-}
-
-static void
-signed_off_cb(PurpleConnection *gc)
-{
-	int i;
-
-	if (console == NULL) {
-		return;
-	}
-
-	i = g_list_index(console->accounts, gc);
-	if (i == -1)
-		return;
-
-	gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(console->dropdown), i);
-	console->accounts = g_list_remove(console->accounts, gc);
-	console->count--;
-
-	if (gc == console->gc) {
-		GtkTextIter end;
-		gtk_text_buffer_get_end_iter(console->buffer, &end);
-		gtk_text_buffer_insert_with_tags(console->buffer, &end, _("Logged out."), -1,
-		                                 console->tags.info, NULL);
-		console->gc = NULL;
-	}
-}
-
-static void
 dropdown_changed_cb(GtkComboBox *widget, gpointer data) {
 	PidginXmppConsole *console = data;
+	PidginAccountChooser *chooser = PIDGIN_ACCOUNT_CHOOSER(widget);
+	PurpleAccount *account = NULL;
 
-	console->gc = g_list_nth_data(console->accounts,
-	                              gtk_combo_box_get_active(widget));
-	gtk_text_buffer_set_text(console->buffer, "", 0);
+	account = pidgin_account_chooser_get_selected(chooser);
+	if(PURPLE_IS_ACCOUNT(account)) {
+		console->gc = purple_account_get_connection(account);
+		gtk_text_buffer_set_text(console->buffer, "", 0);
+	} else {
+		GtkTextIter start, end;
+		console->gc = NULL;
+		gtk_text_buffer_set_text(console->buffer, _("Not connected to XMPP"), -1);
+		gtk_text_buffer_get_bounds(console->buffer, &start, &end);
+		gtk_text_buffer_apply_tag(console->buffer, console->tags.info, &start, &end);
+	}
 }
 
 /******************************************************************************
  * GObject Implementation
  *****************************************************************************/
 static void
-pidgin_xmpp_console_finalize(GObject *obj) {
-	PidginXmppConsole *console = PIDGIN_XMPP_CONSOLE(obj);
-
-	g_clear_pointer(&console->accounts, g_list_free);
-
-	G_OBJECT_CLASS(pidgin_xmpp_console_parent_class)->finalize(obj);
-}
-
-static void
 pidgin_xmpp_console_class_finalize(PidginXmppConsoleClass *klass) {
 }
 
 static void
 pidgin_xmpp_console_class_init(PidginXmppConsoleClass *klass) {
-	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
 	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
 
-	obj_class->finalize = pidgin_xmpp_console_finalize;
-
 	gtk_widget_class_set_template_from_resource(
 	        widget_class,
 	        "/im/pidgin/Pidgin3/Plugin/XMPPConsole/console.ui"
 	);
 
-	gtk_widget_class_bind_template_child(widget_class, PidginXmppConsole,
-	                                     hbox);
-	gtk_widget_class_bind_template_child(widget_class, PidginXmppConsole,
-	                                     dropdown);
 	gtk_widget_class_bind_template_callback(widget_class, dropdown_changed_cb);
 
 	gtk_widget_class_bind_template_child(widget_class, PidginXmppConsole,
@@ -653,32 +581,11 @@
 
 static void
 pidgin_xmpp_console_init(PidginXmppConsole *console) {
-	GList *connections;
 	GtkCssProvider *entry_css;
 	GtkStyleContext *context;
 
 	gtk_widget_init_template(GTK_WIDGET(console));
 
-	for (connections = purple_connections_get_all(); connections; connections = connections->next) {
-		PurpleConnection *gc = connections->data;
-		if (xmppconsole_is_xmpp_account(purple_connection_get_account(gc))) {
-			console->count++;
-			console->accounts = g_list_append(console->accounts, gc);
-			gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(console->dropdown),
-						  purple_account_get_username(purple_connection_get_account(gc)));
-			if (!console->gc)
-				console->gc = gc;
-		}
-	}
-	gtk_combo_box_set_active(GTK_COMBO_BOX(console->dropdown), 0);
-
-	if (console->count == 0) {
-		GtkTextIter start, end;
-		gtk_text_buffer_set_text(console->buffer, _("Not connected to XMPP"), -1);
-		gtk_text_buffer_get_bounds(console->buffer, &start, &end);
-		gtk_text_buffer_apply_tag(console->buffer, console->tags.info, &start, &end);
-	}
-
 	entry_css = gtk_css_provider_new();
 	gtk_css_provider_load_from_data(entry_css,
 	                                "textview." GTK_STYLE_CLASS_ERROR " text {background-color:#ffcece;}",
@@ -689,10 +596,6 @@
 
 	entry_changed_cb(console->entry_buffer, console);
 
-	if (console->count < 2) {
-		gtk_widget_hide(console->hbox);
-	}
-
 	gtk_widget_show(GTK_WIDGET(console));
 }
 
@@ -767,11 +670,6 @@
 	purple_signal_connect(xmpp, "jabber-sending-text", plugin,
 	                      G_CALLBACK(purple_xmlnode_sent_cb), NULL);
 
-	purple_signal_connect(purple_connections_get_handle(), "signing-on",
-		plugin, G_CALLBACK(signing_on_cb), NULL);
-	purple_signal_connect(purple_connections_get_handle(), "signed-off",
-		plugin, G_CALLBACK(signed_off_cb), NULL);
-
 	return TRUE;
 }
 

mercurial