diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2018-11-09 19:18:48 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2019-02-27 10:13:39 +0100 |
commit | dad2476cfaf9e5770426dacf42e895ad46b8bebb (patch) | |
tree | 8c1eb2d9b7b401aadbe817c4d9c912d03a74a984 | |
parent | f14a27e6fb68dcc12ae0742353b086e8180a0ff7 (diff) | |
download | network-manager-applet-dad2476cfaf9e5770426dacf42e895ad46b8bebb.tar.gz |
applet/info-dialog: sort interesting connections first
That is: Hotspot, default connections, non-generated connections.
-rw-r--r-- | src/applet-dialogs.c | 94 |
1 files changed, 92 insertions, 2 deletions
diff --git a/src/applet-dialogs.c b/src/applet-dialogs.c index 95f8b7c1..a856f768 100644 --- a/src/applet-dialogs.c +++ b/src/applet-dialogs.c @@ -880,11 +880,94 @@ info_dialog_add_page_for_vpn (GtkNotebook *notebook, gtk_widget_show_all (GTK_WIDGET (grid)); } +#ifndef NM_REMOTE_CONNECTION_FLAGS +/* + * NetworkManager < 1.12 compatibility. + * If you look outside and see flying cars, remove this. + */ +typedef enum { + NM_SETTINGS_CONNECTION_FLAG_NM_GENERATED = 2, +} NMSettingsConnectionFlags; + +static NMSettingsConnectionFlags +nm_remote_connection_get_flags (NMRemoteConnection *connection) +{ + NMSettingsConnectionFlags flags; + + if (!g_object_class_find_property (G_OBJECT_GET_CLASS (connection), "flags")) + return 0; + + g_object_get (connection, "flags", &flags, NULL); + return flags; +} +#else +#define nm_remote_connection_get_flags(conn) \ + NM_LIBNM_COMPAT_UNDEPRECATE (nm_remote_connection_get_flags (conn)) +#endif + +static int +_compare_active_connections (gconstpointer a, gconstpointer b) +{ + NMActiveConnection *ac_a = NM_ACTIVE_CONNECTION(*(NMActiveConnection **)a); + NMActiveConnection *ac_b = NM_ACTIVE_CONNECTION(*(NMActiveConnection **)b); + NMRemoteConnection *con_a = nm_active_connection_get_connection (ac_a); + NMRemoteConnection *con_b = nm_active_connection_get_connection (ac_b); + NMSettingIPConfig *s_ip; + int cmp = 0; + + if (con_a && nm_remote_connection_get_visible (con_a)) + cmp--; + if (con_b && nm_remote_connection_get_visible (con_b)) + cmp++; + if (cmp || !con_a || !con_b) + return cmp; + + s_ip = nm_connection_get_setting_ip6_config (NM_CONNECTION (con_a)); + if (s_ip && strcmp (nm_setting_ip_config_get_method (s_ip), NM_SETTING_IP6_CONFIG_METHOD_SHARED) == 0) + cmp--; + s_ip = nm_connection_get_setting_ip6_config (NM_CONNECTION (con_b)); + if (s_ip && strcmp (nm_setting_ip_config_get_method (s_ip), NM_SETTING_IP6_CONFIG_METHOD_SHARED) == 0) + cmp++; + if (cmp) + return cmp; + + s_ip = nm_connection_get_setting_ip4_config (NM_CONNECTION (con_a)); + if (s_ip && strcmp (nm_setting_ip_config_get_method (s_ip), NM_SETTING_IP4_CONFIG_METHOD_SHARED) == 0) + cmp--; + s_ip = nm_connection_get_setting_ip4_config (NM_CONNECTION (con_b)); + if (s_ip && strcmp (nm_setting_ip_config_get_method (s_ip), NM_SETTING_IP4_CONFIG_METHOD_SHARED) == 0) + cmp++; + if (cmp) + return cmp; + + if (nm_active_connection_get_default (ac_a)) + cmp--; + if (nm_active_connection_get_default (ac_b)) + cmp++; + if (cmp) + return cmp; + + if (nm_active_connection_get_default6 (ac_a)) + cmp--; + if (nm_active_connection_get_default6 (ac_b)) + cmp++; + if (cmp) + return cmp; + + if (nm_remote_connection_get_flags (con_a) & NM_SETTINGS_CONNECTION_FLAG_NM_GENERATED) + cmp++; + if (nm_remote_connection_get_flags (con_b) & NM_SETTINGS_CONNECTION_FLAG_NM_GENERATED) + cmp--; + + return cmp; +} + static GtkWidget * info_dialog_update (NMApplet *applet) { GtkNotebook *notebook; const GPtrArray *connections; + gs_unref_ptrarray GPtrArray *sorted_connections = NULL; int i; int pages = 0; @@ -896,8 +979,15 @@ info_dialog_update (NMApplet *applet) /* Add new pages */ connections = nm_client_get_active_connections (applet->nm_client); - for (i = 0; connections && (i < connections->len); i++) { - NMActiveConnection *active_connection = g_ptr_array_index (connections, i); + + sorted_connections = g_ptr_array_new_full (connections->len, NULL); + memcpy (sorted_connections->pdata, connections->pdata, + sizeof (void *) * connections->len); + sorted_connections->len = connections->len; + g_ptr_array_sort (sorted_connections, _compare_active_connections); + + for (i = 0; i < sorted_connections->len; i++) { + NMActiveConnection *active_connection = g_ptr_array_index (sorted_connections, i); NMConnection *connection; const GPtrArray *devices; |