diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2016-09-14 23:23:44 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2016-09-14 23:23:44 +0200 |
commit | 2b598b5904a7d9fc2b18aef86da278680148213c (patch) | |
tree | 303dcf714fbc8bda8122f2a9e6af7e38d2830da0 | |
parent | 309570724cd3c6e4de9593359e8bbfd1a0bf7323 (diff) | |
parent | 35b489ac4e0422a4de5f8819fd16d652b109b866 (diff) | |
download | network-manager-applet-2b598b5904a7d9fc2b18aef86da278680148213c.tar.gz |
editor: merge branch 'bg/editor-ipv4-addresses-bgo763937'
https://bugzilla.gnome.org/show_bug.cgi?id=763937
-rw-r--r-- | src/connection-editor/ce-page-ip4.ui | 3 | ||||
-rw-r--r-- | src/connection-editor/ce-page-ip6.ui | 3 | ||||
-rw-r--r-- | src/connection-editor/ce-page.h | 14 | ||||
-rw-r--r-- | src/connection-editor/page-ip4.c | 86 | ||||
-rw-r--r-- | src/connection-editor/page-ip6.c | 38 |
5 files changed, 122 insertions, 22 deletions
diff --git a/src/connection-editor/ce-page-ip4.ui b/src/connection-editor/ce-page-ip4.ui index 7acaab56..11c077fe 100644 --- a/src/connection-editor/ce-page-ip4.ui +++ b/src/connection-editor/ce-page-ip4.ui @@ -84,7 +84,6 @@ <property name="visible">True</property> <property name="can_focus">False</property> <property name="xalign">0</property> - <property name="label" translatable="yes">Addresses</property> <attributes> <attribute name="weight" value="bold"/> </attributes> @@ -117,8 +116,6 @@ <property name="height_request">100</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">IP addresses identify your computer on the network. Click the "Add" button to add an IP address.</property> <child internal-child="selection"> <object class="GtkTreeSelection" id="treeview-selection1"/> </child> diff --git a/src/connection-editor/ce-page-ip6.ui b/src/connection-editor/ce-page-ip6.ui index e3b94b06..511383b6 100644 --- a/src/connection-editor/ce-page-ip6.ui +++ b/src/connection-editor/ce-page-ip6.ui @@ -101,7 +101,6 @@ <property name="visible">True</property> <property name="can_focus">False</property> <property name="xalign">0</property> - <property name="label" translatable="yes">Addresses</property> <attributes> <attribute name="weight" value="bold"/> </attributes> @@ -134,8 +133,6 @@ <property name="height_request">100</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="has_tooltip">True</property> - <property name="tooltip_text" translatable="yes">IP addresses identify your computer on the network. Click the "Add" button to add an IP address.</property> <child internal-child="selection"> <object class="GtkTreeSelection" id="treeview-selection1"/> </child> diff --git a/src/connection-editor/ce-page.h b/src/connection-editor/ce-page.h index 6fdb33cb..f1b0810f 100644 --- a/src/connection-editor/ce-page.h +++ b/src/connection-editor/ce-page.h @@ -99,6 +99,20 @@ typedef CEPage* (*CEPageNewFunc)(NMConnectionEditor *editor, const char **out_secrets_setting_name, GError **error); +#define CE_TOOLTIP_ADDR_AUTO _("IP addresses identify your computer on the network. " \ + "Click the \"Add\" button to add static IP address to be " \ + "configured in addition to the automatic ones.") +#define CE_TOOLTIP_ADDR_MANUAL _("IP addresses identify your computer on the network. " \ + "Click the \"Add\" button to add an IP address.") +#define CE_TOOLTIP_ADDR_SHARED _("The IP address identify your computer on the network and " \ + "determines the address range distributed to other computers. " \ + "Click the \"Add\" button to add an IP address. "\ + "If no address is provided, one in the 10.42.x.x range will " \ + "be used.") + +#define CE_LABEL_ADDR_AUTO _("Additional static addresses") +#define CE_LABEL_ADDR_MANUAL _("Addresses") +#define CE_LABEL_ADDR_SHARED _("Address (optional)") GType ce_page_get_type (void); diff --git a/src/connection-editor/page-ip4.c b/src/connection-editor/page-ip4.c index b457448d..9f4dbc86 100644 --- a/src/connection-editor/page-ip4.c +++ b/src/connection-editor/page-ip4.c @@ -59,6 +59,8 @@ typedef struct { GtkButton *addr_delete; GtkTreeView *addr_list; GtkCellRenderer *addr_cells[COL_LAST + 1]; + GtkTreeModel *addr_saved; + guint32 addr_method; /* DNS servers */ GtkWidget *dns_servers_label; @@ -235,6 +237,22 @@ ip4_private_init (CEPageIP4 *self, NMConnection *connection) } static void +address_list_changed (CEPageIP4 *self) +{ + CEPageIP4Private *priv = CE_PAGE_IP4_GET_PRIVATE (self); + GtkTreeModel *model; + int num_rows; + + if (priv->addr_method != IP4_METHOD_SHARED) + return; + + /* Only one address is allowed in shared mode */ + model = gtk_tree_view_get_model (priv->addr_list); + num_rows = gtk_tree_model_iter_n_children (model, NULL); + gtk_widget_set_sensitive (GTK_WIDGET (priv->addr_add), num_rows == 0); +} + +static void method_changed (GtkComboBox *combo, gpointer user_data) { CEPageIP4Private *priv = CE_PAGE_IP4_GET_PRIVATE (user_data); @@ -246,6 +264,8 @@ method_changed (GtkComboBox *combo, gpointer user_data) gboolean ip4_required_enabled = TRUE; gboolean method_auto = FALSE; GtkTreeIter iter; + GtkListStore *store; + const char *tooltip = NULL, *label = NULL; if (gtk_combo_box_get_active_iter (priv->method, &iter)) { gtk_tree_model_get (GTK_TREE_MODEL (priv->method_store), &iter, @@ -254,24 +274,40 @@ method_changed (GtkComboBox *combo, gpointer user_data) switch (method) { case IP4_METHOD_AUTO: - addr_enabled = FALSE; + addr_enabled = TRUE; dhcp_enabled = routes_enabled = TRUE; dns_enabled = TRUE; method_auto = TRUE; + tooltip = CE_TOOLTIP_ADDR_AUTO; + label = CE_LABEL_ADDR_AUTO; break; case IP4_METHOD_AUTO_ADDRESSES: - addr_enabled = FALSE; + addr_enabled = TRUE; dns_enabled = dhcp_enabled = routes_enabled = TRUE; + tooltip = CE_TOOLTIP_ADDR_AUTO; + label = CE_LABEL_ADDR_AUTO; break; case IP4_METHOD_MANUAL: addr_enabled = dns_enabled = routes_enabled = TRUE; + tooltip = CE_TOOLTIP_ADDR_MANUAL; + label = CE_LABEL_ADDR_MANUAL; + break; + case IP4_METHOD_SHARED: + addr_enabled = TRUE; + tooltip = CE_TOOLTIP_ADDR_SHARED; + label = CE_LABEL_ADDR_SHARED; break; case IP4_METHOD_DISABLED: addr_enabled = dns_enabled = dhcp_enabled = routes_enabled = ip4_required_enabled = FALSE; + break; default: break; } + priv->addr_method = method; + gtk_widget_set_tooltip_text (GTK_WIDGET (priv->addr_list), tooltip); + gtk_label_set_text (GTK_LABEL (priv->addr_label), label); + /* Disable DHCP stuff for VPNs (though in the future we should support * DHCP over tap interfaces for OpenVPN and vpnc). */ @@ -285,13 +321,41 @@ method_changed (GtkComboBox *combo, gpointer user_data) gtk_widget_set_sensitive (GTK_WIDGET (priv->addr_add), addr_enabled); gtk_widget_set_sensitive (GTK_WIDGET (priv->addr_delete), addr_enabled); gtk_widget_set_sensitive (GTK_WIDGET (priv->addr_list), addr_enabled); - if (!addr_enabled) { - GtkListStore *store; - store = GTK_LIST_STORE (gtk_tree_view_get_model (priv->addr_list)); - gtk_list_store_clear (store); + if (addr_enabled) { + if (priv->addr_saved) { + /* Restore old entries */ + gtk_tree_view_set_model (priv->addr_list, priv->addr_saved); + g_clear_object (&priv->addr_saved); + } + } else { + if (!priv->addr_saved) { + /* Save current entries, set empty list */ + priv->addr_saved = g_object_ref (gtk_tree_view_get_model (priv->addr_list)); + store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model (priv->addr_list, GTK_TREE_MODEL (store)); + g_object_unref (store); + } } + if (method == IP4_METHOD_SHARED) { + GtkTreeModel *model; + gboolean iter_valid; + int i; + + /* Remove all rows except first */ + model = gtk_tree_view_get_model (priv->addr_list); + iter_valid = gtk_tree_model_get_iter_first (model, &iter); + for (i = 0; iter_valid; i++) { + if (i > 0) + iter_valid = gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + else + iter_valid = gtk_tree_model_iter_next (model, &iter); + } + } + + address_list_changed (user_data); + gtk_widget_set_sensitive (priv->dns_servers_label, dns_enabled); if (method_auto) gtk_label_set_text_with_mnemonic (GTK_LABEL (priv->dns_servers_label), _("Additional DNS ser_vers:")); @@ -470,12 +534,14 @@ addr_add_clicked (GtkButton *button, gpointer user_data) g_list_free (cells); gtk_tree_path_free (path); + address_list_changed (user_data); } static void addr_delete_clicked (GtkButton *button, gpointer user_data) { - GtkTreeView *treeview = GTK_TREE_VIEW (user_data); + CEPageIP4Private *priv = CE_PAGE_IP4_GET_PRIVATE (user_data); + GtkTreeView *treeview = priv->addr_list; GtkTreeSelection *selection; GList *selected_rows; GtkTreeModel *model = NULL; @@ -501,6 +567,8 @@ addr_delete_clicked (GtkButton *button, gpointer user_data) selection = gtk_tree_view_get_selection (treeview); gtk_tree_selection_select_iter (selection, &iter); } + + address_list_changed (user_data); } static void @@ -742,7 +810,7 @@ gateway_matches_address (const char *gw_str, const char *addr_str, guint32 prefi static gboolean possibly_wrong_gateway (GtkTreeModel *model, GtkTreeIter *iter, const char *gw_str) { - char *addr_str, *prefix_str; + gs_free char *addr_str = NULL, *prefix_str = NULL; gboolean addr_valid; guint32 prefix; @@ -1118,7 +1186,7 @@ finish_setup (CEPageIP4 *self, gpointer unused, GError *error, gpointer user_dat gtk_widget_set_sensitive (GTK_WIDGET (priv->addr_delete), FALSE); g_signal_connect (priv->addr_add, "clicked", G_CALLBACK (addr_add_clicked), self); - g_signal_connect (priv->addr_delete, "clicked", G_CALLBACK (addr_delete_clicked), priv->addr_list); + g_signal_connect (priv->addr_delete, "clicked", G_CALLBACK (addr_delete_clicked), self); selection = gtk_tree_view_get_selection (priv->addr_list); g_signal_connect (selection, "changed", G_CALLBACK (list_selection_changed), priv->addr_delete); diff --git a/src/connection-editor/page-ip6.c b/src/connection-editor/page-ip6.c index 124269ee..5bebf419 100644 --- a/src/connection-editor/page-ip6.c +++ b/src/connection-editor/page-ip6.c @@ -58,6 +58,7 @@ typedef struct { GtkButton *addr_delete; GtkTreeView *addr_list; GtkCellRenderer *addr_cells[COL_LAST + 1]; + GtkTreeModel *addr_saved; /* DNS servers */ GtkWidget *dns_servers_label; @@ -246,6 +247,8 @@ method_changed (GtkComboBox *combo, gpointer user_data) gboolean ip6_required_enabled = TRUE; gboolean method_auto = FALSE; GtkTreeIter iter; + GtkListStore *store; + const char *tooltip = NULL, *label = NULL; if (gtk_combo_box_get_active_iter (priv->method, &iter)) { gtk_tree_model_get (GTK_TREE_MODEL (priv->method_store), &iter, @@ -254,23 +257,31 @@ method_changed (GtkComboBox *combo, gpointer user_data) switch (method) { case IP6_METHOD_AUTO: - addr_enabled = FALSE; + addr_enabled = TRUE; routes_enabled = TRUE; dns_enabled = TRUE; method_auto = TRUE; ip6_privacy_enabled = TRUE; + tooltip = CE_TOOLTIP_ADDR_AUTO; + label = CE_LABEL_ADDR_AUTO; break; case IP6_METHOD_AUTO_ADDRESSES: - addr_enabled = FALSE; + addr_enabled = TRUE; dns_enabled = routes_enabled = TRUE; ip6_privacy_enabled = TRUE; + tooltip = CE_TOOLTIP_ADDR_AUTO; + label = CE_LABEL_ADDR_AUTO; break; case IP6_METHOD_AUTO_DHCP_ONLY: - addr_enabled = FALSE; + addr_enabled = TRUE; routes_enabled = TRUE; + tooltip = CE_TOOLTIP_ADDR_AUTO; + label = CE_LABEL_ADDR_AUTO; break; case IP6_METHOD_MANUAL: addr_enabled = dns_enabled = routes_enabled = TRUE; + tooltip = CE_TOOLTIP_ADDR_MANUAL; + label = CE_LABEL_ADDR_MANUAL; break; case IP6_METHOD_IGNORE: ip6_required_enabled = FALSE; @@ -279,15 +290,28 @@ method_changed (GtkComboBox *combo, gpointer user_data) break; } + gtk_widget_set_tooltip_text (GTK_WIDGET (priv->addr_list), tooltip); + gtk_label_set_text (GTK_LABEL (priv->addr_label), label); + gtk_widget_set_sensitive (priv->addr_label, addr_enabled); gtk_widget_set_sensitive (GTK_WIDGET (priv->addr_add), addr_enabled); gtk_widget_set_sensitive (GTK_WIDGET (priv->addr_delete), addr_enabled); gtk_widget_set_sensitive (GTK_WIDGET (priv->addr_list), addr_enabled); - if (!addr_enabled) { - GtkListStore *store; - store = GTK_LIST_STORE (gtk_tree_view_get_model (priv->addr_list)); - gtk_list_store_clear (store); + if (addr_enabled) { + if (priv->addr_saved) { + /* Restore old entries */ + gtk_tree_view_set_model (priv->addr_list, priv->addr_saved); + g_clear_object (&priv->addr_saved); + } + } else { + if (!priv->addr_saved) { + /* Save current entries, set empty list */ + priv->addr_saved = g_object_ref (gtk_tree_view_get_model (priv->addr_list)); + store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model (priv->addr_list, GTK_TREE_MODEL (store)); + g_object_unref (store); + } } gtk_widget_set_sensitive (priv->dns_servers_label, dns_enabled); |