[seahorse] Use GTK+ GtkEntryBuffer for secure password entry.



commit 6bfb8025ed42f47748b6d83d604a4fa71aec61df
Author: Stef Walter <stef memberwebs com>
Date:   Thu Jan 21 19:06:38 2010 +0000

    Use GTK+ GtkEntryBuffer for secure password entry.
    
    Remove our own copy of GtkEntry, and use the new GtkEntryBuffer
    in GTK+ 2.18. Bump requred GTK+ version.

 common/Makefile.am                  |    4 +-
 common/seahorse-secure-buffer.c     |  196 +++
 common/seahorse-secure-buffer.h     |   57 +
 configure.in                        |    2 +-
 gkr/seahorse-gkr-add-item.c         |   20 +-
 gkr/seahorse-gkr-item-properties.c  |   50 +-
 libseahorse/Makefile.am             |    1 -
 libseahorse/seahorse-passphrase.c   |   44 +-
 libseahorse/seahorse-prefs.c        |    1 -
 libseahorse/seahorse-secure-entry.c | 3007 -----------------------------------
 libseahorse/seahorse-secure-entry.h |  187 ---
 11 files changed, 322 insertions(+), 3247 deletions(-)
---
diff --git a/common/Makefile.am b/common/Makefile.am
index 7fd0823..1ad86ed 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -11,5 +11,5 @@ libseahorse_common_la_SOURCES = \
 	seahorse-bind.c seahorse-bind.h \
 	seahorse-cleanup.c seahorse-cleanup.h \
 	seahorse-object-list.c seahorse-object-list.h \
