[network-manager-applet] editor: commit IPv6 address changes on focus-out



commit cb9d7f232e2661c34d0183c03fbe9a470bc1988f
Author: cee1 <fykcee1 gmail com>
Date:   Mon Apr 26 23:42:43 2010 -0700

    editor: commit IPv6 address changes on focus-out
    
    Cleanups and fixes by dcbw.

 src/connection-editor/page-ip6.c |   71 +++++++++++++++++++++++++++++++++-----
 1 files changed, 62 insertions(+), 9 deletions(-)
---
diff --git a/src/connection-editor/page-ip6.c b/src/connection-editor/page-ip6.c
index eeeb373..4d14197 100644
--- a/src/connection-editor/page-ip6.c
+++ b/src/connection-editor/page-ip6.c
@@ -77,6 +77,9 @@ typedef struct {
 
 	GtkWindowGroup *window_group;
 	gboolean window_added;
+
+	/* Cached tree view entry for editing-canceled */
+	char *last_edited;
 } CEPageIP6Private;
 
 #define METHOD_COL_NAME 0
@@ -445,6 +448,30 @@ list_selection_changed (GtkTreeSelection *selection, gpointer user_data)
 }
 
 static void
+cell_editing_canceled (GtkCellRenderer *renderer, gpointer user_data)
+{
+	CEPageIP6 *self = CE_PAGE_IP6 (user_data);
+	CEPageIP6Private *priv = CE_PAGE_IP6_GET_PRIVATE (self);
+	GtkTreeModel *model = NULL;
+	GtkTreeSelection *selection;
+	GtkTreeIter iter;
+	guint32 column;
+
+	if (priv->last_edited) {
+		selection = gtk_tree_view_get_selection (priv->addr_list);
+		if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+			column = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (renderer), "column"));
+			gtk_list_store_set (GTK_LIST_STORE (model), &iter, column, priv->last_edited, -1);
+		}
+
+		g_free (priv->last_edited);
+		priv->last_edited = NULL;
+
+		ce_page_changed (CE_PAGE (self));
+	}
+}
+
+static void
 cell_edited (GtkCellRendererText *cell,
              const gchar *path_string,
              const gchar *new_text,
@@ -458,6 +485,9 @@ cell_edited (GtkCellRendererText *cell,
 	guint32 column;
 	GtkTreeViewColumn *next_col;
 
+	g_free (priv->last_edited);
+	priv->last_edited = NULL;
+
 	column = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (cell), "column"));
 	gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path);
 	gtk_list_store_set (store, &iter, column, new_text, -1);
@@ -477,12 +507,20 @@ ip_address_filter_cb (GtkEntry *   entry,
                       const gchar *text,
                       gint         length,
                       gint *       position,
-                      gpointer     data)
+                      gpointer     user_data)
 {
+	CEPageIP6 *self = CE_PAGE_IP6 (user_data);
+	CEPageIP6Private *priv = CE_PAGE_IP6_GET_PRIVATE (self);
 	GtkEditable *editable = GTK_EDITABLE (entry);
-	gboolean numeric = GPOINTER_TO_INT (data);
+	gboolean numeric = FALSE;
 	int i, count = 0;
-	gchar *result = g_new (gchar, length);
+	gchar *result = g_new0 (gchar, length);
+	guint column;
+
+	/* The prefix column only allows numbers, no ':' */
+	column = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (editable), "column"));
+	if (column == COL_PREFIX)
+		numeric = TRUE;
 
 	for (i = 0; i < length; i++) {
 		if ((numeric && g_ascii_isdigit (text[i])) ||
@@ -493,11 +531,13 @@ ip_address_filter_cb (GtkEntry *   entry,
 	if (count > 0) {
 		g_signal_handlers_block_by_func (G_OBJECT (editable),
 		                                 G_CALLBACK (ip_address_filter_cb),
-		                                 data);
+		                                 user_data);
 		gtk_editable_insert_text (editable, result, count, position);
+		g_free (priv->last_edited);
+		priv->last_edited = g_strdup (gtk_editable_get_chars (editable, 0, -1));
 		g_signal_handlers_unblock_by_func (G_OBJECT (editable),
 		                                   G_CALLBACK (ip_address_filter_cb),
-		                                   data);
+		                                   user_data);
 	}
 
 	g_signal_stop_emission_by_name (G_OBJECT (editable), "insert-text");
@@ -508,17 +548,28 @@ static void
 cell_editing_started (GtkCellRenderer *cell,
                       GtkCellEditable *editable,
                       const gchar     *path,
-                      gpointer         data)
+                      gpointer         user_data)
 {
+	CEPageIP6 *self = CE_PAGE_IP6 (user_data);
+	CEPageIP6Private *priv = CE_PAGE_IP6_GET_PRIVATE (self);
+	guint column;
+
 	if (!GTK_IS_ENTRY (editable)) {
 		g_warning ("%s: Unexpected cell editable type.", __func__);
 		return;
 	}
 
+	g_free (priv->last_edited);
+	priv->last_edited = NULL;
+
+	/* Need to pass column # to the editable's insert-text function */	
+	column = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (cell), "column"));
+	g_object_set_data (G_OBJECT (editable), "column", GUINT_TO_POINTER (column));
+
 	/* Set up the entry filter */
 	g_signal_connect (G_OBJECT (editable), "insert-text",
 	                  (GCallback) ip_address_filter_cb,
-	                  data);
+	                  user_data);
 }
 
 static void
@@ -604,7 +655,8 @@ finish_setup (CEPageIP6 *self, gpointer unused, GError *error, gpointer user_dat
 	g_object_set (renderer, "editable", TRUE, NULL);
 	g_signal_connect (renderer, "edited", G_CALLBACK (cell_edited), self);
 	g_object_set_data (G_OBJECT (renderer), "column", GUINT_TO_POINTER (COL_ADDRESS));
-	g_signal_connect (renderer, "editing-started", G_CALLBACK (cell_editing_started), GINT_TO_POINTER (FALSE));
+	g_signal_connect (renderer, "editing-started", G_CALLBACK (cell_editing_started), self);
+	g_signal_connect (renderer, "editing-canceled", G_CALLBACK (cell_editing_canceled), self);
 	priv->addr_cells[COL_ADDRESS] = GTK_CELL_RENDERER (renderer);
 
 	offset = gtk_tree_view_insert_column_with_attributes (priv->addr_list,
@@ -620,7 +672,8 @@ finish_setup (CEPageIP6 *self, gpointer unused, GError *error, gpointer user_dat
 	g_object_set (renderer, "editable", TRUE, NULL);
 	g_signal_connect (renderer, "edited", G_CALLBACK (cell_edited), self);
 	g_object_set_data (G_OBJECT (renderer), "column", GUINT_TO_POINTER (COL_PREFIX));
-	g_signal_connect (renderer, "editing-started", G_CALLBACK (cell_editing_started), GINT_TO_POINTER (TRUE));
+	g_signal_connect (renderer, "editing-started", G_CALLBACK (cell_editing_started), self);
+	g_signal_connect (renderer, "editing-canceled", G_CALLBACK (cell_editing_canceled), self);
 	priv->addr_cells[COL_PREFIX] = GTK_CELL_RENDERER (renderer);
 
 	offset = gtk_tree_view_insert_column_with_attributes (priv->addr_list,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]