[Gpa-commits] r876 - trunk/src

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Thu Apr 24 17:50:00 CEST 2008


Author: marcus
Date: 2008-04-24 17:50:00 +0200 (Thu, 24 Apr 2008)
New Revision: 876

Removed:
   trunk/src/gpawizard.c
   trunk/src/gpawizard.h
Modified:
   trunk/src/Makefile.am
   trunk/src/keygenwizard.c
Log:
2008-04-24  Marcus Brinkmann  <marcus at g10code.de>

	* Makefile.am (gpa_SOURCES): Remove gpawizard.h and gpawizard.c.
	* gpawizard.h, gpawizard.c: Remove files.
	* keygenwizard.c: Rewritten to use GtkAssistant.


Modified: trunk/src/Makefile.am
===================================================================
--- trunk/src/Makefile.am	2008-04-24 14:55:47 UTC (rev 875)
+++ trunk/src/Makefile.am	2008-04-24 15:50:00 UTC (rev 876)
@@ -59,7 +59,6 @@
 	      keylist.c keylist.h \
 	      siglist.c siglist.h \
 	      gpasubkeylist.c gpasubkeylist.h \
-	      gpawizard.c gpawizard.h \
 	      gpapastrings.c gpapastrings.h\
 	      gpl-text.c gpl-text.h \
 	      keyserver.c keyserver.h \