-	seahorse-registry.c seahorse-registry.h
-	
\ No newline at end of file
+	seahorse-registry.c seahorse-registry.h \
+	seahorse-secure-buffer.c seahorse-secure-buffer.h
\ No newline at end of file
diff --git a/common/seahorse-secure-buffer.c b/common/seahorse-secure-buffer.c
new file mode 100644
index 0000000..8db74f0
--- /dev/null
+++ b/common/seahorse-secure-buffer.c
@@ -0,0 +1,196 @@
+/*
+ * Seahorse
+ *
+ * Copyright (C) 2010 Stefan Walter
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "seahorse-secure-buffer.h"
+#include <gnome-keyring-memory.h>
+
+#include <string.h>
+
+/* Initial size of buffer, in bytes */
+#define MIN_SIZE 16
+
+struct _SeahorseSecureBufferPrivate
+{
+	gchar *text;
+	gsize text_size;
+	gsize text_bytes;
+	guint text_chars;
+};
+
+G_DEFINE_TYPE (SeahorseSecureBuffer, seahorse_secure_buffer, GTK_TYPE_ENTRY_BUFFER);
+
+/* --------------------------------------------------------------------------------
+ * SECURE IMPLEMENTATIONS OF TEXT BUFFER
+ */
+
+static const gchar*
+seahorse_secure_buffer_real_get_text (GtkEntryBuffer *buffer, gsize *n_bytes)
+{
+	SeahorseSecureBuffer *self = SEAHORSE_SECURE_BUFFER (buffer);
+	if (n_bytes)
+		*n_bytes = self->priv->text_bytes;
+	if (!self->priv->text)
+		return "";
+	return self->priv->text;
+}
+
+static guint
+seahorse_secure_buffer_real_get_length (GtkEntryBuffer *buffer)
+{
+	SeahorseSecureBuffer *self = SEAHORSE_SECURE_BUFFER (buffer);
+	return self->priv->text_chars;
+}
+
+static guint
+seahorse_secure_buffer_real_insert_text (GtkEntryBuffer *buffer, guint position,
+                                         const gchar *chars, guint n_chars)
+{
+	SeahorseSecureBuffer *self = SEAHORSE_SECURE_BUFFER (buffer);
+	SeahorseSecureBufferPrivate *pv = self->priv;
+	gsize n_bytes;
+	gsize at;
+
+	n_bytes = g_utf8_offset_to_pointer (chars, n_chars) - chars;
+
+	/* Need more memory */
+	if (n_bytes + pv->text_bytes + 1 > pv->text_size) {
+
+		/* Calculate our new buffer size */
+		while (n_bytes + pv->text_bytes + 1 > pv->text_size) {
+			if (pv->text_size == 0) {
+				pv->text_size = MIN_SIZE;
+			} else {
+				if (2 * pv->text_size < GTK_ENTRY_BUFFER_MAX_SIZE) {
+					pv->text_size *= 2;
+				} else {
+					pv->text_size = GTK_ENTRY_BUFFER_MAX_SIZE;
+					if (n_bytes > pv->text_size - pv->text_bytes - 1) {
+						n_bytes = pv->text_size - pv->text_bytes - 1;
+						n_bytes = g_utf8_find_prev_char (chars, chars + n_bytes + 1) - chars;
+						n_chars = g_utf8_strlen (chars, n_bytes);
+					}
+					break;
+				}
+			}
+		}
+
+		pv->text = gnome_keyring_memory_realloc (pv->text, pv->text_size);
+	}
+
+	/* Actual text insertion */
+	at = g_utf8_offset_to_pointer (pv->text, position) - pv->text;
+	g_memmove (pv->text + at + n_bytes, pv->text + at, pv->text_bytes - at);
+	memcpy (pv->text + at, chars, n_bytes);
+
+	/* Book keeping */
+	pv->text_bytes += n_bytes;
+	pv->text_chars += n_chars;
+	pv->text[pv->text_bytes] = '\0';
+
+	gtk_entry_buffer_emit_inserted_text (buffer, position, chars, n_chars);
+	return n_chars;
+}
+
+static guint
+seahorse_secure_buffer_real_delete_text (GtkEntryBuffer *buffer, guint position, guint n_chars)
+{
+	SeahorseSecureBuffer *self = SEAHORSE_SECURE_BUFFER (buffer);
+	SeahorseSecureBufferPrivate *pv = self->priv;
+	gsize start, end;
+
+	if (position > pv->text_chars)
+		position = pv->text_chars;
+	if (position + n_chars > pv->text_chars)
+		n_chars = pv->text_chars - position;
+
+	if (n_chars > 0) {
+		start = g_utf8_offset_to_pointer (pv->text, position) - pv->text;
+		end = g_utf8_offset_to_pointer (pv->text, position + n_chars) - pv->text;
+
+		g_memmove (pv->text + start, pv->text + end, pv->text_bytes + 1 - end);
+		pv->text_chars -= n_chars;
+		pv->text_bytes -= (end - start);
+
+		gtk_entry_buffer_emit_deleted_text (buffer, position, n_chars);
+	}
+
+	return n_chars;
+}
+
+/* --------------------------------------------------------------------------------
+ *
+ */
+
+static void
+seahorse_secure_buffer_init (SeahorseSecureBuffer *self)
+{
+	SeahorseSecureBufferPrivate *pv;
+	pv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, SEAHORSE_TYPE_SECURE_BUFFER, SeahorseSecureBufferPrivate);
+
+	pv->text = NULL;
+	pv->text_chars = 0;
+	pv->text_bytes = 0;
+	pv->text_size = 0;
+}
+
+static void
+seahorse_secure_buffer_finalize (GObject *obj)
+{
+	SeahorseSecureBuffer *self = SEAHORSE_SECURE_BUFFER (obj);
+	SeahorseSecureBufferPrivate *pv = self->priv;
+
+	if (pv->text) {
+		gnome_keyring_memory_free (pv->text);
+		pv->text = NULL;
+		pv->text_bytes = pv->text_size = 0;
+		pv->text_chars = 0;
+	}
+
+	G_OBJECT_CLASS (seahorse_secure_buffer_parent_class)->finalize (obj);
+}
+
+static void
+seahorse_secure_buffer_class_init (SeahorseSecureBufferClass *klass)
+{
+	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+	GtkEntryBufferClass *buffer_class = GTK_ENTRY_BUFFER_CLASS (klass);
+
+	gobject_class->finalize = seahorse_secure_buffer_finalize;
+
+	buffer_class->get_text = seahorse_secure_buffer_real_get_text;
+	buffer_class->get_length = seahorse_secure_buffer_real_get_length;
+	buffer_class->insert_text = seahorse_secure_buffer_real_insert_text;
+	buffer_class->delete_text = seahorse_secure_buffer_real_delete_text;
+
+	g_type_class_add_private (gobject_class, sizeof (SeahorseSecureBufferPrivate));
+}
+
+/* --------------------------------------------------------------------------------
+ *
+ */
+
+GtkEntryBuffer*
+seahorse_secure_buffer_new (void)
+{
+	return g_object_new (SEAHORSE_TYPE_SECURE_BUFFER, NULL);
+}
diff --git a/common/seahorse-secure-buffer.h b/common/seahorse-secure-buffer.h
new file mode 100644
index 0000000..7c94f8a
--- /dev/null
+++ b/common/seahorse-secure-buffer.h
@@ -0,0 +1,57 @@
+/*
+ * Seahorse
+ *
+ * Copyright (C) 2010 Stefan Walter
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef __SEAHORSE_SECURE_BUFFER_H__
+#define __SEAHORSE_SECURE_BUFFER_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define SEAHORSE_TYPE_SECURE_BUFFER            (seahorse_secure_buffer_get_type ())
+#define SEAHORSE_SECURE_BUFFER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEAHORSE_TYPE_SECURE_BUFFER, SeahorseSecureBuffer))
+#define SEAHORSE_SECURE_BUFFER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SEAHORSE_TYPE_SECURE_BUFFER, SeahorseSecureBufferClass))
+#define SEAHORSE_IS_SECURE_BUFFER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SEAHORSE_TYPE_SECURE_BUFFER))
+#define SEAHORSE_IS_SECURE_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SEAHORSE_TYPE_SECURE_BUFFER))
+#define SEAHORSE_SECURE_BUFFER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), SEAHORSE_TYPE_SECURE_BUFFER, SeahorseSecureBufferClass))
+
+typedef struct _SeahorseSecureBuffer            SeahorseSecureBuffer;
+typedef struct _SeahorseSecureBufferClass       SeahorseSecureBufferClass;
+typedef struct _SeahorseSecureBufferPrivate     SeahorseSecureBufferPrivate;
+
+struct _SeahorseSecureBuffer
+{
+	GtkEntryBuffer parent;
+	SeahorseSecureBufferPrivate *priv;
+};
+
+struct _SeahorseSecureBufferClass
+{
+	GtkEntryBufferClass parent_class;
+};
+
+GType                     seahorse_secure_buffer_get_type               (void) G_GNUC_CONST;
+
+GtkEntryBuffer*           seahorse_secure_buffer_new                    (void);
+
+G_END_DECLS
+
+#endif /* __SEAHORSE_SECURE_BUFFER_H__ */
diff --git a/configure.in b/configure.in
index ba7483d..a262ac3 100644
--- a/configure.in
+++ b/configure.in
@@ -45,7 +45,7 @@ AC_CHECK_FUNCS(strsep)
 
 AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
 
-PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.10)
+PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.18)
 AC_SUBST([GTK_LIBS])
 AC_SUBST([GTK_CFLAGS])
  
diff --git a/gkr/seahorse-gkr-add-item.c b/gkr/seahorse-gkr-add-item.c
index 09f4853..3d9146c 100644
--- a/gkr/seahorse-gkr-add-item.c
+++ b/gkr/seahorse-gkr-add-item.c
@@ -24,10 +24,11 @@
 #include "seahorse-gkr-keyring.h"
 #include "seahorse-gkr-source.h"
 
-#include "seahorse-secure-entry.h"
 #include "seahorse-widget.h"
 #include "seahorse-util.h"
 
+#include "common/seahorse-secure-buffer.h"
+
 #include <glib/gi18n.h>
 
 static void
@@ -74,11 +75,8 @@ on_add_item_label_changed (GtkEntry *entry, SeahorseWidget *swidget)
 G_MODULE_EXPORT void 
 on_add_item_password_toggled (GtkToggleButton *button, SeahorseWidget *swidget)
 {
-    GtkWidget *widget;
-    
-    widget = g_object_get_data (G_OBJECT (swidget), "gkr-secure-entry");
-    seahorse_secure_entry_set_visibility (SEAHORSE_SECURE_ENTRY (widget), 
-                                          gtk_toggle_button_get_active (button));
+	GtkWidget *widget= g_object_get_data (G_OBJECT (swidget), "gkr-secure-entry");
+	gtk_entry_set_visibility (GTK_ENTRY (widget), gtk_toggle_button_get_active (button));
 }
 
 G_MODULE_EXPORT void
