Index: docs/reference/gtk/migrating-GtkAssistant.sgml
===================================================================
RCS file: docs/reference/gtk/migrating-GtkAssistant.sgml
diff -N docs/reference/gtk/migrating-GtkAssistant.sgml
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ docs/reference/gtk/migrating-GtkAssistant.sgml	24 Jan 2006 02:36:55 -0000
@@ -0,0 +1,170 @@
+<chapter id="gtk-migrating-GtkAssistant">
+  <chapterinfo>
+    <author>
+      <firstname>Carlos</firstname>
+      <surname>Garnacho</surname>
+      <affiliation>
+	<address>
+	  <email>carlosg@gnome.org</email>
+	</address>
+      </affiliation>
+    </author>
+  </chapterinfo>
+
+  <title>Migrating from GnomeDruid to GtkAssistant</title>
+
+  <para>
+    Since version 2.10, GTK+ provides the GtkAssistant widget as a replacement
+    for the <structname>GnomeDruid</structname> widget in the libgnomeui library.
+  </para>
+
+  <para>
+    Conceptually, both <structname>GtkAssistant</structname> and <structname>GnomeDruid</structname>
+    do the same task, but there are several areas where the API has been completely
+    redesigned, so this chapter covers the main changes between both widgets.
+  </para>
+
+  <section id="inserting-pages">
+    <title>Inserting pages</title>
+
+    <para>
+      <structname>GnomeDruid</structname> was implemented as a container for
+	 <structname>GnomeDruidPage</structname> abstract objects, which are implemented by the
+	 <structname>GnomeDruidPageEdge</structname> and <structname>GnomeDruidPageStandard</structname>
+	 widgets. Instead, <structname>GtkAssistant</structname> allows any widget to be a page, and implements
+	 per-page settings (such as page type or title) as child properties. So instead of:
+    </para>
+
+    <programlisting>
+/* Page 1 */
+page = gnome_druid_page_edge_new (GNOME_EDGE_START);
+gnome_druid_page_edge_set_test (GNOME_DRUID_PAGE_EDGE (page),
+                                "Welcome to the assistant, it will make your life easier");
+gtk_widget_show (page);
+gnome_druid_append_page (GNOME_DRUID (druid), GNOME_DRUID_PAGE (page));
+
+/* Page 2 */
+page = gnome_druid_page_standard_new ();
+gtk_container_add (GTK_CONTAINER (GNOME_DRUID_PAGE_STANDARD (page)->vbox,
+                   create_page1 ());
+gtk_widget_show_all (page);
+gnome_druid_append_page (GNOME_DRUID (druid), GNOME_DRUID_PAGE (page));
+
+/* Page 3 */
+page = gnome_druid_page_edge_new (GNOME_EDGE_FINISH);
+gnome_druid_page_edge_set_test (GNOME_DRUID_PAGE_EDGE (page),
+                                "Now you are done, your life is easier");
+gtk_widget_show (page);
+gnome_druid_append_page (GNOME_DRUID (druid), GNOME_DRUID_PAGE (page));
+    </programlisting>
+
+    <para>
+      You have to write:
+    </para>
+
+    <programlisting>
+gtk_assistant_append_page (GTK_ASSISTANT (assistant),
+                           gtk_label_new ("Welcome to the assistant, it will make your life easier"));
+gtk_assistant_append_page (GTK_ASSISTANT (assistant),
+                           create_page1 ());
+gtk_assistant_append_page (GTK_ASSISTANT (assistant),
+                           gtk_label_new ("Now you are done, your life is easier");
+    </programlisting>
+  </section>
+
+  <section id="decorating-the-assistant-pages">
+    <title>Decorating the assistant pages</title>
+
+    <para>
+      To decorate your assistant pages, <structname>GtkAssistant</structname> provides similar functions
+	 to <structname>GnomeDruid</structname>, so you have to transform code like this:
+    </para>
+
+    <programlisting>
+gnome_druid_page_edge_set_title (GNOME_DRUID_PAGE_EDGE (page), "Welcome");
+gnome_druid_page_edge_set_logo (GNOME_DRUID_PAGE_EDGE (page), logo_pixbuf);
+gnome_druid_page_edge_set_watermark (GNOME_DRUID_PAGE_EDGE (page), watermark_pixbuf);
+    </programlisting>
+
+    <para>
+    Into this:
+    </para>
+
+    <programlisting>
+gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page_widget, "Welcome");
+gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant), page_widget, logo_pixbuf);
+gtk_assistant_set_page_side_image (GTK_ASSISTANT (assistant), page_widget, watermark_pixbuf);
+    </programlisting>
+
+    <para>
+      Where page_widget is the widget used as a page.
+    </para>
+  </section>
+
+  <section id="setting-the-page-flow">
+    <title>Setting the page flow</title>
+
+    <para>
+      Here is the area where <structname>GtkAssistant</structname> and <structname>GnomeDruid</structname>
+	 differ the most. While <structname>GnomeDruid</structname> used the "next" and "back" signals from the 
+	 <structname>GnomeDruidPage</structname>, <structname>GtkAssistant</structname> uses the following
+	 techniques:
+    </para>
+
+    <itemizedlist>
+      <listitem>
+	   <para>gtk_assistant_set_forward_page_func (): Allows to define a GtkAssistantPageFunc to let the
+	   assistant know which will be the following page given the current page.</para>
+      </listitem>
+      <listitem>
+	   <para>gtk_assistant_set_page_complete (): Lets the assistant know whether the specified page is complete
+	   or not, updating buttons state accordingly.</para>
+      </listitem>
+      <listitem>
+	   <para>gtk_assistant_set_page_type (): Lets the assistant know the page role and update the buttons
+	   state accordingly. Pages can have the following roles:</para>
+	   <simplelist>
+	     <member>Intro</member>
+		<member>Content</member>
+		<member>Progress</member>
+		<member>Confirmation</member>
+		<member>Summary</member>
+	   </simplelist>
+      </listitem>
+    </itemizedlist>
+
+    <para>
+      A sample GtkAssistantPageFunc could look like this:
+    </para>
+
+    <programlisting>
+static gint
+forward_page_function (gint     current_page,
+                       gpointer data)
+{
+  switch (current_page)
+    {
+    case 0:
+      return 1;
+    case 1:
+      if (check_page1_data ())
+	   return 2;
+	 else
+	   return 3;
+    case 2:
+      return 3;
+    default:
+      return -1;
+    }
+}
+    </programlisting>
+
+  </section>
+</chapter>
+
+<!--
+Local variables:
+mode: sgml
+sgml-parent-document: ("gtk-docs.sgml" "book" "part" "chapter")
+End:
+-->
Index: docs/reference/gtk/Makefile.am
===================================================================
RCS file: /cvs/gnome/gtk+/docs/reference/gtk/Makefile.am,v
retrieving revision 1.89
diff -u -r1.89 Makefile.am
--- docs/reference/gtk/Makefile.am	15 Jan 2006 04:44:25 -0000	1.89
+++ docs/reference/gtk/Makefile.am	24 Jan 2006 02:36:56 -0000
@@ -106,6 +106,7 @@
 	migrating-GtkIconView.sgml		\
 	migrating-GtkAboutDialog.sgml		\
 	migrating-GtkColorButton.sgml		\
