[gnome-control-center] network: add a 'Other...' entry to the wireless combobox so users can connect to hidden access point



commit 03d17a95c40206efddd439cdeceacaffd2f928f9
Author: Richard Hughes <richard hughsie com>
Date:   Wed Apr 6 14:46:23 2011 +0100

    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..34a95c3 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, C_("Wireless access point", "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)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]