diff options
author | Benjamin Berg <bberg@redhat.com> | 2018-12-13 18:04:01 +0100 |
---|---|---|
committer | Benjamin Berg <bberg@redhat.com> | 2018-12-13 18:08:35 +0100 |
commit | 464b5e3b8f7963ba48130510427f037467d85585 (patch) | |
tree | 4a4bbb2d116f8aa1acb5ea14884c092a680fe9d6 | |
parent | 73b879ab850609a9157a0e11d9315d1ae1182fb9 (diff) | |
download | gnome-control-center-wip/benzea/wifi-panel-with-editor-changes.tar.gz |
wifi: Use new CcWifiConnectionRow widgetwip/benzea/wifi-panel-with-editor-changes
This is in preparation to optimise the AP list updating.
-rw-r--r-- | panels/network/net-device-wifi.c | 319 |
1 files changed, 53 insertions, 266 deletions
diff --git a/panels/network/net-device-wifi.c b/panels/network/net-device-wifi.c index 3c0317dd0..4b1057165 100644 --- a/panels/network/net-device-wifi.c +++ b/panels/network/net-device-wifi.c @@ -37,6 +37,8 @@ #include "connection-editor/net-connection-editor.h" #include "net-device-wifi.h" +#include "cc-wifi-connection-row.h" + #define PERIODIC_WIFI_SCAN_TIMEOUT 15 typedef enum { @@ -121,36 +123,6 @@ device_wifi_proxy_add_to_stack (NetObject *object, return widget; } -static guint -get_access_point_security (NMAccessPoint *ap) -{ - NM80211ApFlags flags; - NM80211ApSecurityFlags wpa_flags; - NM80211ApSecurityFlags rsn_flags; - guint type; - - flags = nm_access_point_get_flags (ap); - wpa_flags = nm_access_point_get_wpa_flags (ap); - rsn_flags = nm_access_point_get_rsn_flags (ap); - - if (!(flags & NM_802_11_AP_FLAGS_PRIVACY) && - wpa_flags == NM_802_11_AP_SEC_NONE && - rsn_flags == NM_802_11_AP_SEC_NONE) - type = NM_AP_SEC_NONE; - else if ((flags & NM_802_11_AP_FLAGS_PRIVACY) && - wpa_flags == NM_802_11_AP_SEC_NONE && - rsn_flags == NM_802_11_AP_SEC_NONE) - type = NM_AP_SEC_WEP; - else if (!(flags & NM_802_11_AP_FLAGS_PRIVACY) && - wpa_flags != NM_802_11_AP_SEC_NONE && - rsn_flags != NM_802_11_AP_SEC_NONE) - type = NM_AP_SEC_WPA; - else - type = NM_AP_SEC_WPA2; - - return type; -} - static GPtrArray * panel_get_strongest_unique_aps (const GPtrArray *aps) { @@ -1690,7 +1662,7 @@ static void really_forget (GtkDialog *dialog, gint response, gpointer data) { GtkWidget *forget = data; - GtkWidget *row; + CcWifiConnectionRow *row; GList *rows; GList *r; NMRemoteConnection *connection; @@ -1707,9 +1679,9 @@ really_forget (GtkDialog *dialog, gint response, gpointer data) rows = g_object_steal_data (G_OBJECT (forget), "rows"); for (r = rows; r; r = r->next) { row = r->data; - connection = g_object_get_data (G_OBJECT (row), "connection"); + connection = NM_REMOTE_CONNECTION (cc_wifi_connection_row_get_connection (row)); nm_remote_connection_delete_async (connection, cancellable, really_forgotten, device_wifi); - gtk_widget_destroy (row); + gtk_widget_destroy (GTK_WIDGET (row)); } g_list_free (rows); } @@ -1739,14 +1711,12 @@ forget_selected (GtkButton *forget, NetDeviceWifi *device_wifi) } static void -check_toggled (GtkToggleButton *check, GtkWidget *forget) +check_toggled (GtkWidget *forget, GParamSpec *pspec, CcWifiConnectionRow *row) { gboolean active; - GtkWidget *row; GList *rows; - row = gtk_widget_get_ancestor (GTK_WIDGET (check), GTK_TYPE_LIST_BOX_ROW); - active = gtk_toggle_button_get_active (check); + active = cc_wifi_connection_row_get_checked (row); rows = g_object_steal_data (G_OBJECT (forget), "rows"); if (active) { @@ -1771,198 +1741,30 @@ update_forget (GtkWidget *forget, gtk_widget_set_sensitive (forget, rows != NULL); } -static void -make_row (GtkSizeGroup *rows, - GtkSizeGroup *icons, - GtkWidget *forget, - NMDevice *device, - NMConnection *connection, - NMAccessPoint *ap, - NMAccessPoint *active_ap, - GtkWidget **row_out, - GtkWidget **check_out, - GtkWidget **edit_out) -{ - GtkWidget *row, *row_box; - GtkWidget *widget; - GtkWidget *box; - GtkWidget *button_stack; - GtkWidget *image; - gchar *title; - gboolean active; - gboolean in_range; - gboolean connecting; - guint security; - guint strength; - GBytes *ssid; - const gchar *icon_name; - guint64 timestamp; - NMDeviceState state; - - g_assert (connection || ap); +static gint +history_sort (gconstpointer a, gconstpointer b, gpointer data) +{ + guint64 ta, tb; + NMConnection *ca, *cb; + NMSettingConnection *sc; - state = nm_device_get_state (device); + ca = cc_wifi_connection_row_get_connection (CC_WIFI_CONNECTION_ROW ((gpointer) a)); + cb = cc_wifi_connection_row_get_connection (CC_WIFI_CONNECTION_ROW ((gpointer) b)); - if (connection != NULL) { - NMSettingWireless *sw; - NMSettingConnection *sc; - sw = nm_connection_get_setting_wireless (connection); - ssid = nm_setting_wireless_get_ssid (sw); - sc = nm_connection_get_setting_connection (connection); - timestamp = nm_setting_connection_get_timestamp (sc); + if (ca) { + sc = nm_connection_get_setting_connection (ca); + ta = nm_setting_connection_get_timestamp (sc); } else { - ssid = nm_access_point_get_ssid (ap); - timestamp = 0; + ta = 0; } - if (ap != NULL) { - in_range = TRUE; - active = (ap == active_ap) && (state == NM_DEVICE_STATE_ACTIVATED); - connecting = (ap == active_ap) && - (state == NM_DEVICE_STATE_PREPARE || - state == NM_DEVICE_STATE_CONFIG || - state == NM_DEVICE_STATE_IP_CONFIG || - state == NM_DEVICE_STATE_IP_CHECK || - state == NM_DEVICE_STATE_NEED_AUTH); - security = get_access_point_security (ap); - strength = nm_access_point_get_strength (ap); + if (cb) { + sc = nm_connection_get_setting_connection (cb); + tb = nm_setting_connection_get_timestamp (sc); } else { - in_range = FALSE; - active = FALSE; - connecting = FALSE; - security = 0; - strength = 0; - } - - row = gtk_list_box_row_new (); - gtk_size_group_add_widget (rows, row); - - row_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); - gtk_widget_set_margin_start (row_box, 12); - gtk_widget_set_margin_end (row_box, 12); - gtk_container_add (GTK_CONTAINER (row), row_box); - - button_stack = gtk_stack_new (); - gtk_widget_show (button_stack); - - widget = gtk_label_new (""); - gtk_widget_show (widget); - gtk_container_add (GTK_CONTAINER (button_stack), widget); - - widget = NULL; - if (forget) { - widget = gtk_check_button_new (); - g_signal_connect (widget, "toggled", - G_CALLBACK (check_toggled), forget); - gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); - gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); - gtk_box_pack_start (GTK_BOX (row_box), widget, FALSE, FALSE, 0); - g_signal_connect_object (row, "destroy", - G_CALLBACK (update_forget), forget, G_CONNECT_SWAPPED); - } - if (check_out) - *check_out = widget; - - title = nm_utils_ssid_to_utf8 (g_bytes_get_data (ssid, NULL), g_bytes_get_size (ssid)); - widget = gtk_label_new (title); - g_free (title); - gtk_widget_set_margin_top (widget, 12); - gtk_widget_set_margin_bottom (widget, 12); - gtk_label_set_ellipsize (GTK_LABEL (widget), PANGO_ELLIPSIZE_END); - gtk_label_set_xalign (GTK_LABEL (widget), 0.f); - gtk_box_pack_start (GTK_BOX (row_box), widget, FALSE, FALSE, 0); - - if (active) { - widget = gtk_image_new_from_icon_name ("object-select-symbolic", GTK_ICON_SIZE_MENU); - gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); - gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); - gtk_box_pack_start (GTK_BOX (row_box), widget, FALSE, FALSE, 0); + tb = 0; } - gtk_box_pack_start (GTK_BOX (row_box), gtk_label_new (""), TRUE, FALSE, 0); - - widget = NULL; - image = gtk_image_new_from_icon_name ("emblem-system-symbolic", GTK_ICON_SIZE_MENU); - gtk_widget_show (image); - widget = gtk_button_new (); - gtk_style_context_add_class (gtk_widget_get_style_context (widget), "image-button"); - gtk_style_context_add_class (gtk_widget_get_style_context (widget), "circular"); - gtk_widget_show (widget); - gtk_container_add (GTK_CONTAINER (widget), image); - gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); - gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); - atk_object_set_name (gtk_widget_get_accessible (widget), _("Options…")); - gtk_stack_add_named (GTK_STACK (button_stack), widget, "button"); - g_object_set_data (G_OBJECT (row), "edit", widget); - - if (connection) - gtk_stack_set_visible_child_name (GTK_STACK (button_stack), "button"); - - gtk_box_pack_start (GTK_BOX (row_box), button_stack, FALSE, FALSE, 0); - g_object_set_data (G_OBJECT (row), "button_stack", button_stack); - - - if (edit_out) - *edit_out = widget; - - widget = gtk_spinner_new (); - gtk_spinner_start (GTK_SPINNER (widget)); - gtk_widget_show (widget); - - gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); - gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); - gtk_stack_add_named (GTK_STACK (button_stack), widget, "spinner"); - if (connecting) - gtk_stack_set_visible_child_name (GTK_STACK (button_stack), "spinner"); - - box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - gtk_box_set_homogeneous (GTK_BOX (box), TRUE); - gtk_size_group_add_widget (icons, box); - gtk_box_pack_start (GTK_BOX (row_box), box, FALSE, FALSE, 0); - - if (in_range) { - if (security != NM_AP_SEC_UNKNOWN && - security != NM_AP_SEC_NONE) { - widget = gtk_image_new_from_icon_name ("network-wireless-encrypted-symbolic", GTK_ICON_SIZE_MENU); - } else { - widget = gtk_label_new (""); - } - gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 0); - - if (strength < 20) - icon_name = "network-wireless-signal-none-symbolic"; - else if (strength < 40) - icon_name = "network-wireless-signal-weak-symbolic"; - else if (strength < 50) - icon_name = "network-wireless-signal-ok-symbolic"; - else if (strength < 80) - icon_name = "network-wireless-signal-good-symbolic"; - else - icon_name = "network-wireless-signal-excellent-symbolic"; - widget = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU); - gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 0); - } - - gtk_widget_show_all (row); - - g_object_set_data (G_OBJECT (row), "ap", ap); - if (connection) - g_object_set_data (G_OBJECT (row), "connection", connection); - g_object_set_data (G_OBJECT (row), "timestamp", GUINT_TO_POINTER (timestamp)); - g_object_set_data (G_OBJECT (row), "active", GUINT_TO_POINTER (active)); - g_object_set_data (G_OBJECT (row), "strength", GUINT_TO_POINTER (strength)); - - *row_out = row; -} - -static gint -history_sort (gconstpointer a, gconstpointer b, gpointer data) -{ - guint64 ta, tb; - - ta = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (a), "timestamp")); - tb = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (b), "timestamp")); - if (ta > tb) return -1; if (tb > ta) return 1; @@ -1972,10 +1774,22 @@ history_sort (gconstpointer a, gconstpointer b, gpointer data) static gint ap_sort (gconstpointer a, gconstpointer b, gpointer data) { + NMAccessPoint *apa, *apb; guint sa, sb; - sa = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (a), "strength")); - sb = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (b), "strength")); + apa = cc_wifi_connection_row_get_access_point (CC_WIFI_CONNECTION_ROW ((gpointer) a)); + apb = cc_wifi_connection_row_get_access_point (CC_WIFI_CONNECTION_ROW ((gpointer) b)); + + if (apa) + sa = nm_access_point_get_strength (apa); + else + sa = 0; + + if (apb) + sb = nm_access_point_get_strength (apb); + else + sb = 0; + if (sa > sb) return -1; if (sb > sa) return 1; @@ -1983,9 +1797,8 @@ ap_sort (gconstpointer a, gconstpointer b, gpointer data) } static void -show_details_for_row (GtkButton *button, NetDeviceWifi *device_wifi) +show_details_for_row (CcWifiConnectionRow *row, NetDeviceWifi *device_wifi) { - GtkWidget *row; NMConnection *connection; NMAccessPoint *ap; GtkWidget *window; @@ -1993,11 +1806,10 @@ show_details_for_row (GtkButton *button, NetDeviceWifi *device_wifi) NMClient *client; NMDevice *device; - window = gtk_widget_get_toplevel (GTK_WIDGET (button)); + window = gtk_widget_get_toplevel (GTK_WIDGET (row)); - row = GTK_WIDGET (g_object_get_data (G_OBJECT (button), "row")); - connection = NM_CONNECTION (g_object_get_data (G_OBJECT (row), "connection")); - ap = NM_ACCESS_POINT (g_object_get_data (G_OBJECT (row), "ap")); + connection = cc_wifi_connection_row_get_connection (row); + ap = cc_wifi_connection_row_get_access_point (row); device = net_device_get_nm_device (NET_DEVICE (device_wifi)); client = net_object_get_client (NET_OBJECT (device_wifi)); @@ -2011,7 +1823,6 @@ open_history (NetDeviceWifi *device_wifi) GtkWidget *dialog; GtkWidget *window; CcNetworkPanel *panel; - GtkWidget *button; GtkWidget *forget; GtkWidget *header; GtkWidget *swin; @@ -2021,13 +1832,10 @@ open_history (NetDeviceWifi *device_wifi) GSList *l; const GPtrArray *aps; GPtrArray *aps_unique = NULL; - NMAccessPoint *active_ap; guint i; NMDevice *nm_device; GtkWidget *list; GtkWidget *row; - GtkSizeGroup *rows; - GtkSizeGroup *icons; dialog = g_object_new (GTK_TYPE_DIALOG, "use-header-bar", 1, NULL); panel = net_object_get_panel (NET_OBJECT (device_wifi)); @@ -2087,18 +1895,12 @@ open_history (NetDeviceWifi *device_wifi) g_object_set_data (G_OBJECT (forget), "net", device_wifi); gtk_container_add (GTK_CONTAINER (content_area), forget); - rows = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL); - icons = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - g_object_set_data_full (G_OBJECT (list), "rows", rows, g_object_unref); - g_object_set_data_full (G_OBJECT (list), "icons", icons, g_object_unref); - nm_device = net_device_get_nm_device (NET_DEVICE (device_wifi)); connections = net_device_get_valid_connections (NET_DEVICE (device_wifi)); aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (nm_device)); aps_unique = panel_get_strongest_unique_aps (aps); - active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (nm_device)); for (l = connections; l; l = l->next) { NMConnection *connection = l->data; @@ -2121,13 +1923,15 @@ open_history (NetDeviceWifi *device_wifi) ap = NULL; } - make_row (rows, icons, forget, nm_device, connection, ap, active_ap, &row, NULL, &button); + row = GTK_WIDGET (cc_wifi_connection_row_new (nm_device, connection, ap, TRUE)); + + g_signal_connect_object (row, "notify::checked", + G_CALLBACK (check_toggled), forget, G_CONNECT_SWAPPED); + g_signal_connect_object (row, "destroy", + G_CALLBACK (update_forget), forget, G_CONNECT_SWAPPED); + g_signal_connect (row, "configure", G_CALLBACK (show_details_for_row), device_wifi); + gtk_container_add (GTK_CONTAINER (list), row); - if (button) { - g_signal_connect (button, "clicked", - G_CALLBACK (show_details_for_row), device_wifi); - g_object_set_data (G_OBJECT (button), "row", row); - } } g_slist_free (connections); g_ptr_array_free (aps_unique, TRUE); @@ -2139,17 +1943,13 @@ static void populate_ap_list (NetDeviceWifi *device_wifi) { GtkWidget *list; - GtkSizeGroup *rows; - GtkSizeGroup *icons; NMDevice *nm_device; GSList *connections; GSList *l; const GPtrArray *aps; GPtrArray *aps_unique = NULL; - NMAccessPoint *active_ap; guint i; GtkWidget *row; - GtkWidget *button; GList *children, *child; list = GTK_WIDGET (gtk_builder_get_object (device_wifi->builder, "listbox")); @@ -2160,16 +1960,12 @@ populate_ap_list (NetDeviceWifi *device_wifi) } g_list_free (children); - rows = GTK_SIZE_GROUP (g_object_get_data (G_OBJECT (list), "rows")); - icons = GTK_SIZE_GROUP (g_object_get_data (G_OBJECT (list), "icons")); - nm_device = net_device_get_nm_device (NET_DEVICE (device_wifi)); connections = net_device_get_valid_connections (NET_DEVICE (device_wifi)); aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (nm_device)); aps_unique = panel_get_strongest_unique_aps (aps); - active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (nm_device)); for (i = 0; i < aps_unique->len; i++) { GBytes *ssid_ap; @@ -2196,13 +1992,11 @@ populate_ap_list (NetDeviceWifi *device_wifi) connection = NULL; } - make_row (rows, icons, NULL, nm_device, connection, ap, active_ap, &row, NULL, &button); + row = GTK_WIDGET (cc_wifi_connection_row_new (nm_device, connection, ap, FALSE)); + + g_signal_connect (row, "configure", G_CALLBACK (show_details_for_row), device_wifi); + gtk_container_add (GTK_CONTAINER (list), row); - if (button) { - g_signal_connect (button, "clicked", - G_CALLBACK (show_details_for_row), device_wifi); - g_object_set_data (G_OBJECT (button), "row", row); - } } g_slist_free (connections); @@ -2255,8 +2049,6 @@ net_device_wifi_init (NetDeviceWifi *device_wifi) GError *error = NULL; GtkWidget *widget; GtkWidget *list; - GtkSizeGroup *rows; - GtkSizeGroup *icons; device_wifi->builder = gtk_builder_new (); gtk_builder_add_from_resource (device_wifi->builder, @@ -2286,11 +2078,6 @@ net_device_wifi_init (NetDeviceWifi *device_wifi) g_signal_connect (list, "row-activated", G_CALLBACK (ap_activated), device_wifi); - rows = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL); - icons = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - g_object_set_data_full (G_OBJECT (list), "rows", rows, g_object_unref); - g_object_set_data_full (G_OBJECT (list), "icons", icons, g_object_unref); - /* setup view */ widget = GTK_WIDGET (gtk_builder_get_object (device_wifi->builder, "notebook_view")); |