Deleted: trunk/src/gpawizard.c
===================================================================
--- trunk/src/gpawizard.c	2008-04-24 14:55:47 UTC (rev 875)
+++ trunk/src/gpawizard.c	2008-04-24 15:50:00 UTC (rev 876)
@@ -1,356 +0,0 @@
-/* keygendlg.c  -  The GNU Privacy Assistant
-   Copyright (C) 2001 G-N-U GmbH.
-   Copyright (C) 2008 g10 Code GmbH.
-   This file is part of GPA
-
-   GPA is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   GPA 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 General Public
-   License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-
-/*
- * A simple general purpose Wizard implementation
- */
-
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-#include "gpa.h"
-#include "gtktools.h"
-#include "gpawizard.h"
-
-typedef struct
-{
-  GtkWidget *notebook;
-  GtkWidget *prev_button;
-  GtkWidget *next_button;
-  GtkWidget *finish_button;
-  GtkWidget *cancel_button;
-  GtkWidget *close_button;
-  GtkAccelGroup *accel_group;
-  GPAWizardPageSwitchedFunc page_switched;
-  gpointer page_switched_data;
-}
-GPAWizard;
-
-typedef struct
-{
-  gboolean is_last;
-  GPAWizardAction action;
-  gpointer user_data;
-}
-GPAWizardPage;
-
-/* Return the page data associated with the current page of the wizard */
-static GPAWizardPage *
-gpa_wizard_get_current_page (GPAWizard * wizard)
-{
-  GtkWidget * page_widget;
-  int page_number;
-
-  page_number = gtk_notebook_get_current_page (GTK_NOTEBOOK(wizard->notebook));
-  if (page_number < 0)
-      page_number = 0;
-  page_widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK(wizard->notebook),
-					   page_number);
-  return g_object_get_data (G_OBJECT (page_widget), "gpa_wizard_page");
-}
-
-/* Update the buttons of the wizard depending on the current page */
-void
-gpa_wizard_update_buttons (GtkWidget * widget)
-{
-  GPAWizard * wizard = g_object_get_data (G_OBJECT (widget), "user_data");
-  GPAWizardPage * page;
-  int page_number;
-
-  page_number = gtk_notebook_get_current_page (GTK_NOTEBOOK(wizard->notebook));
-  if (page_number < 0)
-      page_number = 0;
-
-  page = gpa_wizard_get_current_page (wizard);
-
-  /* Choose whether to show "Next" or "Finish" button based on the data
-   * provided */
-  if (page->is_last) 
-    {
-      gtk_widget_hide (wizard->next_button);
-      gtk_widget_show (wizard->finish_button);
-    }
-  else
-    {
-      gtk_widget_show (wizard->next_button);
-      gtk_widget_hide (wizard->finish_button);
-    }
-
-  /* if we're at the last page, assume that whatever the wizard was
-   * supposed to do has been achieved. Therefore make both prev and next
-   * button insensitive, hide the cancel button and show the close one.
-   */
-  /* There doesn't seem to be a simple way to get the number of pages in
-   * a notebook, so try to get the next page and if that is NULL, we're
-   * at the last page.
-   */
-  if (!gtk_notebook_get_nth_page (GTK_NOTEBOOK (wizard->notebook),
-				  page_number + 1))
-    {
-      gtk_widget_set_sensitive (wizard->prev_button, FALSE);
-      gtk_widget_set_sensitive (wizard->next_button, FALSE);
-      gtk_widget_set_sensitive (wizard->finish_button, FALSE);
-      gtk_widget_set_sensitive (wizard->close_button, TRUE);
-      gtk_widget_set_sensitive (wizard->cancel_button, TRUE);
-      gtk_widget_show (wizard->close_button);
-      gtk_widget_hide (wizard->cancel_button);
-    }
-  else
-    {
-      gtk_widget_set_sensitive (wizard->prev_button, TRUE);
-      gtk_widget_set_sensitive (wizard->next_button, TRUE);
-      gtk_widget_set_sensitive (wizard->finish_button, TRUE);
-      gtk_widget_set_sensitive (wizard->close_button, TRUE);
-      gtk_widget_set_sensitive (wizard->cancel_button, TRUE);
-      gtk_widget_hide (wizard->close_button);
-      gtk_widget_show (wizard->cancel_button);
-    }
-
-  /* if we're at the first page, make the prev-button insensitive. */
-  if (page_number == 0)
-    {
-      gtk_widget_set_sensitive (wizard->prev_button, FALSE);
-    }
-
-  /* FIXME: If we are on the "wait" page, disable all buttons.
-   */
-  if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (wizard->notebook),
-				  page_number + 1) &&
-      !gtk_notebook_get_nth_page (GTK_NOTEBOOK (wizard->notebook),
-                                  page_number + 2))
-    {
-      gtk_widget_set_sensitive (wizard->prev_button, FALSE);
-      gtk_widget_set_sensitive (wizard->next_button, FALSE);
-      gtk_widget_set_sensitive (wizard->finish_button, FALSE);
-      gtk_widget_set_sensitive (wizard->close_button, FALSE);
-      gtk_widget_set_sensitive (wizard->cancel_button, FALSE);
-    }
-}
-
-static void
-gpa_wizard_prev (GtkWidget * button, gpointer data)
-{
-  GPAWizard * wizard = data;
-  gtk_notebook_prev_page (GTK_NOTEBOOK (wizard->notebook));
-}
-
-static void
-gpa_wizard_next (GtkWidget * button, gpointer data)
-{
-  gpa_wizard_next_page ((GtkWidget *)data);
-}
-
-static void
-gpa_wizard_page_switched (GtkWidget *notebook, GtkNotebookPage *page,
-			  gint page_num, gpointer user_data)
-{
-  GtkWidget * page_widget;
-  int page_number;
-  GtkWidget * focus;
-  GtkWidget * main_widget = user_data;
-  GPAWizard * wizard = g_object_get_data (G_OBJECT (main_widget), "user_data");
-
-  /* Switch-page is emitted also when pages are added to the notebook,
-     even when it's not even displayed yet.  In that case the page
-     number is < 0, so we simply ignore that case and only try to set
-     the focus if the page number is >= 0.  */
-  page_number = gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook));
-  if (page_number >= 0)
-    {
-      gpa_wizard_update_buttons ((GtkWidget *)user_data);
-      page_widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK(notebook),
-					       page_number);
-      focus = g_object_get_data (G_OBJECT (page_widget),
-				 "gpa_wizard_focus_child");
-      if (focus)
-	{
-	  gtk_widget_grab_focus (focus);
-	}
-
-      /* Call the page switched callback */
-      /* FIXME: this should really be a proper GTK signal */
-      if (wizard->page_switched)
-	{
-	  wizard->page_switched (page_widget, wizard->page_switched_data);
-	}
-    }
-}
-
-
-/* Handler for the notebook's destroy signal. Remove the page_switch
- * callback. For whatever reason, the notebook would emit page_switch
- * signals during the destroy which could cause segfaults in the
- * callback */
-static void
-gpa_wizard_notebook_destroy (GtkWidget * widget, gpointer param)
-{
-  GPAWizard * wizard = param;
-
-  wizard->page_switched = NULL;
-  wizard->page_switched_data = NULL;
-}
-
-
-/* Create a new GPA Wizard.  */
-GtkWidget *
-gpa_wizard_new (GtkAccelGroup *accel_group,
-		GtkSignalFunc close_func, gpointer close_data)
-{
-  GtkWidget *vbox;
-  GtkWidget *notebook;
-  GtkWidget *hbox;
-  GtkWidget *button_box;
-  GtkWidget *button;
-
-  GPAWizard *wizard = g_malloc (sizeof (*wizard));
-  wizard->accel_group = accel_group;
-  wizard->page_switched = NULL;
-  wizard->page_switched_data = NULL;
-
-  vbox = gtk_vbox_new (FALSE, 3);
-  g_object_set_data_full (G_OBJECT (vbox), "user_data", wizard, g_free);
-
-  notebook = gtk_notebook_new ();
-  wizard->notebook = notebook;
-  gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
-  gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), FALSE);
-  gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), FALSE);
-  gtk_container_set_border_width (GTK_CONTAINER (notebook), 5);
-  /* use *_connect_after so that the callback is called after the
-     current page number has been updated so that
-     gpa_wizard_update_buttons uses the new page.  */
-  g_signal_connect_after (G_OBJECT (notebook), "switch-page",
-			  G_CALLBACK (gpa_wizard_page_switched), vbox);
-  g_signal_connect (G_OBJECT (notebook), "destroy",
-		    G_CALLBACK (gpa_wizard_notebook_destroy), wizard);
-
-  hbox = gtk_hbox_new (FALSE, 3);
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
-  gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
-  
-  button_box = gtk_hbutton_box_new ();
-  gtk_box_pack_start (GTK_BOX (hbox), button_box, TRUE, TRUE, 5);
-  gtk_button_box_set_layout (GTK_BUTTON_BOX (button_box), GTK_BUTTONBOX_END);
-  gtk_box_set_spacing (GTK_BOX (button_box), 10);
-
-  button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
-  wizard->prev_button = button;
-  gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 0);
-  g_signal_connect (G_OBJECT (button), "clicked",
-		    G_CALLBACK (gpa_wizard_prev), wizard);
-  
-  button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
-  wizard->next_button = button;
-  gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 0);
-  g_signal_connect (G_OBJECT (button), "clicked",
-		    G_CALLBACK (gpa_wizard_next), vbox);
-
-  button = gtk_button_new_from_stock (GTK_STOCK_APPLY);
-  wizard->finish_button = button;
-  gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 0);
-  g_signal_connect (G_OBJECT (button), "clicked",
-		    G_CALLBACK (gpa_wizard_next), vbox);
-
-  button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
-  wizard->close_button = button;
-  gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 5);
-  g_signal_connect (G_OBJECT (button), "clicked",
-		    G_CALLBACK (close_func), close_data);
-  gtk_widget_add_accelerator (button, "clicked", accel_group, GDK_Escape,
-			      0, 0);
-
-  button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
-  wizard->cancel_button = button;
-  gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 5);
-  g_signal_connect (G_OBJECT (button), "clicked",
-		    G_CALLBACK (close_func), close_data);
-  gtk_widget_add_accelerator (button, "clicked", accel_group, GDK_Escape,
-			      0, 0);
-
-  return vbox;
-}
-
-/* Append page_widget as a new page to the wizard. prev_label and
- * next_label are the labels to be used for the prev- and next button.
- * If they're NULL, the default values "Prev" and "Next" will be used.
- * action is a callback to be called when the user clicks the next
- * button. user_data is passed through to the callback. If the callback
- * returns FALSE, the wizard does not switch to the next page, other
- * wise it does. If action is NULL, assume a noop action that returns
- * TRUE.
- */
-void
-gpa_wizard_append_page (GtkWidget * widget, GtkWidget * page_widget,
-			gboolean is_last,
-			GPAWizardAction action, gpointer user_data)
-{
-  GPAWizard * wizard = g_object_get_data (G_OBJECT (widget), "user_data");
-  GPAWizardPage * page = g_malloc (sizeof (*page));
-
-  page->is_last = is_last;
-  page->action = action;
-  page->user_data = user_data;
-  
-  g_object_set_data_full (G_OBJECT (page_widget), "gpa_wizard_page",
-			  page, g_free);
-  gtk_notebook_append_page (GTK_NOTEBOOK (wizard->notebook), page_widget,
-			    NULL);
-}
-
-
-/* Turn to the next page of the wizard and run the page action.
- */
-void
-gpa_wizard_next_page (GtkWidget * widget)
-{
-  GPAWizard *wizard = g_object_get_data (G_OBJECT (widget), "user_data");
-  GPAWizardPage *page;
-  
-  page = gpa_wizard_get_current_page (wizard);
-  if (page->action)
-    {
-      if (!page->action(page->user_data))
-	return;
-    }
-  gtk_notebook_next_page (GTK_NOTEBOOK (wizard->notebook));
-}
-
-
-/* Turn to the next page of the wizard and don't run the page action.
-   This is used e.g. in keygenwizard.c by the action callback that is
-   invoked by the finish button to display a "wait" message.  */
-void
-gpa_wizard_next_page_no_action (GtkWidget *widget)
-{
-  GPAWizard *wizard = g_object_get_data (G_OBJECT (widget), "user_data");
-  gtk_notebook_next_page (GTK_NOTEBOOK (wizard->notebook));
-}
-
-/***/
-void gpa_wizard_set_page_switched (GtkWidget *widget,
-				   GPAWizardPageSwitchedFunc page_switched,
-				   gpointer param)
-{
-  GPAWizard *wizard = g_object_get_data (G_OBJECT (widget), "user_data");
-  wizard->page_switched = page_switched;
-  wizard->page_switched_data = param;
-}

