I'm trying to fix https://bugzilla.gnome.org/show_bug.cgi?id=645002 which has just become a release blocker for Fedora 15. I'm proposing we add the following patch to gnome-control-center so that we can fix the issue properly for 3.0.1
I know we don't normally allow string additions in stable branches, but I thought I'd ask anyway. Ideas welcome. Thanks, Richard. --- >From acdf03a89a9a559c91b054881d84383b949e2661 Mon Sep 17 00:00:00 2001 From: Richard Hughes <rich...@hughsie.com> Date: Wed, 6 Apr 2011 14:46:23 +0100 Subject: [PATCH] network: add a 'Other...' entry to the wireless combobox so users can connect to hidden access points A suprising number of people need this to be able to get onto their wireless network. This is also a Fedora blocker if that matters. This patch also adds a string. I don't feel there is a way around it, although we could steal the translations from another project. I think using a real word is better than displaying a blank entry or a picture or something. I dunno. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=645002 --- panels/network/cc-network-panel.c | 127 +++++++++++++++++++++++++++ panels/network/panel-cell-renderer-signal.c | 6 ++ 2 files changed, 133 insertions(+), 0 deletions(-) diff --git a/panels/network/cc-network-panel.c b/panels/network/cc-network-panel.c index 73efab7..0eef14d 100644 --- a/panels/network/cc-network-panel.c +++ b/panels/network/cc-network-panel.c @@ -794,6 +794,32 @@ add_access_point (CcNetworkPanel *panel, NMAccessPoint *ap, NMAccessPoint *activ } } +static void +add_access_point_other (CcNetworkPanel *panel) +{ + CcNetworkPanelPrivate *priv = panel->priv; + GtkListStore *liststore_wireless_network; + GtkTreeIter treeiter; + + liststore_wireless_network = GTK_LIST_STORE (gtk_builder_get_object (priv->builder, + "liststore_wireless_network")); + + gtk_list_store_append (liststore_wireless_network, &treeiter); + gtk_list_store_set (liststore_wireless_network, + &treeiter, + PANEL_WIRELESS_COLUMN_ID, "ap-other...", + /* TRANSLATORS: this is when the access point is not listed + * in the dropdown (or hidden) and the user has to select + * another entry manually */ + PANEL_WIRELESS_COLUMN_TITLE, _("Other..."), + /* always last */ + PANEL_WIRELESS_COLUMN_SORT, "", + PANEL_WIRELESS_COLUMN_STRENGTH, 0, + PANEL_WIRELESS_COLUMN_MODE, NM_802_11_MODE_UNKNOWN, + PANEL_WIRELESS_COLUMN_SECURITY, NM_AP_SEC_UNKNOWN, + -1); +} + #if 0 static gchar * ip4_address_as_string (guint32 ip) @@ -1362,6 +1388,7 @@ device_refresh_wifi_ui (CcNetworkPanel *panel, NetDevice *device) ap = NM_ACCESS_POINT (g_ptr_array_index (aps_unique, i)); add_access_point (panel, ap, active_ap); } + add_access_point_other (panel); if (active_ap == NULL) { widget = GTK_WIDGET (gtk_builder_get_object (panel->priv->builder, "combobox_wireless_network_name")); @@ -2187,6 +2214,61 @@ connection_add_activate_cb (NMClient *client, } static void +connect_to_hidden_network_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) +{ + GError *error = NULL; + GVariant *result = NULL; + + result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &error); + if (result == NULL) { + g_warning ("failed to connect to hidden network: %s", + error->message); + g_error_free (error); + return; + } +} + +static void +connect_to_hidden_network (CcNetworkPanel *panel) +{ + GDBusProxy *proxy; + GVariant *res = NULL; + GError *error = NULL; + + /* connect to NM applet */ + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "org.gnome.network_manager_applet", + "/org/gnome/network_manager_applet", + "org.gnome.network_manager_applet", + panel->priv->cancellable, + &error); + if (proxy == NULL) { + g_warning ("failed to connect to NM applet: %s", + error->message); + g_error_free (error); + goto out; + } + + /* try to show the hidden network UI */ + g_dbus_proxy_call (proxy, + "ConnectToHiddenNetwork", + NULL, + G_DBUS_CALL_FLAGS_NONE, + 5000, /* don't wait forever */ + panel->priv->cancellable, + connect_to_hidden_network_cb, + panel); +out: + if (proxy != NULL) + g_object_unref (proxy); + if (res != NULL) + g_variant_unref (res); +} + +static void wireless_ap_changed_cb (GtkComboBox *combo_box, CcNetworkPanel *panel) { const GByteArray *ssid; @@ -2227,6 +2309,10 @@ wireless_ap_changed_cb (GtkComboBox *combo_box, CcNetworkPanel *panel) -1); g_debug ("try to connect to WIFI network %s [%s]", ssid_target, object_path); + if (g_strcmp0 (object_path, "ap-other...") == 0) { + connect_to_hidden_network (panel); + goto out; + } /* look for an existing connection we can use */ list = nm_remote_settings_list_connections (panel->priv->remote_settings); @@ -2276,6 +2362,42 @@ out: g_free (object_path); } +static gint +wireless_ap_model_sort_cb (GtkTreeModel *model, + GtkTreeIter *a, + GtkTreeIter *b, + gpointer user_data) +{ + gchar *str_a; + gchar *str_b; + gint retval; + + gtk_tree_model_get (model, a, + PANEL_WIRELESS_COLUMN_SORT, &str_a, + -1); + gtk_tree_model_get (model, b, + PANEL_WIRELESS_COLUMN_SORT, &str_b, + -1); + + /* special case blank entries to the bottom */ + if (g_strcmp0 (str_a, "") == 0) { + retval = 1; + goto out; + } + if (g_strcmp0 (str_b, "") == 0) { + retval = -1; + goto out; + } + + /* case sensitive search like before */ + g_debug ("compare %s with %s", str_a, str_b); + retval = g_strcmp0 (str_a, str_b); +out: + g_free (str_a); + g_free (str_b); + return retval; +} + static void cc_network_panel_init (CcNetworkPanel *panel) { @@ -2437,6 +2559,11 @@ cc_network_panel_init (CcNetworkPanel *panel) gtk_tree_sortable_set_sort_column_id (sortable, PANEL_WIRELESS_COLUMN_SORT, GTK_SORT_ASCENDING); + gtk_tree_sortable_set_sort_func (sortable, + PANEL_WIRELESS_COLUMN_SORT, + wireless_ap_model_sort_cb, + sortable, + NULL); renderer = panel_cell_renderer_signal_new (); gtk_cell_renderer_set_padding (renderer, 4, 0); diff --git a/panels/network/panel-cell-renderer-signal.c b/panels/network/panel-cell-renderer-signal.c index 73b42a3..782526e 100644 --- a/panels/network/panel-cell-renderer-signal.c +++ b/panels/network/panel-cell-renderer-signal.c @@ -65,6 +65,12 @@ panel_cell_renderer_set_name (PanelCellRendererSignal *renderer) const gchar *icon_name = NULL; GIcon *icon; + /* the 'Other...' entry */ + if (renderer->signal == 0) { + g_object_set (renderer, "gicon", NULL, NULL); + return; + } + if (renderer->signal < 20) icon_name = "network-wireless-signal-none-symbolic"; else if (renderer->signal < 40) -- 1.7.4.2 _______________________________________________ gnome-i18n mailing list gnome-i18n@gnome.org http://mail.gnome.org/mailman/listinfo/gnome-i18n