[control-center/f15/master] Add hidden ap support

Matthias Clasen mclasen at fedoraproject.org
Wed Apr 6 18:45:15 UTC 2011


commit 1f4c15f97098aa608c03fe53c4e15de4f2f5611f
Author: Matthias Clasen <mclasen at redhat.com>
Date:   Wed Apr 6 14:45:07 2011 -0400

    Add hidden ap support

 ...-a-Other.-entry-to-the-wireless-combobox-.patch |  211 ++++++++++++++++++++
 1 files changed, 211 insertions(+), 0 deletions(-)
---
diff --git a/0001-network-add-a-Other.-entry-to-the-wireless-combobox-.patch b/0001-network-add-a-Other.-entry-to-the-wireless-combobox-.patch
new file mode 100644
index 0000000..6b140f3
--- /dev/null
+++ b/0001-network-add-a-Other.-entry-to-the-wireless-combobox-.patch
@@ -0,0 +1,211 @@
+From acdf03a89a9a559c91b054881d84383b949e2661 Mon Sep 17 00:00:00 2001
+From: Richard Hughes <richard at 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
+


More information about the scm-commits mailing list