Deleted: trunk/src/gpawizard.h
===================================================================
--- trunk/src/gpawizard.h	2008-04-24 14:55:47 UTC (rev 875)
+++ trunk/src/gpawizard.h	2008-04-24 15:50:00 UTC (rev 876)
@@ -1,46 +0,0 @@
-/* gpawizard.h  -  The GNU Privacy Assistant
- *	Copyright (C) 2000, 2001 G-N-U GmbH.
- *
- * This file is part of GPA
- *
- * GPA is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * GPA 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 General Public License for more details.
- *
- * You should have received a copy of the GNU 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 GPAWIZARD_H
-#define GPAWIZARD_H
-
-#include <gtk/gtk.h>
-
-typedef gboolean (*GPAWizardAction)(gpointer user_data);
-
-GtkWidget *gpa_wizard_new (GtkAccelGroup * accel_group,
-	                   GtkSignalFunc close_func, gpointer close_data);
-void gpa_wizard_append_page (GtkWidget * widget, GtkWidget * page_widget,
-			     gboolean is_last, GPAWizardAction action,
-                             gpointer user_data);
-
-void gpa_wizard_next_page (GtkWidget * widget);
-
-void gpa_wizard_next_page_no_action (GtkWidget * widget);
-
-typedef void (*GPAWizardPageSwitchedFunc)(GtkWidget * page_widget,
-					   gpointer param);
-void gpa_wizard_set_page_switched (GtkWidget * widget,
-				   GPAWizardPageSwitchedFunc,
-				   gpointer param);
-
-void gpa_wizard_update_buttons (GtkWidget * widget);
-
-#endif /* GPAWIZARD_H */

Modified: trunk/src/keygenwizard.c
===================================================================
--- trunk/src/keygenwizard.c	2008-04-24 14:55:47 UTC (rev 875)
+++ trunk/src/keygenwizard.c	2008-04-24 15:50:00 UTC (rev 876)
@@ -22,49 +22,43 @@
 #endif
 
 #include <sys/stat.h>
+#include <glib.h>
 #include <gtk/gtk.h>
 #include <errno.h>
 #include <gpgme.h>
+
 #include "gpa.h"
 #include "gpapastrings.h"
 #include "icons.h"
 #include "gtktools.h"
 #include "gpawidgets.h"
-#include "gpawizard.h"
 #include "qdchkpwd.h"
 #include "gpgmetools.h"
 #include "keygenwizard.h"
 
-/*
- * The key generation wizard
- *
- * New users should not be overwhelmed by too many options most of which
- * are not easily explained and will only confuse them. To solve that
- * problem we use default values for the algorithm and size of the keys
- * and we use a wizard interface to present the necessary options like
- * user id and password in a step by step manner.
- */
+/* The key generation wizard.
+ 
+   New users should not be overwhelmed by too many options most of which
+   are not easily explained and will only confuse them. To solve that
+   problem we use default values for the algorithm and size of the keys
+   and we use a wizard interface to present the necessary options like
+   user id and password in a step by step manner.  */
 
-
-/*
- * Helper functions
- */
+/* Helper functions.  */
  
-/* Return a copy of string with leading and trailing whitespace stripped */
+/* Return a copy of string with leading and trailing whitespace
+   stripped.  */
 static gchar *
-string_strip_dup (gchar * string)
+string_strip_dup (gchar *string)
 {
   return g_strstrip (g_strdup (string));
 }
 
 
-/*
- * The wizard itself
- */
+/* The wizard itself.  */
 
-
-
-typedef struct {
+typedef struct
+{
   GtkWidget *window;
   GtkWidget *wizard;
   GtkWidget *name_page;
@@ -74,43 +68,38 @@
   GtkWidget *final_page;
   GtkWidget *backup_page;
   GtkWidget *backup_dir_page;
-  GtkWidget *image_widget;
-  GtkAccelGroup *accel_group;
-  GdkPixmap *genkey_pixmap;
-  GdkPixmap *backup_pixmap;
-
+  
   GpaKeyGenWizardGenerateCb generate;
   gpointer generate_data;
 } GPAKeyGenWizard;
 
 
-/* Handler for the activate signals of several entry fields in the
- * wizard. Switch the wizard to the next page. */
-static void
-switch_to_next_page (GtkEditable *editable, gpointer user_data)
-{
-  gpa_wizard_next_page (((GPAKeyGenWizard*)user_data)->wizard);
-}
-
-/* internal API */
+/* Internal API.  */
 static gboolean gpa_keygen_wizard_generate_action (gpointer data);
 
-/*
- * The user ID pages
- */
 
+/* The user ID pages.  */
+
 static GtkWidget *
-gpa_keygen_wizard_simple_page (GPAKeyGenWizard * keygen_wizard,
-			       const gchar * description_text,
-			       const gchar * label_text)
+gpa_keygen_wizard_simple_page (GPAKeyGenWizard *keygen_wizard,
+			       const gchar *description_text,
+			       const gchar *label_text)
 {
-  GtkWidget * vbox;
-  GtkWidget * description;
-  GtkWidget * hbox;
-  GtkWidget * label;
-  GtkWidget * entry;
+  GtkWidget *align;
+  guint pt, pb, pl, pr;
+  GtkWidget *vbox;
+  GtkWidget *description;
+  GtkWidget *hbox;
+  GtkWidget *label;
+  GtkWidget *entry;
 
+  align = gtk_alignment_new (0.5, 0.5, 1, 1);
+  gtk_alignment_get_padding (GTK_ALIGNMENT (align), &pt, &pb, &pl, &pr);
+  gtk_alignment_set_padding (GTK_ALIGNMENT (align),
+			     pt + 5, pb + 5, pl + 5, pr + 5);
+
   vbox = gtk_vbox_new (FALSE, 0);
+  gtk_container_add (GTK_CONTAINER (align), vbox);
 
   description = gtk_label_new (description_text);
   gtk_box_pack_start (GTK_BOX (vbox), description, TRUE, TRUE, 0);
@@ -126,154 +115,281 @@
   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
 
   entry = gtk_entry_new ();
+  gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
   gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 5);
-  g_signal_connect (G_OBJECT (entry), "activate",
-		    G_CALLBACK (switch_to_next_page), keygen_wizard);
 
-  g_object_set_data (G_OBJECT (vbox), "gpa_keygen_entry", entry);
-  g_object_set_data (G_OBJECT (vbox), "gpa_wizard_focus_child", entry);
-  return vbox;
+  g_object_set_data (G_OBJECT (align), "gpa_keygen_entry", entry);
+  g_object_set_data (G_OBJECT (align), "gpa_wizard_focus_child", entry);
+
+  return align;
 }
 
