summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2016-09-14 23:23:44 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2016-09-14 23:23:44 +0200
commit2b598b5904a7d9fc2b18aef86da278680148213c (patch)
tree303dcf714fbc8bda8122f2a9e6af7e38d2830da0
parent309570724cd3c6e4de9593359e8bbfd1a0bf7323 (diff)
parent35b489ac4e0422a4de5f8819fd16d652b109b866 (diff)
downloadnetwork-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.ui3
-rw-r--r--src/connection-editor/ce-page-ip6.ui3
-rw-r--r--src/connection-editor/ce-page.h14
-rw-r--r--src/connection-editor/page-ip4.c86
-rw-r--r--src/connection-editor/page-ip6.c38
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);