[network-manager-applet] editor: commit IPv6 address changes on focus-out
- From: Dan Williams <dcbw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [network-manager-applet] editor: commit IPv6 address changes on focus-out
- Date: Tue, 27 Apr 2010 06:43:00 +0000 (UTC)
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]