+
 static gchar *
-gpa_keygen_wizard_simple_get_text (GtkWidget * vbox)
+gpa_keygen_wizard_simple_get_text (GtkWidget *vbox)
 {
-  GtkWidget * entry;
+  GtkWidget *entry;
 
   entry = g_object_get_data (G_OBJECT (vbox), "gpa_keygen_entry");
   return string_strip_dup ((gchar *) gtk_entry_get_text (GTK_ENTRY (entry)));
 }
 
 
+static void
+gpa_keygen_wizard_simple_grab_focus (GtkWidget *vbox)
+{
+  GtkWidget *entry;
+
+  entry = g_object_get_data (G_OBJECT (vbox), "gpa_keygen_entry");
+  gtk_widget_grab_focus (entry);
+}
+
+
+static gboolean
+name_validate_cb (GtkWidget *widget, gpointer data)
+{
+  GPAKeyGenWizard *wizard = data;
+  const gchar *name;
+
+  name = gtk_entry_get_text (GTK_ENTRY (widget));
+  while (*name && g_unichar_isspace (g_utf8_get_char (name)))
+    name = g_utf8_next_char (name);
+  gtk_assistant_set_page_complete (GTK_ASSISTANT (wizard->window),
+				   wizard->name_page, *name != '\0');
+
+  return FALSE;
+}
+
+
 static GtkWidget *