@@ -101,7 +99,7 @@ on_add_item_response (GtkDialog *dialog, int response, SeahorseWidget *swidget)
 		g_return_if_fail (label && label[0]);
 		
 		widget = g_object_get_data (G_OBJECT (swidget), "gkr-secure-entry");
-		secret = seahorse_secure_entry_get_text (SEAHORSE_SECURE_ENTRY (widget));
+		secret = gtk_entry_get_text (GTK_ENTRY (widget));
 		
 		widget = seahorse_widget_get_widget (swidget, "item-keyring");
 		keyring = gtk_combo_box_get_active_text (GTK_COMBO_BOX (widget));
@@ -126,6 +124,7 @@ void
 seahorse_gkr_add_item_show (GtkWindow *parent)
 {
 	SeahorseWidget *swidget = NULL;
+	GtkEntryBuffer *buffer;
 	GtkWidget *entry, *widget;
 	GList *keyrings, *l;
 	GtkCellRenderer *cell;
@@ -161,11 +160,16 @@ seahorse_gkr_add_item_show (GtkWindow *parent)
 	
 	widget = seahorse_widget_get_widget (swidget, "password-area");
 	g_return_if_fail (widget);
-	entry = seahorse_secure_entry_new ();
+	buffer = seahorse_secure_buffer_new ();
+	entry = gtk_entry_new_with_buffer (buffer);
+	g_object_unref (buffer);
 	gtk_container_add (GTK_CONTAINER (widget), GTK_WIDGET (entry));
 	gtk_widget_show (GTK_WIDGET (entry));
 	g_object_set_data (G_OBJECT (swidget), "gkr-secure-entry", entry);
 
+	widget = seahorse_widget_get_widget (swidget, "show-password");
+	on_add_item_password_toggled (GTK_TOGGLE_BUTTON (widget), swidget);
+
 	widget = seahorse_widget_get_toplevel (swidget);
 	gtk_widget_show (widget);
 	gtk_window_present (GTK_WINDOW (widget));
diff --git a/gkr/seahorse-gkr-item-properties.c b/gkr/seahorse-gkr-item-properties.c
index 5cd215d..b8bbf08 100644
--- a/gkr/seahorse-gkr-item-properties.c
+++ b/gkr/seahorse-gkr-item-properties.c
@@ -30,11 +30,11 @@
 #include "seahorse-object.h"
 #include "seahorse-object-widget.h"
 #include "seahorse-secure-memory.h"
-#include "seahorse-secure-entry.h"
 #include "seahorse-util.h"
 #include "seahorse-widget.h"
 
 #include "common/seahorse-bind.h"
+#include "common/seahorse-secure-buffer.h"
 
 GType
 boxed_access_control_type (void)
@@ -171,9 +171,9 @@ static void
 transfer_password (SeahorseGkrItem *git, SeahorseWidget *swidget)
 {
 	GtkWidget *expander;
-	SeahorseSecureEntry *entry;
+	GtkEntry *entry;
 	const gchar *secret;
-	
+
 	expander = seahorse_widget_get_widget (swidget, "password-expander");
 	g_return_if_fail (expander);
 
@@ -182,15 +182,15 @@ transfer_password (SeahorseGkrItem *git, SeahorseWidget *swidget)
 
 	if (gtk_expander_get_expanded (GTK_EXPANDER (expander))) {
 		secret = seahorse_gkr_item_get_secret (git);
-		seahorse_secure_entry_set_text (entry, secret ? secret : "");
+		gtk_entry_set_text (entry, secret ? secret : "");
 	} else {
-		seahorse_secure_entry_set_text (entry, "");
+		gtk_entry_set_text (entry, "");
 	}
-	seahorse_secure_entry_reset_changed (entry);
+	g_object_set_data (G_OBJECT (entry), "changed", NULL);
 }
 
 static void
-password_activate (SeahorseSecureEntry *entry, SeahorseWidget *swidget)
+password_activate (GtkEntry *entry, SeahorseWidget *swidget)
 {
 	SeahorseObject *object;
 	SeahorseGkrItem *git;
@@ -210,7 +210,7 @@ password_activate (SeahorseSecureEntry *entry, SeahorseWidget *swidget)
 		return;
 
 	entry = g_object_get_data (G_OBJECT (swidget), "secure-password-entry");
-	if (!seahorse_secure_entry_get_changed (entry))
+	if (!g_object_get_data (G_OBJECT (entry), "changed"))
 		return;
 
 	if (g_object_get_data (G_OBJECT (swidget), "updating-password"))
@@ -225,7 +225,7 @@ password_activate (SeahorseSecureEntry *entry, SeahorseWidget *swidget)
 	seahorse_util_wait_until (seahorse_gkr_item_get_info (git));
     
 	info = gnome_keyring_item_info_copy (seahorse_gkr_item_get_info (git));
-	gnome_keyring_item_info_set_secret (info, seahorse_secure_entry_get_text (entry));
+	gnome_keyring_item_info_set_secret (info, gtk_entry_get_text (entry));
 
 	op = seahorse_gkr_operation_update_info (git, info);
 	gnome_keyring_item_info_free (info);
@@ -250,8 +250,14 @@ password_activate (SeahorseSecureEntry *entry, SeahorseWidget *swidget)
 
 }
 
+static void
+password_changed (GtkEditable *editable, SeahorseWidget *swidget)
+{
+	g_object_set_data (G_OBJECT (editable), "changed", "changed");
+}
+
 static gboolean
-password_focus_out (SeahorseSecureEntry* entry, GdkEventFocus *event, SeahorseWidget *swidget)
+password_focus_out (GtkEntry* entry, GdkEventFocus *event, SeahorseWidget *swidget)
 {
     password_activate (entry, swidget);
     return FALSE;
@@ -260,11 +266,8 @@ password_focus_out (SeahorseSecureEntry* entry, GdkEventFocus *event, SeahorseWi
 G_MODULE_EXPORT void 
 on_item_show_password_toggled (GtkToggleButton *button, SeahorseWidget *swidget)
 {
-    GtkWidget *widget;
-    
-    widget = g_object_get_data (G_OBJECT (swidget), "secure-password-entry");
-    seahorse_secure_entry_set_visibility (SEAHORSE_SECURE_ENTRY (widget), 
-                                          gtk_toggle_button_get_active (button));
+	GtkWidget *widget = g_object_get_data (G_OBJECT (swidget), "secure-password-entry");
+	gtk_entry_set_visibility (GTK_ENTRY (widget), gtk_toggle_button_get_active (button));
 }
 
 G_MODULE_EXPORT void
@@ -364,6 +367,7 @@ static void
 setup_main (SeahorseWidget *swidget)
 {
 	SeahorseObject *object;
+	GtkEntryBuffer *buffer;
 	GtkWidget *widget;
 	GtkWidget *box;
 
@@ -403,10 +407,12 @@ setup_main (SeahorseWidget *swidget)
 	/* User name */
 	seahorse_bind_property_full ("item-attributes", object, transform_attributes_user, "label", 
 	                             seahorse_widget_get_widget (swidget, "login-field"), NULL);
-	
+
 	/* Create the password entry */
-	widget = seahorse_secure_entry_new ();
-	        
+	buffer = seahorse_secure_buffer_new ();
+	widget = gtk_entry_new_with_buffer (buffer);
+	g_object_unref (buffer);
+
 	box = seahorse_widget_get_widget (swidget, "password-box-area");
 	g_return_if_fail (box != NULL);
 	gtk_container_add (GTK_CONTAINER (box), widget);
@@ -415,13 +421,17 @@ setup_main (SeahorseWidget *swidget)
 	        
 	/* Now watch for changes in the password */
 	g_signal_connect (widget, "activate", G_CALLBACK (password_activate), swidget);
+	g_signal_connect (widget, "changed", G_CALLBACK (password_changed), swidget);
 	g_signal_connect_after (widget, "focus-out-event", G_CALLBACK (password_focus_out), swidget);
-	    
+
 	/* Sensitivity of the password entry */
 	seahorse_bind_property ("has-secret", object, "sensitive", widget);
-	
+
 	/* Updating of the password entry */
 	seahorse_bind_objects ("has-secret", object, (SeahorseTransfer)transfer_password, swidget);
+
+	widget = seahorse_widget_get_widget (swidget, "show-password-check");
+	on_item_show_password_toggled (widget, swidget);
 }
 
 /* -----------------------------------------------------------------------------
diff --git a/libseahorse/Makefile.am b/libseahorse/Makefile.am
index 817d44c..825cb21 100644
--- a/libseahorse/Makefile.am
+++ b/libseahorse/Makefile.am
@@ -47,7 +47,6 @@ libseahorse_la_SOURCES = \
 	seahorse-prefs.c seahorse-prefs.h \
 	seahorse-progress.c seahorse-progress.h \
 	seahorse-secure-memory.c seahorse-secure-memory.h \
-	seahorse-secure-entry.c seahorse-secure-entry.h \
 	seahorse-servers.c seahorse-servers.h \
 	seahorse-set.c seahorse-set.h \
 	seahorse-set-model.c seahorse-set-model.h \
diff --git a/libseahorse/seahorse-passphrase.c b/libseahorse/seahorse-passphrase.c
index 8f1e9a0..7d9ca80 100644
--- a/libseahorse/seahorse-passphrase.c
+++ b/libseahorse/seahorse-passphrase.c
@@ -47,7 +47,8 @@
 #include "seahorse-widget.h"
 #include "seahorse-util.h"
 #include "seahorse-passphrase.h"
-#include "seahorse-secure-entry.h"
+
+#include "common/seahorse-secure-buffer.h"
 
 #define HIG_SMALL      6        /* gnome hig small space in pixels */
 #define HIG_LARGE     12        /* gnome hig large space in pixels */
@@ -116,9 +117,9 @@ ungrab_keyboard (GtkWidget *win, GdkEvent *event, gpointer data)
 static void
 confirm_callback (GtkWidget *widget, GtkDialog *dialog)
 {
-    GtkWidget *entry = GTK_WIDGET (g_object_get_data (G_OBJECT (dialog), "secure-entry"));
-    g_assert (SEAHORSE_IS_SECURE_ENTRY (entry));
-    gtk_widget_grab_focus (entry);
+	GtkWidget *entry = GTK_WIDGET (g_object_get_data (G_OBJECT (dialog), "secure-entry"));
+	g_assert (GTK_IS_ENTRY (entry));
+	gtk_widget_grab_focus (entry);
 }
 
 /* When enter is pressed in the entry, we simulate an ok */
@@ -131,14 +132,14 @@ enter_callback (GtkWidget *widget, GtkDialog *dialog)
 static void
 entry_changed (GtkEditable *editable, GtkDialog *dialog)
 {
-    SeahorseSecureEntry *entry, *confirm;
-    
-    entry = SEAHORSE_SECURE_ENTRY (g_object_get_data (G_OBJECT (dialog), "secure-entry"));
-    confirm = SEAHORSE_SECURE_ENTRY (g_object_get_data (G_OBJECT (dialog), "confirm-entry"));
-    
-    gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_ACCEPT, 
-                                       strcmp (seahorse_secure_entry_get_text (entry), 
-                                               seahorse_secure_entry_get_text (confirm)) == 0);
+	GtkEntry *entry, *confirm;
+
+	entry = GTK_ENTRY (g_object_get_data (G_OBJECT (dialog), "secure-entry"));
+	confirm = GTK_ENTRY (g_object_get_data (G_OBJECT (dialog), "confirm-entry"));
+
+	gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_ACCEPT,
+	                                   strcmp (gtk_entry_get_text (entry),
+	                                           gtk_entry_get_text (confirm)) == 0);
 }
 
 static gboolean
@@ -180,7 +181,8 @@ seahorse_passphrase_prompt_show (const gchar *title, const gchar *description,
                                  const gchar *prompt, const gchar *check,
                                  gboolean confirm)
 {
-    SeahorseSecureEntry *entry;
+    GtkEntryBuffer *buffer;
+    GtkEntry *entry;
     GtkDialog *dialog;
     GtkWidget *w;
     GtkWidget *box;
@@ -246,7 +248,9 @@ seahorse_passphrase_prompt_show (const gchar *title, const gchar *description,
         g_free (msg);
         gtk_table_attach (table, w, 0, 1, 0, 1, GTK_FILL, 0, 0, 0);
 
-        entry = SEAHORSE_SECURE_ENTRY (seahorse_secure_entry_new ());
+        buffer = seahorse_secure_buffer_new ();
+        entry = GTK_ENTRY (gtk_entry_new_with_buffer (buffer));
+        g_object_unref (buffer);
         gtk_widget_set_size_request (GTK_WIDGET (entry), 200, -1);
         g_object_set_data (G_OBJECT (dialog), "confirm-entry", entry);
         g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (confirm_callback), dialog);
@@ -261,8 +265,10 @@ seahorse_passphrase_prompt_show (const gchar *title, const gchar *description,
     w = gtk_label_new (msg);
     g_free (msg);
     gtk_table_attach (table, w, 0, 1, 1, 2, GTK_FILL, 0, 0, 0);
-    
-    entry = SEAHORSE_SECURE_ENTRY (seahorse_secure_entry_new ());
+
+    buffer = seahorse_secure_buffer_new ();
+    entry = GTK_ENTRY (gtk_entry_new_with_buffer (buffer));
+    g_object_unref (buffer);
     gtk_widget_set_size_request (GTK_WIDGET (entry), 200, -1);
     g_object_set_data (G_OBJECT (dialog), "secure-entry", entry);
     g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (enter_callback), dialog);
@@ -310,10 +316,8 @@ seahorse_passphrase_prompt_show (const gchar *title, const gchar *description,
 const gchar*
 seahorse_passphrase_prompt_get (GtkDialog *dialog)
 {
-    SeahorseSecureEntry *entry;
-
-    entry = SEAHORSE_SECURE_ENTRY (g_object_get_data (G_OBJECT (dialog), "secure-entry"));
-    return seahorse_secure_entry_get_text (entry);
+    GtkEntry *entry = GTK_ENTRY (g_object_get_data (G_OBJECT (dialog), "secure-entry"));
+    return gtk_entry_get_text (entry);
 }
 
 gboolean
diff --git a/libseahorse/seahorse-prefs.c b/libseahorse/seahorse-prefs.c
index ee92b19..644003d 100644
--- a/libseahorse/seahorse-prefs.c
+++ b/libseahorse/seahorse-prefs.c
@@ -28,7 +28,6 @@
 #include "seahorse-gtkstock.h"
 #include "seahorse-keyserver-control.h"
 #include "seahorse-prefs.h"
-#include "seahorse-secure-entry.h"
 #include "seahorse-servers.h"
 #include "seahorse-util.h"
 #include "seahorse-widget.h"



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