diff options
author | Matthias Clasen <mclasen@redhat.com> | 2012-09-08 16:58:14 -0400 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2012-09-13 15:50:44 +0100 |
commit | 518efcda09cc492792732dca04b2124c43c3b154 (patch) | |
tree | b68f95445fed7ead5d09cd3f3d470dacd07bc20a | |
parent | bcbc6d1aafbb26f6379e0448da16539afcab8d53 (diff) | |
download | gnome-control-center-518efcda09cc492792732dca04b2124c43c3b154.tar.gz |
network: Start handling disconnected APs correctly
When showing the details for an in-range, but not active access
point, we were just always showing details for the currently
active connection. This commit starts to sort things apart.
-rw-r--r-- | panels/network/net-device-wifi.c | 120 | ||||
-rw-r--r-- | panels/network/network-wifi.ui | 28 | ||||
-rw-r--r-- | panels/network/panel-common.c | 10 | ||||
-rw-r--r-- | panels/network/panel-common.h | 1 |
4 files changed, 94 insertions, 65 deletions
diff --git a/panels/network/net-device-wifi.c b/panels/network/net-device-wifi.c index ffe61b9a9..13c26110d 100644 --- a/panels/network/net-device-wifi.c +++ b/panels/network/net-device-wifi.c @@ -56,12 +56,14 @@ struct _NetDeviceWifiPrivate gboolean updating_device; gchar *selected_ssid_title; gchar *selected_connection_id; + gchar *selected_ap_id; }; G_DEFINE_TYPE (NetDeviceWifi, net_device_wifi, NET_TYPE_DEVICE) enum { - COLUMN_ID, + COLUMN_CONNECTION_ID, + COLUMN_ACCESS_POINT_ID, COLUMN_TITLE, COLUMN_SORT, COLUMN_STRENGTH, @@ -156,7 +158,7 @@ add_access_point (NetDeviceWifi *device_wifi, NMAccessPoint *ap, NMAccessPoint * gtk_list_store_insert_with_values (liststore_network, &treeiter, -1, - COLUMN_ID, object_path, + COLUMN_ACCESS_POINT_ID, object_path, COLUMN_TITLE, title, COLUMN_SORT, ssid_text, COLUMN_STRENGTH, nm_access_point_get_strength (ap), @@ -198,7 +200,8 @@ add_connect_to_hidden (NetDeviceWifi *device_wifi) gtk_list_store_append (liststore_network, &treeiter); gtk_list_store_set (liststore_network, &treeiter, - COLUMN_ID, "ap-other...", + COLUMN_CONNECTION_ID, "ap-other...", + COLUMN_ACCESS_POINT_ID, "ap-other...", COLUMN_TITLE, title, /* always last */ COLUMN_SORT, "", @@ -507,10 +510,6 @@ device_wifi_refresh_aps (NetDeviceWifi *device_wifi) NMAccessPoint *ap; NMDevice *nm_device; - /* clear old value */ - g_free (device_wifi->priv->selected_ssid_title); - device_wifi->priv->selected_ssid_title = NULL; - /* populate access points */ liststore_network = GTK_LIST_STORE (gtk_builder_get_object (device_wifi->priv->builder, "liststore_network")); @@ -582,13 +581,13 @@ add_saved_connection (NetDeviceWifi *device_wifi, NMConnection *connection, NMDe "liststore_network")); if (find_ssid_in_store (GTK_TREE_MODEL (store), &iter, ssid_text)) gtk_list_store_set (store, &iter, - COLUMN_ID, id, + COLUMN_CONNECTION_ID, id, COLUMN_AP_IS_SAVED, TRUE, -1); else gtk_list_store_insert_with_values (store, &iter, -1, - COLUMN_ID, id, + COLUMN_CONNECTION_ID, id, COLUMN_TITLE, title, COLUMN_SORT, ssid_text, COLUMN_STRENGTH, 0, @@ -677,23 +676,36 @@ nm_device_wifi_refresh_ui (NetDeviceWifi *device_wifi) NMDevice *nm_device; NMDeviceState state; NMClient *client; + NMAccessPoint *ap; NetDeviceWifiPrivate *priv = device_wifi->priv; gchar *title; - nm_device = net_device_get_nm_device (NET_DEVICE (device_wifi)); - state = nm_device_get_state (nm_device); is_hotspot = device_is_hotspot (device_wifi); - if (is_hotspot) + if (is_hotspot) { nm_device_wifi_refresh_hotspot (device_wifi); + return; + } + + nm_device = net_device_get_nm_device (NET_DEVICE (device_wifi)); - /* set up the device on/off switch */ - widget = GTK_WIDGET (gtk_builder_get_object (device_wifi->priv->builder, "device_off_switch")); - gtk_widget_show (widget); + if (priv->selected_ap_id) { + ap = nm_device_wifi_get_access_point_by_path (NM_DEVICE_WIFI (nm_device), + priv->selected_ap_id); + } + else { + ap = NULL; + } + active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (nm_device)); + + state = nm_device_get_state (nm_device); /* keep this in sync with the signal handler setup in cc_network_panel_init */ client = net_object_get_client (NET_OBJECT (device_wifi)); wireless_enabled_toggled (client, NULL, device_wifi); - if (state != NM_DEVICE_STATE_UNAVAILABLE) + + if (ap != active_ap) + speed = 0; + else if (state != NM_DEVICE_STATE_UNAVAILABLE) speed = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (nm_device)); speed /= 1000; if (speed > 0) { @@ -706,9 +718,14 @@ nm_device_wifi_refresh_ui (NetDeviceWifi *device_wifi) /* set device state, with status and optionally speed */ widget = GTK_WIDGET (gtk_builder_get_object (device_wifi->priv->builder, "label_status")); - gtk_label_set_label (GTK_LABEL (widget), - panel_device_state_to_localized_string (nm_device)); - gtk_widget_set_tooltip_text (widget, panel_device_state_reason_to_localized_string (nm_device)); + if (ap != active_ap) { + gtk_label_set_label (GTK_LABEL (widget), _("Not connected")); + gtk_widget_set_tooltip_text (widget, ""); + } else { + gtk_label_set_label (GTK_LABEL (widget), + panel_device_state_to_localized_string (nm_device)); + gtk_widget_set_tooltip_text (widget, panel_device_state_reason_to_localized_string (nm_device)); + } /* device MAC */ str = nm_device_wifi_get_hw_address (NM_DEVICE_WIFI (nm_device)); @@ -716,8 +733,7 @@ nm_device_wifi_refresh_ui (NetDeviceWifi *device_wifi) "mac", str); /* security */ - active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (nm_device)); - if (state == NM_DEVICE_STATE_UNAVAILABLE) + if (ap != active_ap) str_tmp = NULL; else if (active_ap != NULL) str_tmp = get_ap_security_string (active_ap); @@ -727,8 +743,10 @@ nm_device_wifi_refresh_ui (NetDeviceWifi *device_wifi) g_free (str_tmp); /* signal strength */ - if (active_ap != NULL) - strength = nm_access_point_get_strength (active_ap); + if (ap != NULL) + strength = nm_access_point_get_strength (ap); + else + strength = 0; if (strength <= 0) str = NULL; else if (strength < 20) @@ -746,9 +764,9 @@ nm_device_wifi_refresh_ui (NetDeviceWifi *device_wifi) str); title = NULL; - if (active_ap != NULL) { + if (ap != NULL) { const GByteArray *ssid; - ssid = nm_access_point_get_ssid (active_ap); + ssid = nm_access_point_get_ssid (ap); if (ssid) { const gchar *ssid_text; ssid_text = nm_utils_escape_ssid (ssid->data, ssid->len); @@ -767,11 +785,17 @@ nm_device_wifi_refresh_ui (NetDeviceWifi *device_wifi) gtk_widget_set_sensitive (widget, state == NM_DEVICE_STATE_ACTIVATED); /* device MAC */ - str = nm_device_wifi_get_hw_address (NM_DEVICE_WIFI (nm_device)); + if (ap != active_ap) + str = NULL; + else + str = nm_device_wifi_get_hw_address (NM_DEVICE_WIFI (nm_device)); panel_set_device_widget_details (priv->builder, "mac", str); /* set IP entries */ - panel_set_device_widgets (priv->builder, nm_device); + if (ap != active_ap) + panel_unset_device_widgets (priv->builder); + else + panel_set_device_widgets (priv->builder, nm_device); /* update list of APs */ device_wifi_refresh_aps (device_wifi); @@ -803,7 +827,9 @@ device_off_toggled (GtkSwitch *sw, static gboolean -find_id_in_store (GtkTreeModel *model, GtkTreeIter *iter, const gchar *id_needle) +find_connection_id_in_store (GtkTreeModel *model, + GtkTreeIter *iter, + const gchar *connection_id) { gboolean found; gchar *id; @@ -811,9 +837,9 @@ find_id_in_store (GtkTreeModel *model, GtkTreeIter *iter, const gchar *id_needle found = gtk_tree_model_get_iter_first (model, iter); while (found) { gtk_tree_model_get (model, iter, - COLUMN_ID, &id, + COLUMN_CONNECTION_ID, &id, -1); - if (g_strcmp0 (id_needle, id) == 0) { + if (g_strcmp0 (connection_id, id) == 0) { g_free (id); return TRUE; } @@ -846,8 +872,8 @@ forget_network_connection_delete_cb (NMRemoteConnection *connection, treeview = GTK_TREE_VIEW (gtk_builder_get_object (device_wifi->priv->builder, "treeview_list")); model = gtk_tree_view_get_model (treeview); - ret = find_id_in_store (model, &iter, - device_wifi->priv->selected_connection_id); + ret = find_connection_id_in_store (model, &iter, + device_wifi->priv->selected_connection_id); if (ret) gtk_list_store_remove (GTK_LIST_STORE (model), &iter); show_wifi_list (device_wifi); @@ -967,7 +993,7 @@ connection_activate_cb (NMClient *client, static void wireless_try_to_connect (NetDeviceWifi *device_wifi, const gchar *ssid_target, - const gchar *object_path) + const gchar *ap_object_path) { const GByteArray *ssid; const gchar *ssid_tmp; @@ -983,7 +1009,7 @@ wireless_try_to_connect (NetDeviceWifi *device_wifi, if (device_wifi->priv->updating_device) goto out; - if (object_path == NULL || object_path[0] == 0) + if (ap_object_path == NULL || ap_object_path[0] == 0) goto out; device = net_device_get_nm_device (NET_DEVICE (device_wifi)); @@ -991,10 +1017,10 @@ wireless_try_to_connect (NetDeviceWifi *device_wifi, goto out; g_debug ("try to connect to WIFI network %s [%s]", - ssid_target, object_path); + ssid_target, ap_object_path); /* hidden networks */ - if (g_strcmp0 (object_path, "ap-other...") == 0) { + if (g_strcmp0 (ap_object_path, "ap-other...") == 0) { connect_to_hidden_network (device_wifi); goto out; } @@ -1002,11 +1028,9 @@ wireless_try_to_connect (NetDeviceWifi *device_wifi, /* look for an existing connection we can use */ remote_settings = net_object_get_remote_settings (NET_OBJECT (device_wifi)); list = nm_remote_settings_list_connections (remote_settings); - g_debug ("%i existing remote connections available", - g_slist_length (list)); + g_debug ("%i existing remote connections available", g_slist_length (list)); filtered = nm_device_filter_connections (device, list); - g_debug ("%i suitable remote connections to check", - g_slist_length (filtered)); + g_debug ("%i suitable remote connections to check", g_slist_length (filtered)); for (l = filtered; l; l = g_slist_next (l)) { connection = NM_CONNECTION (l->data); setting_wireless = nm_connection_get_setting_wireless (connection); @@ -1042,7 +1066,7 @@ wireless_try_to_connect (NetDeviceWifi *device_wifi, ssid_target); nm_client_add_and_activate_connection (client, NULL, - device, object_path, + device, ap_object_path, connection_add_activate_cb, device_wifi); out: return; @@ -1526,7 +1550,7 @@ connect_wifi_network (NetDeviceWifi *device_wifi, GtkTreePath *path) { gboolean ap_in_range; - gchar *object_path; + gchar *ap_object_path; gchar *ssid; GtkTreeIter iter; GtkTreeModel *model; @@ -1536,16 +1560,16 @@ connect_wifi_network (NetDeviceWifi *device_wifi, gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get (model, &iter, - COLUMN_ID, &object_path, + COLUMN_ACCESS_POINT_ID, &ap_object_path, COLUMN_TITLE, &ssid, COLUMN_AP_IN_RANGE, &ap_in_range, COLUMN_MODE, &mode, -1); if (ap_in_range || mode == NM_802_11_MODE_UNKNOWN) - wireless_try_to_connect (device_wifi, ssid, object_path); + wireless_try_to_connect (device_wifi, ssid, ap_object_path); - g_free (object_path); + g_free (ap_object_path); g_free (ssid); } @@ -1612,7 +1636,8 @@ show_wifi_details (NetDeviceWifi *device_wifi, g_free (device_wifi->priv->selected_connection_id); g_free (device_wifi->priv->selected_ssid_title); gtk_tree_model_get (model, &iter, - COLUMN_ID, &device_wifi->priv->selected_connection_id, + COLUMN_ACCESS_POINT_ID, &device_wifi->priv->selected_ap_id, + COLUMN_CONNECTION_ID, &device_wifi->priv->selected_connection_id, COLUMN_TITLE, &device_wifi->priv->selected_ssid_title, COLUMN_AP_IN_RANGE, &in_range, -1); @@ -1621,7 +1646,7 @@ show_wifi_details (NetDeviceWifi *device_wifi, widget = GTK_WIDGET (gtk_builder_get_object (device_wifi->priv->builder, "notebook_view")); if (in_range) { - /* this is automatically key up to date */ + nm_device_wifi_refresh_ui (device_wifi); gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), 1); goto out; } @@ -1855,6 +1880,7 @@ net_device_wifi_finalize (GObject *object) g_object_unref (priv->builder); g_free (priv->selected_ssid_title); g_free (priv->selected_connection_id); + g_free (priv->selected_ap_id); G_OBJECT_CLASS (net_device_wifi_parent_class)->finalize (object); } diff --git a/panels/network/network-wifi.ui b/panels/network/network-wifi.ui index 30bb9376f..f3f42078d 100644 --- a/panels/network/network-wifi.ui +++ b/panels/network/network-wifi.ui @@ -119,24 +119,16 @@ </object> <object class="GtkListStore" id="liststore_network"> <columns> - <!-- column-name id --> - <column type="gchararray"/> - <!-- column-name title --> - <column type="gchararray"/> - <!-- column-name sortable --> - <column type="gchararray"/> - <!-- column-name strength --> - <column type="guint"/> - <!-- column-name mode --> - <column type="guint"/> - <!-- column-name security --> - <column type="guint"/> - <!-- column-name active --> - <column type="gboolean"/> - <!-- column-name ap-in-range --> - <column type="gboolean"/> - <!-- column-name ap-is-saved --> - <column type="gboolean"/> + <column type="gchararray"/> <!-- column-name ap-id --> + <column type="gchararray"/> <!-- column-name connection-id --> + <column type="gchararray"/> <!-- column-name title --> + <column type="gchararray"/> <!-- column-name sortable --> + <column type="guint"/> <!-- column-name strength --> + <column type="guint"/> <!-- column-name mode --> + <column type="guint"/> <!-- column-name security --> + <column type="gboolean"/> <!-- column-name active --> + <column type="gboolean"/> <!-- column-name ap-in-range --> + <column type="gboolean"/> <!-- column-name ap-is-saved --> </columns> </object> <object class="GtkWindow" id="window_tmp"> diff --git a/panels/network/panel-common.c b/panels/network/panel-common.c index 09ba2a280..c5cfdf9dd 100644 --- a/panels/network/panel-common.c +++ b/panels/network/panel-common.c @@ -699,3 +699,13 @@ panel_set_device_widgets (GtkBuilder *builder, NMDevice *device) panel_set_device_widget_header (builder, "ipv6", _("IP Address")); } } + +void +panel_unset_device_widgets (GtkBuilder *builder) +{ + panel_set_device_widget_details (builder, "ipv4", NULL); + panel_set_device_widget_details (builder, "ipv6", NULL); + panel_set_device_widget_details (builder, "dns", NULL); + panel_set_device_widget_details (builder, "route", NULL); + panel_set_device_widget_details (builder, "subnet", NULL); +} diff --git a/panels/network/panel-common.h b/panels/network/panel-common.h index c452ee319..725824f25 100644 --- a/panels/network/panel-common.h +++ b/panels/network/panel-common.h @@ -45,6 +45,7 @@ gboolean panel_set_device_widget_header (GtkBuilder *buil const gchar *value); void panel_set_device_widgets (GtkBuilder *builder, NMDevice *device); +void panel_unset_device_widgets (GtkBuilder *builder); G_END_DECLS |