-gpa_keygen_wizard_name_page (GPAKeyGenWizard * keygen_wizard)
+keygen_wizard_name_page (GPAKeyGenWizard *wizard)
 {
-  return gpa_keygen_wizard_simple_page
-    (keygen_wizard,
-     _("Please insert your full name."
-       "\n\n"
-       "Your name will be part of the new key"
-       " to make it easier for others to identify"
-       " keys."),
+  GtkWidget *widget;
+  GtkWidget *entry;
+
+  widget = gpa_keygen_wizard_simple_page
+    (wizard,
+     _("Please insert your full name.\n\n"
+       "Your name will be part of the new key to make it easier for others"
+       " to identify keys."),
      _("Your Name:"));
+
+  entry = g_object_get_data (G_OBJECT (widget), "gpa_keygen_entry");
+  g_signal_connect (G_OBJECT (entry), "changed",
+		    G_CALLBACK (name_validate_cb), wizard);
+  return widget;
 }
 
+
 static gboolean
-gpa_keygen_wizard_name_validate (gpointer data)
+email_validate_cb (GtkWidget *widget, gpointer data)
 {
-  GPAKeyGenWizard * keygen_wizard = data;
-  gboolean result = TRUE;
-  gchar * name = gpa_keygen_wizard_simple_get_text (keygen_wizard->name_page);
+  GPAKeyGenWizard *wizard = data;
+  const gchar *email;
 
-  if (!*name)
-    {
-      /* The string is empty or consists entirely of whitespace */
-      gpa_window_error (_("Please insert your name"), keygen_wizard->window);
-      result = FALSE;
-    }
+  email = gtk_entry_get_text (GTK_ENTRY (widget));
+  while (*email && g_unichar_isspace (g_utf8_get_char (email)))
+    email = g_utf8_next_char (email);
+  gtk_assistant_set_page_complete (GTK_ASSISTANT (wizard->window),
+				   wizard->email_page, *email != '\0');
 
-  g_free (name);
-  return result;
+  /* FIXME: we should do much more checking. Best would be exactly the
+     same checks gpg does in interactive mode with --gen-key.  */
+
+  return FALSE;
 }
 
+
 static GtkWidget *
-gpa_keygen_wizard_email_page (GPAKeyGenWizard * keygen_wizard)
+keygen_wizard_email_page (GPAKeyGenWizard *wizard)
 {
-  return gpa_keygen_wizard_simple_page
-    (keygen_wizard,
-     _("Please insert your email address."
-       "\n\n"
-       " Your email address will be part of the"
-       " new key to make it easier for others to"
-       " identify keys."
-       " If you have several email addresses, you can add further email"
-       " adresses later."),
+  GtkWidget *widget;
+  GtkWidget *entry;
+
+  widget = gpa_keygen_wizard_simple_page
+    (wizard,
+     _("Please insert your email address.\n\n"
+       "Your email address will be part of the new key to make it easier"
+       " for others to identify keys. If you have several email addresses,"
+       " you can add further email adresses later."),
      _("Your Email Address:"));
+
+  entry = g_object_get_data (G_OBJECT (widget), "gpa_keygen_entry");
+  g_signal_connect (G_OBJECT (entry), "changed",
+		    G_CALLBACK (email_validate_cb), wizard);
+  return widget;
 }
 
 
+/* Handler for the activate signal of the passphrase entry.  Focus the
+   repeat passhrase entry.  */
+static void
+focus_repeat_passphrase (GtkEditable *editable, gpointer user_data)
+{
+  gtk_widget_grab_focus ((GtkWidget *) user_data);
+}
+
+
 static gboolean
-gpa_keygen_wizard_email_validate (gpointer data)
+passwd_validate_cb (GtkWidget *widget, gpointer data)
 {
-  GPAKeyGenWizard * keygen_wizard = data;
+  GPAKeyGenWizard *wizard = data;
   gboolean result = TRUE;
-  gchar * email;
+  GtkWidget *page;
+  const gchar *passwd;
+  const gchar *passwd_repeat;
+  GtkWidget *entry;
+  GtkWidget *status;
+  char textbuf[50];
+  double quality;
 
-  email = gpa_keygen_wizard_simple_get_text (keygen_wizard->email_page); 
-  if (!*email)
+  page = wizard->passwd_page;
+  entry = g_object_get_data (G_OBJECT (page), "gpa_keygen_passwd");
+  passwd = gtk_entry_get_text (GTK_ENTRY (entry));
+  entry = g_object_get_data (G_OBJECT (page), "gpa_keygen_passwd_repeat");
+  passwd_repeat = gtk_entry_get_text (GTK_ENTRY (entry));
+
+  if (*passwd == '\0' && *passwd_repeat == '\0')
     {
-      /* The string is empty or consists entirely of whitespace */
-      gpa_window_error (_("Please insert your email address"),
-			keygen_wizard->window);
+      status = g_object_get_data (G_OBJECT (page), "gpa_keygen_passwd_differ");
+      gtk_widget_hide (status);
+
+      status = g_object_get_data (G_OBJECT (page),
+				  "gpa_keygen_passwd_strength");
+      gtk_widget_hide (status);
+
       result = FALSE;
     }
-  /* FIXME: we should do much more checking. Best would be exactly the
-   * same checks gpg does in interactive mode with --gen-key */
+  else
+    {
+      status = g_object_get_data (G_OBJECT (page), "gpa_keygen_passwd_differ");
+      if (! strcmp (passwd, passwd_repeat))
+	gtk_widget_hide (status);
+      else
+	{
+	  gtk_widget_show (status);
+	  result = FALSE;
+	}
+    }
 
-  g_free (email);
-  return result;
-}
+  quality = 0;
+  if (*passwd != '\0')
+    quality = qdchkpwd (passwd);
+  if (quality > 1)
+    quality = 1;
+  status = g_object_get_data (G_OBJECT (page),
+			      "gpa_keygen_passwd_strength");
+  if (quality < 0.6)
+    {
+      snprintf (textbuf, sizeof textbuf, "(%d%%)", (int) (quality * 100));
+      gtk_widget_show (status);
+    }
+  else
+    {
+      snprintf (textbuf, sizeof textbuf, "%d%%", (int) (quality * 100));
+      gtk_widget_hide (status);
+    }
 
+  status = g_object_get_data (G_OBJECT (page), "gpa_keygen_quality");
+  gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (status), quality);
+  gtk_progress_bar_set_text (GTK_PROGRESS_BAR (status), textbuf);
 
-/* Handler for the activate signal of the passphrase entry. Focus the
- * repeat passhrase entry. */
-static void
-focus_repeat_passphrase (GtkEditable *editable, gpointer user_data)
-{
-  gtk_widget_grab_focus ((GtkWidget*)user_data);
+  gtk_assistant_set_page_complete (GTK_ASSISTANT (wizard->window),
+				   page, result);
+
+  return FALSE;
 }
 
 
-
 static GtkWidget *
-gpa_keygen_wizard_password_page (GPAKeyGenWizard * keygen_wizard)
+keygen_wizard_passwd_page (GPAKeyGenWizard *wizard)
 {
-  GtkWidget * vbox;
-  GtkWidget * description;
-  GtkWidget * table;
-  GtkWidget * label;
-  GtkWidget * entry, *passwd_entry;
+  GtkWidget *vbox;
+  GtkWidget *description;
+  GtkWidget *status;
+  GtkWidget *table;
+  GtkWidget *align;
+  GtkWidget *label;
+  GtkWidget *entry;
+  GtkWidget *passwd_entry;
 
   vbox = gtk_vbox_new (FALSE, 0);
 
   description = gtk_label_new
     (_("Please choose a passphrase for the new key."));
-  gtk_box_pack_start (GTK_BOX (vbox), description, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (vbox), description, FALSE, FALSE, 5);
   gtk_misc_set_alignment (GTK_MISC (description), 0.0, 0.0);
   gtk_label_set_line_wrap (GTK_LABEL (description), TRUE);
   gtk_label_set_justify (GTK_LABEL (description), GTK_JUSTIFY_LEFT);
 
-  table = gtk_table_new (2, 2, FALSE);
-  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 5);
 
-  label = gtk_label_new (_("Passphrase: "));
+  status = gtk_label_new (_("In \"Passphrase\" and \"Repeat passphrase\","
+			    " you must enter the same passphrase."));
+  gtk_box_pack_start (GTK_BOX (vbox), status, FALSE, FALSE, 5);
+  gtk_misc_set_alignment (GTK_MISC (status), 0.0, 0.0);
+  gtk_label_set_line_wrap (GTK_LABEL (status), TRUE);
+  gtk_label_set_justify (GTK_LABEL (status), GTK_JUSTIFY_LEFT);
+  g_object_set_data (G_OBJECT (vbox), "gpa_keygen_passwd_differ", status);
+
+
+  status = gtk_label_new (_("Warning: The passphrase you have entered is"
+			    " not very secure."));
+  gtk_box_pack_start (GTK_BOX (vbox), status, FALSE, FALSE, 5);
+  gtk_misc_set_alignment (GTK_MISC (status), 0.0, 0.0);
+  gtk_label_set_line_wrap (GTK_LABEL (status), TRUE);
+  gtk_label_set_justify (GTK_LABEL (status), GTK_JUSTIFY_LEFT);
+  g_object_set_data (G_OBJECT (vbox), "gpa_keygen_passwd_strength", status);
+
+
+  align = gtk_alignment_new (0, 1, 1, 0);
+  gtk_box_pack_start (GTK_BOX (vbox), align, TRUE, TRUE, 5);
+
+  table = gtk_table_new (2, 3, FALSE);
+  gtk_container_add (GTK_CONTAINER (align), table);
+
+  label = gtk_label_new (_("Quality: "));
   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, 0, 0, 0);
   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
 
-  entry = passwd_entry = gtk_entry_new ();
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
+  status = gtk_progress_bar_new ();
+  gtk_table_attach (GTK_TABLE (table), status, 1, 2, 0, 1, GTK_FILL, 0, 0, 0);
+  g_object_set_data (G_OBJECT (vbox), "gpa_keygen_quality", status);
+
+  label = gtk_label_new (_("Passphrase: "));
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, 0, 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+
+  entry = gtk_entry_new ();
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
 		    GTK_FILL|GTK_EXPAND, 0, 0, 0);
   gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
   g_object_set_data (G_OBJECT (vbox), "gpa_keygen_passwd", entry);
   g_object_set_data (G_OBJECT (vbox), "gpa_wizard_focus_child", entry);
+  passwd_entry = entry;
 
   label = gtk_label_new (_("Repeat Passphrase: "));
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, 0, 0, 0);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_FILL, 0, 0, 0);
   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
 
   entry = gtk_entry_new ();
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
 		    GTK_FILL|GTK_EXPAND, 0, 0, 0);
   gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
+  gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
   g_object_set_data (G_OBJECT (vbox), "gpa_keygen_passwd_repeat", entry);
