pidgin/pidgin

Parents 4682777df311
Children f435aea25461
Fix some issues with the protocol chooser and clean up its usage in GtkAccount

Added `PidginProtocolStore` and `PidginProtocolChooser` to the Glade catalog.
Updated the template for `PidginProtocolChooser` to use a `GtkTreeModelSort` to sort the list of protocols.
Ported the existing `purple_protocols_*` API use to `pidgin_protocol_manager_*`

Testing Done:
Verified the new account dialog shows up properly with the protocol chooser sorted.
Verified that editing an account had the proper protocol selected.
Verified that changing a protocol on an existing account worked.

Bugs closed: PIDGIN-17471, PIDGIN-17491, PIDGIN-17495

Reviewed at https://reviews.imfreedom.org/r/533/
--- a/libpurple/purpleprotocolmanager.c Sat Feb 27 12:16:39 2021 -0600
+++ b/libpurple/purpleprotocolmanager.c Sat Feb 27 12:17:11 2021 -0600
@@ -206,6 +206,7 @@
gpointer value = NULL;
g_return_val_if_fail(PURPLE_PROTOCOL_MANAGER(manager), NULL);
+ g_return_val_if_fail(id != NULL, NULL);
priv = purple_protocol_manager_get_instance_private(manager);
--- a/pidgin/glade/pidgin3.xml.in Sat Feb 27 12:16:39 2021 -0600
+++ b/pidgin/glade/pidgin3.xml.in Sat Feb 27 12:17:11 2021 -0600
@@ -15,6 +15,8 @@
<glade-widget-class name="PidginMenuTray" generic-name="menu_tray" title="MenuTray"/>
<glade-widget-class name="PidginPluginsMenu" generic-name="plugins_menu" title="PluginsMenu"/>
<glade-widget-class name="PidginPresenceIcon" generic-name="presence_icon" title="PresenceIcon"/>
+ <glade-widget-class name="PidginProtocolChooser" generic-name="protocol_chooser" title="ProtocolChooser"/>
+ <glade-widget-class name="PidginProtocolStore" generic-name="protocol_store" title="ProtocolStore"/>
<glade-widget-class name="PidginScrollBook" generic-name="scroll_book" title="ScrollBook"/>
<glade-widget-class name="PidginStatusBox" generic-name="status_box" title="StatusBox"/>
<glade-widget-class name="PidginWindow" generic-name="window" title="Window"/>
@@ -34,6 +36,8 @@
<glade-widget-class-ref name="PidginMenuTray"/>
<glade-widget-class-ref name="PidginPluginsMenu"/>
<glade-widget-class-ref name="PidginPresenceIcon"/>
+ <glade-widget-class-ref name="PidginProtocolChooser"/>
+ <glade-widget-class-ref name="PidginProtocolStore"/>
<glade-widget-class-ref name="PidginScrollBook"/>
<glade-widget-class-ref name="PidginStatusBox"/>
<glade-widget-class-ref name="PidginWindow"/>
--- a/pidgin/gtkaccount.c Sat Feb 27 12:16:39 2021 -0600
+++ b/pidgin/gtkaccount.c Sat Feb 27 12:17:11 2021 -0600
@@ -1588,23 +1588,8 @@
dialog = g_new0(AccountPrefsDialog, 1);
- if(account == NULL) {
- /* Select the first protocol in the list*/
- GList *protocol_list = purple_protocols_get_all();
- if (protocol_list != NULL) {
- dialog->protocol_id = g_strdup(purple_protocol_get_id(PURPLE_PROTOCOL(protocol_list->data)));
- g_list_free(protocol_list);
- }
- } else {
- dialog->protocol_id =
- g_strdup(purple_account_get_protocol_id(account));
- }
-
- /* TODO if no protocols are loaded, this should inform the user that
- protocols need to be loaded instead of just doing nothing */
- if (!dialog->protocol_id) {
- g_free(dialog);
- return;
+ if(PURPLE_IS_ACCOUNT(account)) {
+ dialog->protocol_id = g_strdup(purple_account_get_protocol_id(account));
}
if (accounts_window != NULL && account != NULL)
@@ -1616,7 +1601,13 @@
dialog->password = g_strdup(password);
dialog->type = type;
dialog->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
- dialog->protocol = purple_protocols_find(dialog->protocol_id);
+
+ if(dialog->protocol_id != NULL) {
+ PurpleProtocolManager *manager = purple_protocol_manager_get_default();
+
+ dialog->protocol = purple_protocol_manager_find(manager,
+ dialog->protocol_id);
+ }
dialog->window = win = pidgin_dialog_new((type == PIDGIN_ADD_ACCOUNT_DIALOG) ? _("Add Account") : _("Modify Account"),
6, "account", FALSE);
--- a/pidgin/pidginprotocolchooser.c Sat Feb 27 12:16:39 2021 -0600
+++ b/pidgin/pidginprotocolchooser.c Sat Feb 27 12:17:11 2021 -0600
@@ -32,10 +32,27 @@
struct _PidginProtocolChooser {
GtkComboBox parent;
- GtkListStore *model;
+ GtkTreeModel *model;
};
/******************************************************************************
+ * Callbacks
+ *****************************************************************************/
+static void
+pidgin_protocol_chooser_model_changed_cb(GObject *obj, GParamSpec *pspec,
+ gpointer data)
+{
+ GtkComboBox *combo = GTK_COMBO_BOX(obj);
+ GtkTreeModel *model = gtk_combo_box_get_model(combo);
+ GtkTreeIter iter;
+
+ /* When the model for the combobox changes, select the first item. */
+ if(gtk_tree_model_get_iter_first(model, &iter)) {
+ gtk_combo_box_set_active_iter(combo, &iter);
+ }
+}
+
+/******************************************************************************
* GObject Implementation
*****************************************************************************/
G_DEFINE_TYPE(PidginProtocolChooser, pidgin_protocol_chooser,
@@ -55,7 +72,15 @@
static void
pidgin_protocol_chooser_init(PidginProtocolChooser *chooser) {
+ g_signal_connect_object(G_OBJECT(chooser), "notify::model",
+ G_CALLBACK(pidgin_protocol_chooser_model_changed_cb),
+ chooser, G_CONNECT_AFTER);
+
gtk_widget_init_template(GTK_WIDGET(chooser));
+
+ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(chooser->model),
+ PIDGIN_PROTOCOL_STORE_COLUMN_NAME,
+ GTK_SORT_ASCENDING);
}
/******************************************************************************
--- a/pidgin/resources/Protocols/chooser.ui Sat Feb 27 12:16:39 2021 -0600
+++ b/pidgin/resources/Protocols/chooser.ui Sat Feb 27 12:17:11 2021 -0600
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.1
+<!-- Generated with glade 3.38.2
Pidgin - Internet Messenger
Copyright (C) Pidgin Developers <devel@pidgin.im>
@@ -21,13 +21,18 @@
-->
<interface domain="pidgin">
<requires lib="gtk+" version="3.20"/>
+ <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="PidginProtocolStore" id="raw_model"/>
+ <object class="GtkTreeModelSort" id="model">
+ <property name="model">raw_model</property>
+ </object>
<template class="PidginProtocolChooser" parent="GtkComboBox">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="model">model</property>
<child>
<object class="GtkCellRendererPixbuf" id="icon"/>
@@ -42,5 +47,4 @@
</attributes>
</child>
</template>
- <object class="PidginProtocolStore" id="model"/>
</interface>