+	migrating-GtkAssistant.sgml		\
 	objects_grouped.sgml			\
 	question_index.sgml			\
 	resources.sgml				\
@@ -126,6 +127,7 @@
 	migrating-GtkIconView.sgml		\
 	migrating-GtkAboutDialog.sgml		\
 	migrating-GtkColorButton.sgml		\
+	migrating-GtkAssistant.sgml		\
 	tree_widget.sgml			\
 	text_widget.sgml			\
 	question_index.sgml
Index: docs/reference/gtk/gtk-docs.sgml
===================================================================
RCS file: /cvs/gnome/gtk+/docs/reference/gtk/gtk-docs.sgml,v
retrieving revision 1.86
diff -u -r1.86 gtk-docs.sgml
--- docs/reference/gtk/gtk-docs.sgml	18 Jan 2006 22:39:14 -0000	1.86
+++ docs/reference/gtk/gtk-docs.sgml	24 Jan 2006 02:36:56 -0000
@@ -198,6 +198,7 @@
 <!ENTITY gtk-migrating-GtkIconView SYSTEM "xml/migrating-GtkIconView.sgml">
 <!ENTITY gtk-migrating-GtkAboutDialog SYSTEM "xml/migrating-GtkAboutDialog.sgml">
 <!ENTITY gtk-migrating-GtkColorButton SYSTEM "xml/migrating-GtkColorButton.sgml">