-  g_signal_connect (G_OBJECT (entry), "activate",
-		    G_CALLBACK (switch_to_next_page), keygen_wizard);
+
   g_signal_connect (G_OBJECT (passwd_entry), "activate",
-		    G_CALLBACK (focus_repeat_passphrase), entry);
+  		    G_CALLBACK (focus_repeat_passphrase), entry);
 
+  g_signal_connect (G_OBJECT (passwd_entry), "changed",
+  		    G_CALLBACK (passwd_validate_cb), wizard);
+  g_signal_connect (G_OBJECT (entry), "changed",
+  		    G_CALLBACK (passwd_validate_cb), wizard);
+
   return vbox;
 }
 
+
 static gchar *
 gpa_keygen_wizard_password_get_password (GtkWidget * vbox)
 {
@@ -281,73 +397,14 @@
   return (gchar *) gtk_entry_get_text (GTK_ENTRY (entry));
 }
 
-/* Validate the password in both entries and return TRUE if they're OK,
- * otherwise show a suitable message to the user and return FALSE.
- */
-/* FIXME: We should add some checks for whitespace because leading and
- * trailing whitespace is stripped somewhere in gpapa/gpg and whitespace
- * only passwords are not allowed */
-static gboolean
-gpa_keygen_wizard_password_validate (gpointer data)
-{
-  GPAKeyGenWizard *keygen_wizard = data;
-  gboolean result = TRUE;
-  GtkWidget *vbox = keygen_wizard->passwd_page;
-  GtkWidget *entry_passwd = g_object_get_data (G_OBJECT (vbox),
-					       "gpa_keygen_passwd");
-  GtkWidget *entry_repeat = g_object_get_data (G_OBJECT (vbox),
-					       "gpa_keygen_passwd_repeat");
 
-  if (strcmp (gtk_entry_get_text (GTK_ENTRY (entry_passwd)),
-	      gtk_entry_get_text (GTK_ENTRY (entry_repeat))) != 0)
-    {
-      gpa_window_error (_("In \"Passphrase\" and \"Repeat passphrase\",\n"
-                          "you must enter the same passphrase."),
-			  keygen_wizard->window);
-      result = FALSE;
-    }
-  else if (strlen (gtk_entry_get_text (GTK_ENTRY (entry_passwd))) == 0)
-    {
-      gpa_window_error (_("You did not enter a passphrase.\n"
-                          "It is needed to protect your private key."),
-			  keygen_wizard->window);
-      result = FALSE;
-    }
-  else if (strlen (gtk_entry_get_text (GTK_ENTRY (entry_passwd))) < 10
-           || qdchkpwd ((char*)gtk_entry_get_text (GTK_ENTRY (entry_passwd))) < 0.6)
-    {
-      GtkWidget *dialog;
-      
-      dialog = gtk_message_dialog_new (GTK_WINDOW (keygen_wizard->window),
-                                       GTK_DIALOG_MODAL,
-                                       GTK_MESSAGE_WARNING,
-                                       GTK_BUTTONS_NONE,
-                                       _("Warning: You have entered a "
-                                         "passphrase\n"
-                                         "that is obviously not secure.\n\n"
-                                         "Please enter a new passphrase."));
-      gtk_dialog_add_buttons (GTK_DIALOG (dialog), 
-                              _("_Enter new passphrase"), GTK_RESPONSE_CANCEL,
-                              _("Take this one _anyway"), GTK_RESPONSE_OK,
-                              NULL);
-      if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
-        {
-          result = FALSE;
-        }
-      gtk_widget_destroy (dialog);
-    }
-
-  return result;
-}
-
-
-/* Backup copies and revocation certificate */
+/* Backup copies and revocation certificate.  */
 static GtkWidget *
-gpa_keygen_wizard_backup_page (GPAKeyGenWizard * keygen_wizard)
+gpa_keygen_wizard_backup_page (GPAKeyGenWizard *wizard)
 {
-  GtkWidget * vbox;
-  GtkWidget * description;
-  GtkWidget * radio;
+  GtkWidget *vbox;
+  GtkWidget *description;
+  GtkWidget *radio;
   
   vbox = gtk_vbox_new (FALSE, 0);
 
@@ -371,11 +428,12 @@
   return vbox;
 }
 
+
 static GtkWidget *
