diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2016-09-12 14:34:44 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2016-09-14 23:19:17 +0200 |
commit | e8a16438d8e3696d5e818d48bd49b9c1f284fd2c (patch) | |
tree | de43fb10fcdb36e7c298f0ad9f02f736027abeea | |
parent | 68654ab9825b2eb8fbeec1b5c44580dd38066132 (diff) | |
download | network-manager-applet-e8a16438d8e3696d5e818d48bd49b9c1f284fd2c.tar.gz |
editor: allow specifying IPv4 address for shared method
-rw-r--r-- | src/connection-editor/ce-page.h | 6 | ||||
-rw-r--r-- | src/connection-editor/page-ip4.c | 48 |
2 files changed, 52 insertions, 2 deletions
diff --git a/src/connection-editor/ce-page.h b/src/connection-editor/ce-page.h index 7670f1f2..f1b0810f 100644 --- a/src/connection-editor/ce-page.h +++ b/src/connection-editor/ce-page.h @@ -104,9 +104,15 @@ typedef CEPage* (*CEPageNewFunc)(NMConnectionEditor *editor, "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 94277233..669cb5f6 100644 --- a/src/connection-editor/page-ip4.c +++ b/src/connection-editor/page-ip4.c @@ -60,6 +60,7 @@ typedef struct { GtkTreeView *addr_list; GtkCellRenderer *addr_cells[COL_LAST + 1]; GtkTreeModel *addr_saved; + guint32 addr_method; /* DNS servers */ GtkWidget *dns_servers_label; @@ -236,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); @@ -276,6 +293,10 @@ method_changed (GtkComboBox *combo, gpointer user_data) 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; @@ -283,6 +304,7 @@ method_changed (GtkComboBox *combo, gpointer user_data) 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); @@ -316,6 +338,24 @@ method_changed (GtkComboBox *combo, gpointer user_data) } } + 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:")); @@ -494,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; @@ -525,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 @@ -1142,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); |