+<!ENTITY gtk-migrating-GtkAssistant SYSTEM "xml/migrating-GtkAssistant.sgml">
 <!ENTITY version SYSTEM "version.xml">
 <!ENTITY gtk-query-immodules SYSTEM "gtk-query-immodules-2.0.xml">
 <!ENTITY gtk-update-icon-cache SYSTEM "gtk-update-icon-cache.xml">
@@ -587,6 +588,7 @@
     &gtk-migrating-GtkIconView;
     &gtk-migrating-GtkAboutDialog;
     &gtk-migrating-GtkColorButton;
+    &gtk-migrating-GtkAssistant;
   </part>
 
   <part>
Index: gtk/gtkassistant.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkassistant.c,v
retrieving revision 1.3
diff -u -r1.3 gtkassistant.c
--- gtk/gtkassistant.c	21 Jan 2006 06:15:30 -0000	1.3
+++ gtk/gtkassistant.c	24 Jan 2006 02:36:58 -0000
@@ -91,6 +91,8 @@
 						  GdkEventAny       *event);
 static gboolean gtk_assistant_expose             (GtkWidget         *widget,
 						  GdkEventExpose    *event);
+static gboolean gtk_assistant_focus              (GtkWidget         *widget,
+						  GtkDirectionType   direction);
 static void     gtk_assistant_add                (GtkContainer      *container,
 						  GtkWidget         *page);
 static void     gtk_assistant_remove             (GtkContainer      *container,
@@ -157,6 +159,7 @@
   widget_class->unmap = gtk_assistant_unmap;
   widget_class->delete_event = gtk_assistant_delete_event;
   widget_class->expose_event = gtk_assistant_expose;
+  widget_class->focus = gtk_assistant_focus;
 
   container_class->add = gtk_assistant_add;
   container_class->remove = gtk_assistant_remove;
@@ -211,10 +214,9 @@
    *
    * A handler for the ::apply signal should carry out the actions for which the
    * wizard has collected data. If the action takes a long time to complete, you
-   * might consider to put a page displaying the progress of the operation after the
-   * confirmation page with the apply button.
-   *
-   * Return value: %TRUE to suppress the default behavior
+   * might consider to put a page of type GTK_ASSISTANT_PAGE_PROGRESS after the
+   * confirmation page and handle this operation within the "prepare" signal of
+   * the progress page.
    *
    * Since: 2.10
    */
@@ -231,7 +233,8 @@
    * GtkAssistant::close:
    * @assistant: the #GtkAssistant
    *
-   * The ::close signal is emitted when the close button is clicked.
+   * The ::close signal is emitted either when the close button is
+   * clicked or when the apply button in the last page is clicked.
    *
    * Since: 2.10
    */
@@ -365,11 +368,13 @@
 
   page_info = (GtkAssistantPage *) page_node->data;
 
-  while (!GTK_WIDGET_VISIBLE (page_info->page))
+  while (page_node && !GTK_WIDGET_VISIBLE (page_info->page))
     {
       page_node = page_node->next;
-      page_info = (GtkAssistantPage *) page_node->data;
       current_page++;
+
+      if (page_node)
+	page_info = (GtkAssistantPage *) page_node->data;
     }
 
   return current_page;
@@ -379,25 +384,35 @@
 compute_last_button_state (GtkAssistant *assistant)
 {
   GtkAssistantPrivate *priv = assistant->priv;
-  GtkAssistantPage *page_info;
+  GtkAssistantPage *page_info, *current_page_info;
   gint count, page_num, n_pages;
 
   count = 0;
+  n_pages = gtk_assistant_get_n_pages (assistant);
   page_num = gtk_assistant_get_current_page (assistant);
-  n_pages  = gtk_assistant_get_n_pages (assistant);
-  page_info = g_list_nth_data (priv->pages, page_num);
+  current_page_info = g_list_nth_data (priv->pages, page_num);
 
-  while ((page_num > 0 && page_num < n_pages) &&
-	 (page_info->type == GTK_ASSISTANT_PAGE_CONTENT) &&
-	 (page_info->complete))
-    {
-      page_num  = (priv->forward_function) (page_num, priv->forward_function_data);
-      page_info = g_list_nth_data (priv->pages, page_num);
-      count++;
+  if ((page_num > 0 && page_num < n_pages) &&
+      current_page_info->type == GTK_ASSISTANT_PAGE_CONTENT)
+    {
+      do
+	{
+	  page_num = (priv->forward_function) (page_num, priv->forward_function_data);
+	  page_info = g_list_nth_data (priv->pages, page_num);
+	  count++;
+	}
+      while ((page_num > 0 && page_num < n_pages) &&
+	     (page_info != current_page_info) &&
+	     (page_info->type == GTK_ASSISTANT_PAGE_CONTENT) &&
+	     (page_info->complete));
     }
-
+  
   if (count > 1)
-    gtk_widget_show (assistant->last);
+    {
+      gtk_widget_show (assistant->last);
+      gtk_widget_set_sensitive (assistant->last,
+				current_page_info->complete);
+    }
   else
     gtk_widget_hide (assistant->last);
 }
@@ -620,10 +635,15 @@
 on_assistant_last (GtkWidget *widget, GtkAssistant *assistant)
 {
   GtkAssistantPrivate *priv = assistant->priv;
+  GtkAssistantPage *first_page;
 
-  while (priv->current_page->type == GTK_ASSISTANT_PAGE_CONTENT &&
-	 priv->current_page->complete)
+  first_page = priv->current_page;
+
+  do
     compute_next_step (assistant);
+  while (priv->current_page != first_page &&
+	 priv->current_page->type == GTK_ASSISTANT_PAGE_CONTENT &&
+	 priv->current_page->complete);
 }
 
 static gboolean
@@ -1124,7 +1144,7 @@
     {
       page_node = priv->pages;
 
-      while (!GTK_WIDGET_VISIBLE (((GtkAssistantPage *) page_node->data)->page))
+      while (page_node && !GTK_WIDGET_VISIBLE (((GtkAssistantPage *) page_node->data)->page))
 	page_node = page_node->next;
 
       if (page_node)
@@ -1266,6 +1286,43 @@
   return FALSE;
 }
 
+static gboolean
+gtk_assistant_focus (GtkWidget        *widget,
+		     GtkDirectionType  direction)
+{
+  GtkAssistantPrivate *priv;
+  GtkContainer *container;
+
+  container = GTK_CONTAINER (widget);
+  priv = GTK_ASSISTANT (widget)->priv;
+
+  /* we only have to care about 2 widgets, action area and the current page */
+  if (container->focus_child == priv->action_area)
+    {
+      if (!gtk_widget_child_focus (priv->action_area, direction) &&
+	  !gtk_widget_child_focus (priv->current_page->page, direction))
+	{
+	  /* if we're leaving the action area and the current page hasn't
+	     any focusable widget, clear focus and go back to the action area */
+	  gtk_container_set_focus_child (GTK_CONTAINER (priv->action_area), NULL);
+	  gtk_widget_child_focus (priv->action_area, direction);
+	}
+    }
+  else
+    {
+      if (!gtk_widget_child_focus (priv->current_page->page, direction) &&
+	  !gtk_widget_child_focus (priv->action_area, direction))
+	{
+	  /* if we're leaving the current page and there isn't nothing focusable
+	     in the action area, try to clear focus and go back to the page */
+	  gtk_window_set_focus (GTK_WINDOW (widget), NULL);
+	  gtk_widget_child_focus (priv->current_page->page, direction);
+	}
+    }
+
+  return TRUE;
+}
+
 static void
 gtk_assistant_add (GtkContainer *container,
 		   GtkWidget    *page)
@@ -1615,6 +1672,11 @@
       priv->forward_function_data = assistant;
       priv->forward_data_destroy = NULL;
     }
+
+  /* Page flow has possibly changed, so the
+     buttons state might need to change too */
+  if (priv->current_page)
+    _set_assistant_buttons_state (assistant);
 }
 
 /**
@@ -2012,11 +2074,7 @@
       /* Always set buttons state, a change in a future page
 	 might change current page buttons */
       if (priv->current_page)