-gpa_keygen_wizard_message_page (const gchar * description_text)
+gpa_keygen_wizard_message_page (const gchar *description_text)
 {
-  GtkWidget * vbox;
-  GtkWidget * description;
+  GtkWidget *vbox;
+  GtkWidget *description;
 
   vbox = gtk_vbox_new (FALSE, 0);
 
@@ -390,7 +448,7 @@
 
 
 static GtkWidget *
-gpa_keygen_wizard_wait_page (void)
+gpa_keygen_wizard_wait_page (GPAKeyGenWizard *wizard)
 {
   return gpa_keygen_wizard_message_page
     (_("Your key is being generated.\n\n"
@@ -399,7 +457,7 @@
 
 
 static GtkWidget *
-gpa_keygen_wizard_final_page (void)
+gpa_keygen_wizard_final_page (GPAKeyGenWizard * keygen_wizard)
 {
   return gpa_keygen_wizard_message_page
     (_("Congratulations!\n\n"
@@ -409,44 +467,37 @@
 
 
 /* Extract the values the user entered and call gpa_generate_key.
- * Return TRUE if the key was created successfully.
- */
+   Return TRUE if the key was created successfully.  */
 static gboolean
 gpa_keygen_wizard_generate_action (gpointer data)
+//GtkAssistant *assistant, GtkWidget *page, gpointer data)
 {
-  GPAKeyGenWizard *keygen_wizard = data;
+  GPAKeyGenWizard *wizard = data;
   GPAKeyGenParameters params;
   gboolean do_backup;
   GtkWidget *radio;
 
   memset (&params, 0, sizeof params);
 
-  /* Shall we make backups? */
-  radio = g_object_get_data (G_OBJECT (keygen_wizard->backup_page),
+  /* Shall we make backups?  */
+  radio = g_object_get_data (G_OBJECT (wizard->backup_page),
 			     "gpa_keygen_backup");
   do_backup = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio));
 
-  /* The User ID */
-  params.userID = gpa_keygen_wizard_simple_get_text (keygen_wizard->name_page);
-  params.email = gpa_keygen_wizard_simple_get_text (keygen_wizard->email_page);
-  params.password = gpa_keygen_wizard_password_get_password (keygen_wizard
-                                                             ->passwd_page);
+  /* The User ID.  */
+  params.userID = gpa_keygen_wizard_simple_get_text (wizard->name_page);
+  params.email = gpa_keygen_wizard_simple_get_text (wizard->email_page);
+  params.password
+    = gpa_keygen_wizard_password_get_password (wizard->passwd_page);
 
-  /* default values for newbie mode */
+  /* Default values for newbie mode.  */
   params.algo = GPA_KEYGEN_ALGO_DSA_ELGAMAL;
   params.keysize = 1024;
   params.expiryDate = NULL;
   params.interval = 0;
 
-  /* Switch to the next page showing the "wait" message. */
-  gpa_wizard_next_page_no_action (keygen_wizard->wizard);
+  wizard->generate (&params, do_backup, wizard->generate_data);
 
-  /* Handle some events so that the page is correctly displayed */
-  while (gtk_events_pending())
-    gtk_main_iteration();
-
-  keygen_wizard->generate (&params, do_backup, keygen_wizard->generate_data);
-
   g_free (params.userID);
   g_free (params.email);
 
@@ -457,50 +508,42 @@
 
 /* Handler for the close button. Destroy the main window */
 static void
-gpa_keygen_wizard_close (GtkWidget * widget, gpointer param)
+keygen_wizard_close (GtkWidget *widget, gpointer param)
 {
-  GPAKeyGenWizard * wizard = param;
+  GPAKeyGenWizard *wizard = param;
 
   gtk_widget_destroy (wizard->window);
 }
 
 
-/* handler for the destroy signal. */
 static void
-gpa_keygen_wizard_destroy (GtkWidget *widget, gpointer param)
-{
-}
-
-
-static void
 free_keygen_wizard (gpointer data)
 {
-  GPAKeyGenWizard * keygen_wizard = data;
+  GPAKeyGenWizard *keygen_wizard = data;
 
-  g_object_unref (keygen_wizard->genkey_pixmap);
-  g_object_unref (keygen_wizard->backup_pixmap);
   g_free (keygen_wizard);
 }
 
 
-static void
-page_switched (GtkWidget * page, gpointer data)
+void
+keygen_wizard_prepare_cb (GtkAssistant *assistant, GtkWidget *page,
+			  gpointer data)
 {
-  GPAKeyGenWizard * keygen_wizard = data;
-  GdkPixmap * pixmap;
+  GPAKeyGenWizard *wizard = data;
 
-  if (page == keygen_wizard->backup_page
-      || page == keygen_wizard->backup_dir_page)
+  if (page == wizard->name_page || page == wizard->email_page)
+    gpa_keygen_wizard_simple_grab_focus (page);
+  else if (page == wizard->passwd_page)
     {
-      pixmap = keygen_wizard->backup_pixmap;
+      GtkWidget *entry;
+      entry = g_object_get_data (G_OBJECT (page), "gpa_keygen_passwd");
+      gtk_widget_grab_focus (entry);
+
+      /* FIXME: Update.  */
+      passwd_validate_cb (NULL, wizard);
     }
-  else
-    {
-      pixmap = keygen_wizard->genkey_pixmap;
-    }
-
-  gtk_image_set_from_pixmap (GTK_IMAGE (keygen_wizard->image_widget),
-			     pixmap, NULL);
+  else if (page == wizard->wait_page)
+    gpa_keygen_wizard_generate_action (wizard);
 }
 
 
@@ -509,94 +552,114 @@
 		       GpaKeyGenWizardGenerateCb generate_action,
 		       gpointer data)
 {
+  GPAKeyGenWizard *wizard;
   GtkWidget *window;
-  GtkWidget *wizard;
-  GtkWidget *hbox;
-  GtkWidget *image_widget;
-  GtkAccelGroup *accel_group;
-  GPAKeyGenWizard *keygen_wizard;
+  GdkPixbuf *genkey_pixbuf;
+  GdkPixbuf *backup_pixbuf;
+  
 
-  keygen_wizard = g_malloc (sizeof (*keygen_wizard));
-  keygen_wizard->genkey_pixmap = gpa_create_icon_pixmap (parent,
-							 "wizard_genkey",
-							 NULL);
-  keygen_wizard->backup_pixmap = gpa_create_icon_pixmap (parent,
-							 "wizard_backup",
-							 NULL);
+  wizard = g_malloc (sizeof (*wizard));
+  genkey_pixbuf = gpa_create_icon_pixbuf ("wizard_genkey");
+  backup_pixbuf = gpa_create_icon_pixbuf ("wizard_backup");
 
-  keygen_wizard->generate = generate_action;
-  keygen_wizard->generate_data = data;
+  wizard->generate = generate_action;
+  wizard->generate_data = data;
 
-  accel_group = gtk_accel_group_new ();
-  keygen_wizard->accel_group = accel_group;
 
-  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  keygen_wizard->window = window;
-  gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
+  window = gtk_assistant_new ();
+  wizard->window = window;
   gtk_window_set_title (GTK_WINDOW (window), _("Generate key"));
-  gtk_container_set_border_width (GTK_CONTAINER (window), 5);
   g_object_set_data_full (G_OBJECT (window), "user_data",
-			  keygen_wizard, free_keygen_wizard);
-  g_signal_connect_swapped (G_OBJECT (window), "destroy",
-			    G_CALLBACK (gpa_keygen_wizard_destroy),
-			    keygen_wizard);
+			  wizard, free_keygen_wizard);
 
-  hbox = gtk_hbox_new (FALSE, 5);
-  gtk_container_add (GTK_CONTAINER (window), hbox);
+  /* Set the forward button to be the default.  */
+  GTK_WIDGET_SET_FLAGS (GTK_ASSISTANT (window)->forward, GTK_CAN_DEFAULT);
+  gtk_window_set_default (GTK_WINDOW (window), GTK_ASSISTANT (window)->forward);
 
-  image_widget = gtk_image_new_from_pixmap
-    (keygen_wizard->genkey_pixmap, NULL);
-  keygen_wizard->image_widget = image_widget;
-  gtk_box_pack_start (GTK_BOX (hbox), image_widget, FALSE, TRUE, 0);
-  
-  wizard = gpa_wizard_new (accel_group,
-                           (GtkSignalFunc) gpa_keygen_wizard_close,
-			   (GtkSignalFunc) keygen_wizard);
-  keygen_wizard->wizard = wizard;
-  gtk_box_pack_start (GTK_BOX (hbox), wizard, TRUE, TRUE, 0);
-  gpa_wizard_set_page_switched (wizard, page_switched, keygen_wizard);
+  wizard->name_page = keygen_wizard_name_page (wizard);
+  gtk_assistant_append_page (GTK_ASSISTANT (window), wizard->name_page);
+  gtk_assistant_set_page_type (GTK_ASSISTANT (window), wizard->name_page,
+			       GTK_ASSISTANT_PAGE_CONTENT);
+  gtk_assistant_set_page_title (GTK_ASSISTANT (window), wizard->name_page,
+				/* FIXME */ _("Generate key"));
+  gtk_assistant_set_page_side_image (GTK_ASSISTANT (window), wizard->name_page,
+				     genkey_pixbuf);
 
-  keygen_wizard->name_page = gpa_keygen_wizard_name_page (keygen_wizard);
-  gpa_wizard_append_page (wizard, keygen_wizard->name_page,
-			  FALSE,
-			  gpa_keygen_wizard_name_validate, keygen_wizard);
 
-  keygen_wizard->email_page = gpa_keygen_wizard_email_page (keygen_wizard);
-  gpa_wizard_append_page (wizard, keygen_wizard->email_page,
-			  FALSE,
-			  gpa_keygen_wizard_email_validate, keygen_wizard);
+  wizard->email_page = keygen_wizard_email_page (wizard);
+  gtk_assistant_append_page (GTK_ASSISTANT (window), wizard->email_page);
+  gtk_assistant_set_page_type (GTK_ASSISTANT (window), wizard->email_page,
+			       GTK_ASSISTANT_PAGE_CONTENT);
+  gtk_assistant_set_page_title (GTK_ASSISTANT (window), wizard->email_page,
+				/* FIXME */ _("Generate key"));
+  gtk_assistant_set_page_side_image (GTK_ASSISTANT (window), wizard->email_page,
+				     genkey_pixbuf);
 
-  keygen_wizard->passwd_page = gpa_keygen_wizard_password_page (keygen_wizard);
-  gpa_wizard_append_page (wizard, keygen_wizard->passwd_page,
-			  FALSE, gpa_keygen_wizard_password_validate,
-			  keygen_wizard);
 
-  keygen_wizard->backup_page = gpa_keygen_wizard_backup_page (keygen_wizard);
-  gpa_wizard_append_page (wizard, keygen_wizard->backup_page,
-			  TRUE,
-			  gpa_keygen_wizard_generate_action, keygen_wizard);
+  wizard->passwd_page = keygen_wizard_passwd_page (wizard);
+  gtk_assistant_append_page (GTK_ASSISTANT (window), wizard->passwd_page);
+  gtk_assistant_set_page_type (GTK_ASSISTANT (window), wizard->passwd_page,
+			       GTK_ASSISTANT_PAGE_CONTENT);
+  gtk_assistant_set_page_title (GTK_ASSISTANT (window), wizard->passwd_page,
+				/* FIXME */ _("Generate key"));
+  gtk_assistant_set_page_side_image (GTK_ASSISTANT (window),
+				     wizard->passwd_page, genkey_pixbuf);
 
-  /* Don't use F as the accelerator in "Finish" because Meta-F is
-   * already bound in the entry widget */
 
-  keygen_wizard->wait_page = gpa_keygen_wizard_wait_page ();
-  gpa_wizard_append_page (wizard, keygen_wizard->wait_page,
-			  TRUE, NULL, NULL);
+  /* FIXME: A better GUI would have a "Generate backup" button on the
+     finish page after the key was generated.  */
+  wizard->backup_page = gpa_keygen_wizard_backup_page (wizard);
+  gtk_assistant_append_page (GTK_ASSISTANT (window), wizard->backup_page);
+  gtk_assistant_set_page_type (GTK_ASSISTANT (window), wizard->backup_page,
+			       GTK_ASSISTANT_PAGE_CONTENT);
+  gtk_assistant_set_page_title (GTK_ASSISTANT (window), wizard->backup_page,
+				/* FIXME */ _("Generate key"));
+  gtk_assistant_set_page_side_image (GTK_ASSISTANT (window),
+				     wizard->backup_page,
+				     backup_pixbuf);
+  gtk_assistant_set_page_complete (GTK_ASSISTANT (wizard->window),
+				   wizard->backup_page, TRUE);
 
-  keygen_wizard->final_page = gpa_keygen_wizard_final_page ();
-  gpa_wizard_append_page (wizard, keygen_wizard->final_page,
-			  TRUE, NULL, NULL);
 
+  /* FIXME: We need to integrate the progress bar for the operation
+     into the page.  Also, after the operation completes, the
+     assistant is destroyed, so the final page will never be
+     shown.  The whole thing is upside down, and should be redone.  */
+  wizard->wait_page = gpa_keygen_wizard_wait_page (wizard);
+  gtk_assistant_append_page (GTK_ASSISTANT (window), wizard->wait_page);
+  gtk_assistant_set_page_type (GTK_ASSISTANT (window), wizard->wait_page,
+			       GTK_ASSISTANT_PAGE_PROGRESS);
+  gtk_assistant_set_page_title (GTK_ASSISTANT (window), wizard->wait_page,
+				/* FIXME */ _("Generate key"));
+  gtk_assistant_set_page_side_image (GTK_ASSISTANT (window), wizard->wait_page,
+				     genkey_pixbuf);
+
+  /* The final page does not contain information about the generated
+     key.  It should also offer a "generate backup" button, then the
+     backup page can be removed.  */
+  wizard->final_page = gpa_keygen_wizard_final_page (wizard);
+  gtk_assistant_append_page (GTK_ASSISTANT (window), wizard->final_page);
+  gtk_assistant_set_page_type (GTK_ASSISTANT (window), wizard->final_page,
+			       GTK_ASSISTANT_PAGE_SUMMARY);
+  gtk_assistant_set_page_title (GTK_ASSISTANT (window), wizard->final_page,
+				/* FIXME */ _("Generate key"));
+  gtk_assistant_set_page_side_image (GTK_ASSISTANT (window), wizard->final_page,
+				     genkey_pixbuf);
+
+  g_signal_connect (G_OBJECT (window), "prepare",
+		    G_CALLBACK (keygen_wizard_prepare_cb), wizard);
+  g_signal_connect (G_OBJECT (window), "close",
+		    G_CALLBACK (keygen_wizard_close), wizard);
+  g_signal_connect (G_OBJECT (window), "cancel",
+		    G_CALLBACK (keygen_wizard_close), wizard);
+
+
   gtk_window_set_modal (GTK_WINDOW (window), TRUE);
   gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (parent));
   gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER_ON_PARENT);
 
-  /* FIXME: This is a kludge to make sure that the proper buttons are shown
-   * (must be done after the show_all). All this should be fixed properly
-   * some day */
-  gpa_wizard_update_buttons (wizard);
+  g_object_unref (genkey_pixbuf);
+  g_object_unref (backup_pixbuf);
 
   return window;
 }
-  
-



More information about the Gpa-commits mailing list