pidgin/pidgin

Port proxy type chooser to an AdwComboRow

21 months ago, Elliott Sales de Andrade
0a37c380d760
Parents fd32ea10d1cb
Children fe90b5f62e88
Port proxy type chooser to an AdwComboRow

This changes the Proxy type prefs setting to an `AdwComboRow`.

I also don't love that the pref values and translated description strings get split up, but I think this is something that would be fixed with setting schemas?

Testing Done:
Opened Prefs and changed `Proxy type` setting.

Reviewed at https://reviews.imfreedom.org/r/1712/
--- a/pidgin/prefs/pidginprefs.c Mon Sep 05 23:36:14 2022 -0500
+++ b/pidgin/prefs/pidginprefs.c Mon Sep 05 23:54:17 2022 -0500
@@ -367,6 +367,44 @@
}
static void
+bind_combo_row_set(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec,
+ gpointer data)
+{
+ const gchar *key = data;
+ GtkStringObject *item = NULL;
+ const gchar *value = NULL;
+
+ item = adw_combo_row_get_selected_item(ADW_COMBO_ROW(obj));
+ value = gtk_string_object_get_string(item);
+ purple_prefs_set_string(key, value);
+}
+
+void
+pidgin_prefs_bind_combo_row(const gchar *key, GtkWidget *widget) {
+ GListModel *model = NULL;
+ const char *pref_value = NULL;
+ guint selected = GTK_INVALID_LIST_POSITION;
+
+ pref_value = purple_prefs_get_string(key);
+ model = adw_combo_row_get_model(ADW_COMBO_ROW(widget));
+
+ for(guint i = 0; i < g_list_model_get_n_items(model); i++) {
+ GtkStringObject *obj = g_list_model_get_item(model, i);
+ const gchar *value = gtk_string_object_get_string(obj);
+
+ if (purple_strequal(pref_value, value)) {
+ selected = i;
+ break;
+ }
+ }
+
+ adw_combo_row_set_selected(ADW_COMBO_ROW(widget), selected);
+
+ g_signal_connect(widget, "notify::selected",
+ G_CALLBACK(bind_combo_row_set), (gpointer)key);
+}
+
+static void
set_bool_pref(GtkWidget *w, const char *key)
{
purple_prefs_set_bool(key,
--- a/pidgin/prefs/pidginprefsinternal.h Mon Sep 05 23:36:14 2022 -0500
+++ b/pidgin/prefs/pidginprefsinternal.h Mon Sep 05 23:54:17 2022 -0500
@@ -49,6 +49,9 @@
void pidgin_prefs_bind_checkbox(const char *key, GtkWidget *button);
G_GNUC_INTERNAL
+void pidgin_prefs_bind_combo_row(const gchar *key, GtkWidget *widget);
+
+G_GNUC_INTERNAL
void pidgin_prefs_bind_dropdown(PidginPrefCombo *combo);
G_GNUC_INTERNAL
--- a/pidgin/prefs/pidginproxyprefs.c Mon Sep 05 23:36:14 2022 -0500
+++ b/pidgin/prefs/pidginproxyprefs.c Mon Sep 05 23:54:17 2022 -0500
@@ -41,7 +41,7 @@
/* Non-GNOME version */
GtkWidget *nongnome;
GtkWidget *socks4_remotedns;
- PidginPrefCombo type;
+ GtkWidget *type;
GtkWidget *options;
GtkWidget *host;
GtkWidget *port;
@@ -54,6 +54,30 @@
/******************************************************************************
* Helpers
*****************************************************************************/
+static gchar *
+proxy_type_expression_cb(GObject *self, G_GNUC_UNUSED gpointer data)
+{
+ const gchar *text = "";
+ const gchar *value = NULL;
+
+ value = gtk_string_object_get_string(GTK_STRING_OBJECT(self));
+ if(purple_strequal(value, "none")) {
+ text = _("No proxy");
+ } else if(purple_strequal(value, "socks4")) {
+ text = _("SOCKS 4");
+ } else if(purple_strequal(value, "socks5")) {
+ text = _("SOCKS 5");
+ } else if(purple_strequal(value, "tor")) {
+ text = _("Tor/Privacy (SOCKS 5)");
+ } else if(purple_strequal(value, "http")) {
+ text = _("HTTP");
+ } else if(purple_strequal(value, "envvar")) {
+ text = _("Use Environmental Settings");
+ }
+
+ return g_strdup(text);
+}
+
static void
proxy_changed_cb(const gchar *name, PurplePrefType type, gconstpointer value,
gpointer data)
@@ -141,7 +165,7 @@
gtk_widget_class_bind_template_child(
widget_class, PidginProxyPrefs, socks4_remotedns);
gtk_widget_class_bind_template_child(
- widget_class, PidginProxyPrefs, type.combo);
+ widget_class, PidginProxyPrefs, type);
gtk_widget_class_bind_template_child(
widget_class, PidginProxyPrefs, options);
gtk_widget_class_bind_template_child(
@@ -153,6 +177,8 @@
gtk_widget_class_bind_template_child(
widget_class, PidginProxyPrefs, password);
gtk_widget_class_bind_template_callback(widget_class,
+ proxy_type_expression_cb);
+ gtk_widget_class_bind_template_callback(widget_class,
proxy_row_activated_cb);
gtk_widget_class_bind_template_callback(widget_class,
proxy_print_option);
@@ -197,9 +223,8 @@
pidgin_prefs_bind_switch("/purple/proxy/socks4_remotedns",
prefs->socks4_remotedns);
- prefs->type.type = PURPLE_PREF_STRING;
- prefs->type.key = "/purple/proxy/type";
- pidgin_prefs_bind_dropdown(&prefs->type);
+ pidgin_prefs_bind_combo_row("/purple/proxy/type", prefs->type);
+
proxy_info = purple_global_proxy_get_info();
purple_prefs_connect_callback(prefs, "/purple/proxy/type",
--- a/pidgin/resources/Prefs/proxy.ui Mon Sep 05 23:36:14 2022 -0500
+++ b/pidgin/resources/Prefs/proxy.ui Mon Sep 05 23:54:17 2022 -0500
@@ -23,45 +23,6 @@
<!-- interface-name Pidgin -->
<!-- interface-description Internet Messenger -->
<!-- interface-copyright Pidgin Developers <devel@pidgin.im> -->
- <object class="GtkAdjustment" id="port.adjustment">
- <property name="upper">65535</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkListStore" id="type.store">
- <columns>
- <!-- column-name text -->
- <column type="gchararray"/>
- <!-- column-name value -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">No proxy</col>
- <col id="1">none</col>
- </row>
- <row>
- <col id="0" translatable="yes">SOCKS 4</col>
- <col id="1">socks4</col>
- </row>
- <row>
- <col id="0" translatable="yes">SOCKS 5</col>
- <col id="1">socks5</col>
- </row>
- <row>
- <col id="0" translatable="yes">Tor/Privacy (SOCKS 5)</col>
- <col id="1">tor</col>
- </row>
- <row>
- <col id="0" translatable="yes">HTTP</col>
- <col id="1">http</col>
- </row>
- <row>
- <col id="0" translatable="yes">Use Environmental Settings</col>
- <col id="1">envvar</col>
- </row>
- </data>
- </object>
<template class="PidginProxyPrefs" parent="AdwPreferencesPage">
<child>
<object class="AdwPreferencesGroup" id="gnome">
@@ -106,22 +67,24 @@
</object>
</child>
<child>
- <object class="AdwActionRow">
- <property name="activatable-widget">type.combo</property>
+ <object class="AdwComboRow" id="type">
<property name="title" translatable="1">Proxy t_ype</property>
<property name="use-underline">1</property>
- <child>
- <object class="GtkComboBox" id="type.combo">
- <property name="model">type.store</property>
- <property name="valign">center</property>
- <child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
+ <property name="model">
+ <object class="GtkStringList">
+ <items>
+ <item>none</item>
+ <item>socks4</item>
+ <item>socks5</item>
+ <item>tor</item>
+ <item>http</item>
+ <item>envvar</item>
+ </items>
</object>
- </child>
+ </property>
+ <property name="expression">
+ <closure type="gchararray" function="proxy_type_expression_cb"/>
+ </property>
</object>
</child>
<child>
@@ -152,7 +115,13 @@
<object class="GtkSpinButton" id="port">
<property name="focusable">1</property>
<property name="text" translatable="1">0</property>
- <property name="adjustment">port.adjustment</property>
+ <property name="adjustment">
+ <object class="GtkAdjustment">
+ <property name="upper">65535</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ </property>
<property name="numeric">1</property>
<property name="hexpand">1</property>
<property name="valign">center</property>