-	{
-	  /* Always set buttons state, a change in a future page
-	     might change current page buttons */
-	  _set_assistant_buttons_state (assistant);
-	}
+	_set_assistant_buttons_state (assistant);
 
       gtk_widget_child_notify (page, "complete");
     }
Index: demos/gtk-demo/Makefile.am
===================================================================
RCS file: /cvs/gnome/gtk+/demos/gtk-demo/Makefile.am,v
retrieving revision 1.36
diff -u -r1.36 Makefile.am
--- demos/gtk-demo/Makefile.am	12 Jul 2005 16:02:19 -0000	1.36
+++ demos/gtk-demo/Makefile.am	24 Jan 2006 02:36:58 -0000
@@ -6,6 +6,7 @@
 ## demo app, which means alphabetized by demo title, not filename
 demos =						\
 	appwindow.c				\
+	assistant.c				\
 	button_box.c				\
 	changedisplay.c				\
 	clipboard.c				\
Index: demos/gtk-demo/assistant.c
===================================================================
RCS file: demos/gtk-demo/assistant.c
diff -N demos/gtk-demo/assistant.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ demos/gtk-demo/assistant.c	24 Jan 2006 02:36:58 -0000
@@ -0,0 +1,169 @@
+/* Assistant
+ *
+ * Demonstrates a sample multistep assistant. Assistants are used to divide
+ * an operation into several simpler sequential steps, and to guide the user
+ * through these steps.
+ */
+
+#include <gtk/gtk.h>
+#include "demo-common.h"
+
+static GtkWidget *assistant = NULL;
+
+static void
+on_assistant_apply (GtkWidget *widget, gpointer data)
+{
+  /* Apply here changes, this is a fictional
+     example, so we just do nothing here */
+}
+
+static void
+on_assistant_close_cancel (GtkWidget *widget, gpointer data)
+{
+  GtkWidget **assistant = (GtkWidget **) data;
+
+  gtk_widget_destroy (*assistant);
+  *assistant = NULL;
+}
+
+static void
+on_assistant_prepare (GtkWidget *widget, GtkWidget *page, gpointer data)
+{
+  gint current_page, n_pages;
+  gchar *title;
+
+  current_page = gtk_assistant_get_current_page (GTK_ASSISTANT (widget));
+  n_pages = gtk_assistant_get_n_pages (GTK_ASSISTANT (widget));
+
+  title = g_strdup_printf ("Sample assistant (%d of %d)", current_page + 1, n_pages);
+  gtk_window_set_title (GTK_WINDOW (widget), title);
+  g_free (title);
+}
+
+static void
+on_entry_changed (GtkWidget *widget, gpointer data)
+{
+  GtkAssistant *assistant = GTK_ASSISTANT (data);
+  GtkWidget *current_page;
+  gint page_number;
+  const gchar *text;
+
+  page_number = gtk_assistant_get_current_page (assistant);
+  current_page = gtk_assistant_get_nth_page (assistant, page_number);
+  text = gtk_entry_get_text (GTK_ENTRY (widget));
+
+  if (text && *text)
+    gtk_assistant_set_page_complete (assistant, current_page, TRUE);
+  else
+    gtk_assistant_set_page_complete (assistant, current_page, FALSE);
+}
+
+static void
+create_page1 (GtkWidget *assistant)
+{
+  GtkWidget *box, *label, *entry;
+  GdkPixbuf *pixbuf;
+
+  box = gtk_hbox_new (FALSE, 12);
+  gtk_container_set_border_width (GTK_CONTAINER (box), 12);
+
+  label = gtk_label_new ("You must fill out this entry to continue:");
+  gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
+
+  entry = gtk_entry_new ();
+  gtk_box_pack_start (GTK_BOX (box), entry, TRUE, TRUE, 0);
+  g_signal_connect (G_OBJECT (entry), "changed",
+		    G_CALLBACK (on_entry_changed), assistant);
+
+  gtk_widget_show_all (box);
+  gtk_assistant_append_page (GTK_ASSISTANT (assistant), box);
+  gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), box, "Page 1");
+
+  pixbuf = gtk_widget_render_icon (assistant, GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG, NULL);
+  gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant), box, pixbuf);
+  g_object_unref (pixbuf);
+}
+
+static void
+create_page2 (GtkWidget *assistant)
+{
+  GtkWidget *box, *checkbutton;
+  GdkPixbuf *pixbuf;
+
+  box = gtk_vbox_new (12, FALSE);
+  gtk_container_set_border_width (GTK_CONTAINER (box), 12);
+
+  checkbutton = gtk_check_button_new_with_label ("This is optional data, you may continue "
+						 "even if you do not check this");
+  gtk_box_pack_start (GTK_BOX (box), checkbutton, FALSE, FALSE, 0);
+
+  gtk_box_pack_start (GTK_BOX (box), gtk_entry_new (), FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (box), gtk_entry_new (), FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (box), gtk_entry_new (), FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (box), gtk_entry_new (), FALSE, FALSE, 0);
+
+  gtk_widget_show_all (box);
+  gtk_assistant_append_page (GTK_ASSISTANT (assistant), box);
+  gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), box, TRUE);
+  gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), box, "Page 2");
+
+  pixbuf = gtk_widget_render_icon (assistant, GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG, NULL);
+  gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant), box, pixbuf);
+  g_object_unref (pixbuf);
+}
+
+static void
+create_page3 (GtkWidget *assistant)
+{
+  GtkWidget *label;
+  GdkPixbuf *pixbuf;
+
+  label = gtk_label_new ("This is a confirmation page, press 'Apply' to apply changes");
+
+  gtk_widget_show (label);
+  gtk_assistant_append_page (GTK_ASSISTANT (assistant), label);
+  gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), label, GTK_ASSISTANT_PAGE_CONFIRM);
+  gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), label, TRUE);
+  gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), label, "Confirmation");
+
+  pixbuf = gtk_widget_render_icon (assistant, GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG, NULL);
+  gtk_assistant_set_page_header_image (GTK_ASSISTANT (assistant), label, pixbuf);
+  g_object_unref (pixbuf);
+}
+
+GtkWidget*
+do_assistant (GtkWidget *do_widget)
+{
+  if (!assistant)
+    {
+      assistant = gtk_assistant_new ();
+
+	 gtk_window_set_default_size (GTK_WINDOW (assistant), -1, 300);
+
+      gtk_window_set_screen (GTK_WINDOW (assistant),
+			     gtk_widget_get_screen (do_widget));
+
+      create_page1 (assistant);
+      create_page2 (assistant);
+      create_page3 (assistant);
+
+      g_signal_connect (G_OBJECT (assistant), "cancel",
+			G_CALLBACK (on_assistant_close_cancel), &assistant);
+      g_signal_connect (G_OBJECT (assistant), "close",
+			G_CALLBACK (on_assistant_close_cancel), &assistant);
+      g_signal_connect (G_OBJECT (assistant), "apply",
+			G_CALLBACK (on_assistant_apply), NULL);
+      g_signal_connect (G_OBJECT (assistant), "prepare",
+			G_CALLBACK (on_assistant_prepare), NULL);
+    }
+
+  if (!GTK_WIDGET_VISIBLE (assistant))
+    gtk_widget_show (assistant);
+  else
+    {
+      gtk_widget_destroy (assistant);
+      assistant = NULL;
+    }
+
+  return assistant;
+}
