[gnome-initial-setup] Introduce new GisAssistant, based on CcNotebook



commit f1eb6c17be88df98af56ddcfc5f6a999250b084a
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Tue Jun 12 12:10:23 2012 -0400

    Introduce new GisAssistant, based on CcNotebook
    
    We weren't really using a large part of GtkAssistant, playing
    large hacks to get it to work under our design. Rather than keep
    on fighting it, make our own new assistant, based on CcNotebook,
    from gnome-control-center.

 configure.ac                              |    3 +
 gnome-initial-setup/Makefile.am           |    2 +
 gnome-initial-setup/cc-notebook.c         |  565 ++++++++++++++++++
 gnome-initial-setup/cc-notebook.h         |   70 +++
 gnome-initial-setup/gis-account-page.c    |    2 +-
 gnome-initial-setup/gis-assistant.c       |  362 ++++++++++++
 gnome-initial-setup/gis-assistant.h       |   53 ++
 gnome-initial-setup/gis-eula-pages.c      |    8 +-
 gnome-initial-setup/gis-goa-page.c        |    6 +-
 gnome-initial-setup/gnome-initial-setup.c |   51 +-
 gnome-initial-setup/gnome-initial-setup.h |    5 +-
 gnome-initial-setup/setup.ui              |  881 ++++++++++++++---------------
 12 files changed, 1531 insertions(+), 477 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 61faa1c..fbead81 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,6 +17,7 @@ AM_GLIB_GNU_GETTEXT
 NETWORK_MANAGER_REQUIRED_VERSION=0.8.992
 GLIB_REQUIRED_VERSION=2.29.4
 GTK_REQUIRED_VERSION=3.1.2
+CLUTTER_REQUIRED_VERSION=1.11.3
 
 PKG_CHECK_MODULES(INITIAL_SETUP,
                   NetworkManager >= $NETWORK_MANAGER_REQUIRED_VERSION
@@ -28,6 +29,8 @@ PKG_CHECK_MODULES(INITIAL_SETUP,
                   gstreamer-0.10
                   cheese
                   cheese-gtk >= 3.3.5
+                  clutter-gtk-1.0
+                  clutter-1.0 >= $CLUTTER_REQUIRED_VERSION
                   geoclue
                   gweather-3.0
                   goa-1.0
diff --git a/gnome-initial-setup/Makefile.am b/gnome-initial-setup/Makefile.am
index 1a42cd7..3500dd4 100644
--- a/gnome-initial-setup/Makefile.am
+++ b/gnome-initial-setup/Makefile.am
@@ -34,6 +34,8 @@ endif
 
 gnome_initial_setup_SOURCES =	\
 	gnome-initial-setup.c gnome-initial-setup.h \
+	cc-notebook.c cc-notebook.h \
+	gis-assistant.c gis-assistant.h \
 	gis-welcome-page.c gis-welcome-page.h \
 	gis-eula-pages.c gis-eula-pages.h \
 	gis-location-page.c gis-location-page.h \
diff --git a/gnome-initial-setup/cc-notebook.c b/gnome-initial-setup/cc-notebook.c
new file mode 100644
index 0000000..ac7ffd8
--- /dev/null
+++ b/gnome-initial-setup/cc-notebook.c
@@ -0,0 +1,565 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright  2012 Red Hat, Inc.
+ *
+ * This library 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 of the License, or (at your option) any later version.
+ *
+ * This library 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 library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Written by:
+ *      Bastien Nocera <hadess hadess net>
+ *      Emmanuele Bassi <ebassi linux intel com>
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#include "cc-notebook.h"
+
+#define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), CC_TYPE_NOTEBOOK, CcNotebookPrivate))
+
+/*
+ * Structure:
+ *
+ *   Notebook
+ *   +---- GtkClutterEmbed
+ *         +---- ClutterStage
+ *               +---- ClutterScrollActor:scroll
+ *                     +---- ClutterActor:bin
+ *                           +---- ClutterActor:frame<ClutterBinLayout>
+ *                                 +---- GtkClutterActor:embed<GtkWidget>
+ *
+ * the frame element is needed to make the GtkClutterActor contents fill the allocation
+ */
+
+struct _CcNotebookPrivate
+{
+        GtkWidget *embed;
+
+        ClutterActor *stage;
+        ClutterActor *scroll;
+        ClutterActor *bin;
+
+        int last_width;
+
+        GtkWidget *selected_page;
+        GList *pages; /* GList of GtkWidgets */
+        GList *removed_pages; /* GList of RemoveData, see setup_delayed_remove() */
+};
+
+enum
+{
+        PROP_0,
+        PROP_CURRENT_PAGE,
+        LAST_PROP
+};
+
+static GParamSpec *obj_props[LAST_PROP] = { NULL, };
+
+static void
+cc_notebook_buildable_add_child (GtkBuildable  *buildable,
+                                 GtkBuilder    *builder,
+                                 GObject       *child,
+                                 const gchar   *type);
+
+static void
+cc_notebook_buildable_init (GtkBuildableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (CcNotebook, cc_notebook, GTK_TYPE_BOX,
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+                                                cc_notebook_buildable_init))
+
+static void
+cc_notebook_get_property (GObject    *gobject,
+                          guint       prop_id,
+                          GValue     *value,
+                          GParamSpec *pspec)
+{
+        CcNotebookPrivate *priv = CC_NOTEBOOK (gobject)->priv;
+
+        switch (prop_id) {
+        case PROP_CURRENT_PAGE:
+                g_value_set_pointer (value, priv->selected_page);
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+        }
+}
+
+static void
+cc_notebook_set_property (GObject      *gobject,
+			  guint         prop_id,
+			  const GValue *value,
+			  GParamSpec   *pspec)
+{
+        CcNotebook *self = CC_NOTEBOOK (gobject);
+
+        switch (prop_id) {
+        case PROP_CURRENT_PAGE:
+                cc_notebook_select_page (self, g_value_get_pointer (value), TRUE);
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+        }
+}
+
+static void
+cc_notebook_finalize (GObject *gobject)
+{
+        CcNotebook *self = CC_NOTEBOOK (gobject);
+
+	g_list_free_full (self->priv->removed_pages, (GDestroyNotify) g_free);
+	self->priv->removed_pages = NULL;
+
+	g_list_free (self->priv->pages);
+	self->priv->pages = NULL;
+
+	G_OBJECT_CLASS (cc_notebook_parent_class)->finalize (gobject);
+}
+
+static GtkSizeRequestMode
+cc_notebook_get_request_mode (GtkWidget *widget)
+{
+	CcNotebook *notebook;
+	GtkWidget *target;
+
+	notebook = CC_NOTEBOOK (widget);
+
+	target = notebook->priv->selected_page ? notebook->priv->selected_page : notebook->priv->embed;
+
+	return gtk_widget_get_request_mode (target);
+}
+
+static void
+cc_notebook_get_preferred_height (GtkWidget       *widget,
+				  gint            *minimum_height,
+				  gint            *natural_height)
+{
+	CcNotebook *notebook;
+	GList *l;
+
+	notebook = CC_NOTEBOOK (widget);
+
+	if (notebook->priv->selected_page == NULL) {
+		gtk_widget_get_preferred_height (notebook->priv->embed, minimum_height, natural_height);
+		return;
+	}
+
+	*minimum_height = 0;
+	*natural_height = 0;
+	for (l = notebook->priv->pages; l != NULL; l = l->next) {
+		GtkWidget *page = l->data;
+		int page_min, page_nat;
+
+		gtk_widget_get_preferred_height (page, &page_min, &page_nat);
+		*minimum_height = MAX(page_min, *minimum_height);
+		*natural_height = MAX(page_nat, *natural_height);
+	}
+}
+
+static void
+cc_notebook_get_preferred_width_for_height (GtkWidget       *widget,
+					    gint             height,
+					    gint            *minimum_width,
+					    gint            *natural_width)
+{
+	CcNotebook *notebook;
+	GList *l;
+
+	notebook = CC_NOTEBOOK (widget);
+
+	if (notebook->priv->selected_page == NULL) {
+		gtk_widget_get_preferred_width_for_height (notebook->priv->embed, height, minimum_width, natural_width);
+		return;
+	}
+
+	*minimum_width = 0;
+	*natural_width = 0;
+	for (l = notebook->priv->pages; l != NULL; l = l->next) {
+		GtkWidget *page = l->data;
+		int page_min, page_nat;
+
+		gtk_widget_get_preferred_width_for_height (page, height, &page_min, &page_nat);
+		*minimum_width = MAX(page_min, *minimum_width);
+		*natural_width = MAX(page_nat, *natural_width);
+	}
+}
+
+static void
+cc_notebook_get_preferred_width (GtkWidget       *widget,
+				 gint            *minimum_width,
+				 gint            *natural_width)
+{
+	CcNotebook *notebook;
+	GList *l;
+
+	notebook = CC_NOTEBOOK (widget);
+
+	if (notebook->priv->selected_page == NULL) {
+		gtk_widget_get_preferred_width (notebook->priv->embed, minimum_width, natural_width);
+		return;
+	}
+
+	*minimum_width = 0;
+	*natural_width = 0;
+	for (l = notebook->priv->pages; l != NULL; l = l->next) {
+		GtkWidget *page = l->data;
+		int page_min, page_nat;
+
+		gtk_widget_get_preferred_width (page, &page_min, &page_nat);
+		*minimum_width = MAX(page_min, *minimum_width);
+		*natural_width = MAX(page_nat, *natural_width);
+	}
+}
+
+static void
+cc_notebook_get_preferred_height_for_width (GtkWidget       *widget,
+					    gint             width,
+					    gint            *minimum_height,
+					    gint            *natural_height)
+{
+	CcNotebook *notebook;
+	GList *l;
+
+	notebook = CC_NOTEBOOK (widget);
+
+	if (notebook->priv->selected_page == NULL) {
+		gtk_widget_get_preferred_height_for_width (notebook->priv->embed, width, minimum_height, natural_height);
+		return;
+	}
+
+	*minimum_height = 0;
+	*natural_height = 0;
+	for (l = notebook->priv->pages; l != NULL; l = l->next) {
+		GtkWidget *page = l->data;
+		int page_min, page_nat;
+
+		gtk_widget_get_preferred_height_for_width (page, width, &page_min, &page_nat);
+		*minimum_height = MAX(page_min, *minimum_height);
+		*natural_height = MAX(page_nat, *natural_height);
+	}
+}
+
+static gboolean
+cc_notebook_focus (GtkWidget        *widget,
+		   GtkDirectionType  direction)
+{
+	CcNotebook *notebook;
+	GtkWidget *child;
+
+	notebook = CC_NOTEBOOK (widget);
+	child = notebook->priv->selected_page;
+
+	if (child == NULL)
+		return FALSE;
+
+	/* HACK: the default GtkContainer implementation is fine by us
+	 * and there's no way to get to it without excessive copy/paste */
+	return GTK_WIDGET_GET_CLASS (child)->focus (child, direction);
+}
+
+static void
+cc_notebook_class_init (CcNotebookClass *klass)
+{
+        GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+        g_type_class_add_private (klass, sizeof (CcNotebookPrivate));
+
+        obj_props[PROP_CURRENT_PAGE] =
+                g_param_spec_pointer (g_intern_static_string ("current-page"),
+				      "Current Page",
+				      "The currently selected page widget",
+				      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+        gobject_class->get_property = cc_notebook_get_property;
+        gobject_class->set_property = cc_notebook_set_property;
+        gobject_class->finalize = cc_notebook_finalize;
+        g_object_class_install_properties (gobject_class, LAST_PROP, obj_props);
+
+	widget_class->get_request_mode = cc_notebook_get_request_mode;
+	widget_class->get_preferred_height = cc_notebook_get_preferred_height;
+	widget_class->get_preferred_width_for_height = cc_notebook_get_preferred_width_for_height;
+	widget_class->get_preferred_width = cc_notebook_get_preferred_width;
+	widget_class->get_preferred_height_for_width = cc_notebook_get_preferred_height_for_width;
+	widget_class->focus = cc_notebook_focus;
+}
+
+static void
+on_embed_size_allocate (GtkWidget     *embed,
+                        GtkAllocation *allocation,
+                        CcNotebook  *self)
+{
+        ClutterActorIter iter;
+        ClutterActor *child;
+        ClutterActor *frame;
+        float page_w, page_h;
+        float offset = 0.f;
+        ClutterPoint pos;
+
+        if (self->priv->selected_page == NULL)
+		return;
+
+        self->priv->last_width = allocation->width;
+
+        page_w = allocation->width;
+        page_h = allocation->height;
+
+        clutter_actor_iter_init (&iter, self->priv->bin);
+        while (clutter_actor_iter_next (&iter, &child)) {
+                clutter_actor_set_x (child, offset);
+                clutter_actor_set_size (child, page_w, page_h);
+
+                offset += page_w;
+        }
+
+	/* This stops the non-animated scrolling from happening
+	 * if we're still scrolling there */
+	if (clutter_actor_get_transition (self->priv->scroll, "scroll-to") != NULL)
+		return;
+
+	frame = g_object_get_data (G_OBJECT (self->priv->selected_page),
+				   "cc-notebook-frame");
+
+        pos.y = 0;
+        pos.x = clutter_actor_get_x (frame);
+        g_debug ("Scrolling to (%lf,%lf) in allocation", pos.x, pos.y);
+        clutter_scroll_actor_scroll_to_point (CLUTTER_SCROLL_ACTOR (self->priv->scroll), &pos);
+}
+
+static void
+cc_notebook_init (CcNotebook *self)
+{
+        self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, CC_TYPE_NOTEBOOK, CcNotebookPrivate);
+
+        gtk_widget_set_can_focus (GTK_WIDGET (self), TRUE);
+
+        self->priv->embed = gtk_clutter_embed_new ();
+        gtk_widget_push_composite_child ();
+        gtk_container_add (GTK_CONTAINER (self), self->priv->embed);
+        gtk_widget_pop_composite_child ();
+        g_signal_connect (self->priv->embed, "size-allocate", G_CALLBACK (on_embed_size_allocate), self);
+        gtk_widget_show (self->priv->embed);
+
+        self->priv->stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (self->priv->embed));
+
+        self->priv->scroll = clutter_scroll_actor_new ();
+        clutter_scroll_actor_set_scroll_mode (CLUTTER_SCROLL_ACTOR (self->priv->scroll),
+                                                CLUTTER_SCROLL_HORIZONTALLY);
+        clutter_actor_add_constraint (self->priv->scroll, clutter_bind_constraint_new (self->priv->stage, CLUTTER_BIND_SIZE, 0.f));
+        clutter_actor_add_child (self->priv->stage, self->priv->scroll);
+
+        self->priv->bin = clutter_actor_new ();
+        clutter_actor_add_child (self->priv->scroll, self->priv->bin);
+
+        self->priv->selected_page = NULL;
+        gtk_widget_set_name (GTK_WIDGET (self), "GtkBox");
+}
+
+GtkWidget *
+cc_notebook_new (void)
+{
+        return g_object_new (CC_TYPE_NOTEBOOK, NULL);
+}
+
+static void
+_cc_notebook_select_page (CcNotebook *self,
+			  GtkWidget  *widget,
+			  int         index,
+			  gboolean    animate)
+{
+        ClutterPoint pos;
+
+        g_return_if_fail (CC_IS_NOTEBOOK (self));
+        g_return_if_fail (GTK_IS_WIDGET (widget));
+
+        pos.y = 0;
+        pos.x = self->priv->last_width * index;
+
+        if (clutter_actor_get_transition (self->priv->scroll, "scroll-to") != NULL) {
+                g_debug ("Cancelling previous scroll animation");
+                clutter_actor_remove_transition (self->priv->scroll, "scroll-to");
+        }
+
+        clutter_actor_save_easing_state (self->priv->scroll);
+        if (animate)
+		clutter_actor_set_easing_duration (self->priv->scroll, 500);
+	else
+		clutter_actor_set_easing_duration (self->priv->scroll, 0);
+
+        g_debug ("Scrolling to (%lf,%lf) %s animation in page selection", pos.x, pos.y,
+		 animate ? "with" : "without");
+        clutter_scroll_actor_scroll_to_point (CLUTTER_SCROLL_ACTOR (self->priv->scroll), &pos);
+
+	clutter_actor_restore_easing_state (self->priv->scroll);
+
+        /* Remember the last selected page */
+        self->priv->selected_page = widget;
+
+        g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_CURRENT_PAGE]);
+}
+
+void
+cc_notebook_select_page (CcNotebook *self,
+                         GtkWidget  *widget,
+                         gboolean    animate)
+{
+	int i, n_children;
+	GList *children, *l;
+	ClutterActor *frame;
+	gboolean found;
+
+        if (widget == self->priv->selected_page)
+		return;
+
+	found = FALSE;
+	frame = g_object_get_data (G_OBJECT (widget), "cc-notebook-frame");
+
+        n_children = clutter_actor_get_n_children (self->priv->bin);
+        children = clutter_actor_get_children (self->priv->bin);
+        for (i = 0, l = children; i < n_children; i++, l = l->next) {
+		if (frame == l->data) {
+			_cc_notebook_select_page (self, widget, i, animate);
+			found = TRUE;
+			break;
+		}
+	}
+	g_list_free (children);
+	if (found == FALSE)
+		g_warning ("Could not find widget '%p' in CcNotebook '%p'", widget, self);
+}
+
+void
+cc_notebook_add_page (CcNotebook *self,
+                      GtkWidget  *widget)
+{
+        ClutterActor *frame;
+        ClutterActor *embed;
+        int res;
+
+        g_return_if_fail (CC_IS_NOTEBOOK (self));
+        g_return_if_fail (GTK_IS_WIDGET (widget));
+
+        frame = clutter_actor_new ();
+        clutter_actor_set_layout_manager (frame, clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_FILL,
+                                                                         CLUTTER_BIN_ALIGNMENT_FILL));
+
+        embed = gtk_clutter_actor_new_with_contents (widget);
+        g_object_set_data (G_OBJECT (widget), "cc-notebook-frame", frame);
+        clutter_actor_add_child (frame, embed);
+        gtk_widget_show (widget);
+
+        res = clutter_actor_get_n_children (self->priv->bin);
+        clutter_actor_insert_child_at_index (self->priv->bin, frame, res);
+
+        self->priv->pages = g_list_prepend (self->priv->pages, widget);
+
+        if (self->priv->selected_page == NULL)
+		_cc_notebook_select_page (self, widget, res, FALSE);
+
+        gtk_widget_queue_resize (GTK_WIDGET (self));
+}
+
+typedef struct {
+	CcNotebook   *notebook;
+	ClutterActor *frame;
+} RemoveData;
+
+static void
+remove_on_complete (ClutterTimeline *timeline,
+		    RemoveData      *data)
+{
+	data->notebook->priv->removed_pages = g_list_remove (data->notebook->priv->removed_pages, data);
+	clutter_actor_destroy (data->frame);
+	g_free (data);
+}
+
+static gboolean
+setup_delayed_remove (CcNotebook   *self,
+		      ClutterActor *frame)
+{
+        ClutterTransition *transition;
+        RemoveData *data;
+
+	transition = clutter_actor_get_transition (self->priv->scroll, "scroll-to");
+	if (transition == NULL)
+		return FALSE;
+
+	data = g_new0 (RemoveData, 1);
+	data->notebook = self;
+	data->frame = frame;
+
+	self->priv->removed_pages = g_list_prepend (self->priv->removed_pages, data);
+	g_signal_connect (transition, "completed",
+			  G_CALLBACK (remove_on_complete), data);
+
+	return TRUE;
+}
+
+void
+cc_notebook_remove_page (CcNotebook *self,
+                         GtkWidget  *widget)
+{
+        ClutterActorIter iter;
+        ClutterActor *child, *frame;
+        int index;
+
+        g_return_if_fail (CC_IS_NOTEBOOK (self));
+        g_return_if_fail (GTK_IS_WIDGET (widget));
+        g_return_if_fail (widget != self->priv->selected_page);
+
+        frame = g_object_get_data (G_OBJECT (widget), "cc-notebook-frame");
+
+	index = 0;
+        clutter_actor_iter_init (&iter, self->priv->bin);
+        while (clutter_actor_iter_next (&iter, &child)) {
+                if (frame == child) {
+			if (setup_delayed_remove (self, frame) == FALSE)
+				clutter_actor_iter_remove (&iter);
+                        break;
+		}
+
+		index++;
+        }
+
+        self->priv->pages = g_list_remove (self->priv->pages, widget);
+        gtk_widget_queue_resize (GTK_WIDGET (self));
+}
+
+GtkWidget *
+cc_notebook_get_selected_page (CcNotebook *self)
+{
+        g_return_val_if_fail (CC_IS_NOTEBOOK (self), NULL);
+
+        return self->priv->selected_page;
+}
+
+static void
+cc_notebook_buildable_add_child (GtkBuildable  *buildable,
+                                 GtkBuilder    *builder,
+                                 GObject       *child,
+                                 const gchar   *type)
+{
+        CcNotebook *notebook = CC_NOTEBOOK (buildable);
+        cc_notebook_add_page (notebook, GTK_WIDGET (child));
+}
+
+static void
+cc_notebook_buildable_init (GtkBuildableIface *iface)
+{
+        iface->add_child = cc_notebook_buildable_add_child;
+}
diff --git a/gnome-initial-setup/cc-notebook.h b/gnome-initial-setup/cc-notebook.h
new file mode 100644
index 0000000..19dbbf1
--- /dev/null
+++ b/gnome-initial-setup/cc-notebook.h
@@ -0,0 +1,70 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright  2012 Red Hat, Inc.
+ *
+ * This library 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 of the License, or (at your option) any later version.
+ *
+ * This library 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 library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Written by:
+ *      Bastien Nocera <hadess hadess net>
+ */
+
+#ifndef _CC_NOTEBOOK_H_
+#define _CC_NOTEBOOK_H_
+
+#include <gtk/gtk.h>
+#include <clutter-gtk/clutter-gtk.h>
+
+G_BEGIN_DECLS
+
+#define CC_TYPE_NOTEBOOK                (cc_notebook_get_type ())
+#define CC_NOTEBOOK(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), CC_TYPE_NOTEBOOK, CcNotebook))
+#define CC_IS_NOTEBOOK(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CC_TYPE_NOTEBOOK))
+#define CC_NOTEBOOK_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), CC_TYPE_NOTEBOOK, CcNotebookClass))
+#define CC_IS_NOTEBOOK_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), CC_TYPE_NOTEBOOK))
+#define CC_NOTEBOOK_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS ((obj), CC_TYPE_NOTEBOOK, CcNotebookClass))
+
+typedef struct _CcNotebook            CcNotebook;
+typedef struct _CcNotebookPrivate     CcNotebookPrivate;
+typedef struct _CcNotebookClass       CcNotebookClass;
+
+struct _CcNotebook
+{
+        GtkBox parent_class;
+
+        CcNotebookPrivate *priv;
+};
+
+struct _CcNotebookClass
+{
+        GtkBoxClass parent_class;
+};
+
+GType           cc_notebook_get_type                    (void) G_GNUC_CONST;
+
+GtkWidget *     cc_notebook_new                         (void);
+
+void            cc_notebook_add_page                    (CcNotebook *self,
+                                                         GtkWidget  *widget);
+void            cc_notebook_remove_page                 (CcNotebook *self,
+                                                         GtkWidget  *widget);
+
+void            cc_notebook_select_page                 (CcNotebook *self,
+                                                         GtkWidget  *widget,
+                                                         gboolean    animate);
+
+GtkWidget *     cc_notebook_get_selected_page           (CcNotebook *self);
+
+G_END_DECLS
+
+#endif /* _CC_NOTEBOOK_H_ */
diff --git a/gnome-initial-setup/gis-account-page.c b/gnome-initial-setup/gis-account-page.c
index 086e565..9679bb7 100644
--- a/gnome-initial-setup/gis-account-page.c
+++ b/gnome-initial-setup/gis-account-page.c
@@ -23,7 +23,7 @@ update_account_page_status (SetupData *setup)
                    (setup->valid_password ||
                     setup->password_mode == ACT_USER_PASSWORD_MODE_NONE);
 
-        gtk_assistant_set_page_complete (setup->assistant, WID("account-page"), complete);
+        gis_assistant_set_page_complete (gis_get_assistant (setup), WID("account-page"), complete);
         gtk_widget_set_sensitive (WID("local-account-done-button"), complete);
 }
 
diff --git a/gnome-initial-setup/gis-assistant.c b/gnome-initial-setup/gis-assistant.c
new file mode 100644
index 0000000..bade64e
--- /dev/null
+++ b/gnome-initial-setup/gis-assistant.c
@@ -0,0 +1,362 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright (C) 2012 Red Hat
+ *
+ * This program 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.
+ *
+ * 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
+ * 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.
+ *
+ * Written by:
+ *     Jasper St. Pierre <jstpierre mecheye net>
+ */
+
+
+#include "config.h"
+
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#include "gis-assistant.h"
+#include "cc-notebook.h"
+
+static void
+gis_assistant_buildable_add_child (GtkBuildable  *buildable,
+                                   GtkBuilder    *builder,
+                                   GObject       *child,
+                                   const gchar   *type);
+
+static void
+gis_assistant_buildable_init (GtkBuildableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GisAssistant, gis_assistant, GTK_TYPE_BOX,
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+                                                gis_assistant_buildable_init))
+
+#define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GIS_TYPE_ASSISTANT, GisAssistantPrivate))
+
+enum {
+  CHILD_PROP_0,
+  CHILD_PROP_PAGE_COMPLETE,
+};
+
+enum {
+  PREPARE,
+  LAST_SIGNAL,
+};
+
+static guint signals[LAST_SIGNAL];
+
+struct _GisAssistantPrivate
+{
+  GtkWidget *notebook;
+  GtkWidget *forward;
+  GtkWidget *back;
+  GtkWidget *main_layout;
+  GtkWidget *action_area;
+
+  GList *pages;
+  GList *current_page;
+};
+
+void
+gis_assistant_next_page (GisAssistant *assistant)
+{
+  GisAssistantPrivate *priv = assistant->priv;
+  cc_notebook_select_page (CC_NOTEBOOK (priv->notebook),
+                           priv->current_page->next->data,
+                           TRUE);
+}
+
+void
+gis_assistant_previous_page (GisAssistant *assistant)
+{
+  GisAssistantPrivate *priv = assistant->priv;
+  cc_notebook_select_page (CC_NOTEBOOK (priv->notebook),
+                           priv->current_page->prev->data,
+                           TRUE);
+}
+
+static void
+gis_assistant_prepare (GisAssistant *assistant,
+                       GtkWidget    *page)
+{
+  GisAssistantPrivate *priv = assistant->priv;
+  gboolean can_go_backward, can_go_forward;
+
+  can_go_backward = (priv->current_page->prev != NULL);
+  gtk_widget_set_sensitive (priv->back, can_go_backward);
+
+  can_go_forward = (priv->current_page->next != NULL) && gis_assistant_get_page_complete (assistant, page);
+  gtk_widget_set_sensitive (priv->forward, can_go_forward);
+}
+
+static void
+prepare (GisAssistant *assistant)
+{
+  GisAssistantPrivate *priv = assistant->priv;
+  g_signal_emit (assistant, signals[PREPARE], 0, priv->current_page->data);
+}
+
+void
+gis_assistant_add_page (GisAssistant *assistant,
+                        GtkWidget    *page)
+{
+  GisAssistantPrivate *priv = assistant->priv;
+  GList *link;
+
+  priv->pages = g_list_append (priv->pages, page);
+  link = g_list_last (priv->pages);
+
+  g_object_set_data (G_OBJECT (page), "gis-assistant-link", link);
+  cc_notebook_add_page (CC_NOTEBOOK (priv->notebook), page);
+
+  if (link->prev == priv->current_page)
+    prepare (assistant);
+}
+
+static void
+go_forward (GtkWidget    *button,
+            GisAssistant *assistant)
+{
+  gis_assistant_next_page (assistant);
+}
+
+static void
+go_backward (GtkWidget    *button,
+             GisAssistant *assistant)
+{
+  gis_assistant_previous_page (assistant);
+}
+
+static void
+set_boolean (GObject *object,
+             gchar   *name,
+             gboolean value)
+{
+  gpointer value_p = GUINT_TO_POINTER (value ? 1 : 0);
+  g_object_set_data (object, name, value_p);
+}
+
+static gboolean
+get_boolean (GObject *object,
+             gchar   *name)
+{
+  gpointer value_p = g_object_get_data (object, name);
+  return GPOINTER_TO_UINT (value_p) != 0;
+}
+
+void
+gis_assistant_set_page_complete (GisAssistant *assistant,
+                                 GtkWidget    *page,
+                                 gboolean      complete)
+{
+  GisAssistantPrivate *priv = assistant->priv;
+
+  set_boolean (G_OBJECT (page), "gis-assistant-complete", complete);
+
+  if (page == priv->current_page->data)
+    prepare (assistant);
+}
+
+gboolean
+gis_assistant_get_page_complete (GisAssistant *assistant,
+                                 GtkWidget    *page)
+{
+  return get_boolean (G_OBJECT (page), "gis-assistant-complete");
+}
+
+static void
+current_page_changed (CcNotebook   *notebook,
+                      GParamSpec   *pspec,
+                      GisAssistant *assistant)
+{
+  GisAssistantPrivate *priv = assistant->priv;
+  GtkWidget *page = cc_notebook_get_selected_page (notebook);
+  GList *link = (GList *) g_object_get_data (G_OBJECT (page), "gis-assistant-link");
+
+  if (link == NULL) {
+    g_warning ("%s: has no associated link", gtk_widget_get_name (page));
+    return;
+  }
+
+  if (priv->current_page != link) {
+    priv->current_page = link;
+    prepare (assistant);
+  }
+}
+
+static void
+gis_assistant_init (GisAssistant *assistant)
+{
+  GisAssistantPrivate *priv = GET_PRIVATE (assistant);
+  assistant->priv = priv;
+
+  priv->main_layout = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
+  gtk_box_pack_start (GTK_BOX (assistant), priv->main_layout, TRUE, TRUE, 0);
+
+  priv->notebook = cc_notebook_new ();
+  gtk_box_pack_start (GTK_BOX (priv->main_layout), priv->notebook, TRUE, TRUE, 0);
+
+  priv->action_area = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+  gtk_box_pack_start (GTK_BOX (priv->main_layout), priv->action_area, FALSE, TRUE, 0);
+  gtk_widget_set_halign (priv->action_area, GTK_ALIGN_END);
+
+  priv->forward = gtk_button_new_with_mnemonic (_("C_ontinue"));
+  gtk_button_set_image (GTK_BUTTON (priv->forward),
+                        gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_BUTTON));
+  gtk_widget_set_can_default (priv->forward, TRUE);
+
+  priv->back = gtk_button_new_with_mnemonic (_("Go _Back"));
+  gtk_button_set_image (GTK_BUTTON (priv->back),
+                        gtk_image_new_from_stock (GTK_STOCK_GO_BACK, GTK_ICON_SIZE_BUTTON));
+
+  gtk_box_pack_start (GTK_BOX (priv->action_area), priv->back, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (priv->action_area), priv->forward, FALSE, FALSE, 0);
+
+  g_signal_connect (priv->notebook, "notify::current-page",
+                    G_CALLBACK (current_page_changed), assistant);
+
+  g_signal_connect (priv->forward, "clicked",
+                    G_CALLBACK (go_forward), assistant);
+
+  g_signal_connect (priv->back, "clicked",
+                    G_CALLBACK (go_backward), assistant);
+
+  gtk_widget_show_all (GTK_WIDGET (assistant));
+}
+
+static void
+free_page (GtkWidget *page)
+{
+  g_object_set_data (G_OBJECT (page), "gis-assistant-link", NULL);
+}
+
+static void
+gis_assistant_finalize (GObject *gobject)
+{
+  GisAssistant *assistant = GIS_ASSISTANT (gobject);
+  GisAssistantPrivate *priv = assistant->priv;
+
+  priv->current_page = NULL;
+
+  g_list_free_full (priv->pages, (GDestroyNotify) free_page);
+
+  G_OBJECT_CLASS (gis_assistant_parent_class)->finalize (gobject);
+}
+
+static void
+gis_assistant_get_child_property (GtkContainer *container,
+                                  GtkWidget    *child,
+                                  guint         property_id,
+                                  GValue       *value,
+                                  GParamSpec   *pspec)
+{
+  GisAssistant *assistant = GIS_ASSISTANT (container);
+
+  switch (property_id) {
+  case CHILD_PROP_PAGE_COMPLETE:
+    g_value_set_boolean (value,
+                         gis_assistant_get_page_complete (assistant, child));
+    break;
+  default:
+    GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
+    break;
+  }
+}
+
+static void
+gis_assistant_set_child_property (GtkContainer *container,
+                                  GtkWidget    *child,
+                                  guint         property_id,
+                                  const GValue *value,
+                                  GParamSpec   *pspec)
+{
+  GisAssistant *assistant = GIS_ASSISTANT (container);
+
+  switch (property_id) {
+  case CHILD_PROP_PAGE_COMPLETE:
+    gis_assistant_set_page_complete (assistant, child, g_value_get_boolean (value));
+    break;
+  default:
+    GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
+    break;
+  }
+}
+
+static void
+gis_assistant_class_init (GisAssistantClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
+
+  g_type_class_add_private (klass, sizeof (GisAssistantPrivate));
+
+  gobject_class->finalize = gis_assistant_finalize;
+
+  container_class->get_child_property = gis_assistant_get_child_property;
+  container_class->set_child_property = gis_assistant_set_child_property;
+  klass->prepare = gis_assistant_prepare;
+
+  /**
+   * GisAssistant::prepare:
+   * @assistant: the #GisAssistant
+   * @page: the current page
+   *
+   * The ::prepare signal is emitted when a new page is set as the
+   * assistant's current page, before making the new page visible.
+   *
+   * A handler for this signal can do any preparations which are
+   * necessary before showing @page.
+   */
+  signals[PREPARE] =
+    g_signal_new ("prepare",
+                  G_TYPE_FROM_CLASS (gobject_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (GisAssistantClass, prepare),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__OBJECT,
+                  G_TYPE_NONE, 1, GTK_TYPE_WIDGET);
+
+  /**
+   * GisAssistant:complete:
+   *
+   * Setting the "complete" child property to %TRUE marks a page as
+   * complete (i.e.: all the required fields are filled out). GTK+ uses
+   * this information to control the sensitivity of the navigation buttons.
+   */
+  gtk_container_class_install_child_property (container_class,
+                                              CHILD_PROP_PAGE_COMPLETE,
+                                              g_param_spec_boolean ("complete",
+                                                                    "Page complete",
+                                                                    "Whether all required fields on the page have been filled out",
+                                                                    FALSE,
+                                                                    G_PARAM_READWRITE));
+}
+
+static void
+gis_assistant_buildable_add_child (GtkBuildable  *buildable,
+                                   GtkBuilder    *builder,
+                                   GObject       *child,
+                                   const gchar   *type)
+{
+  GisAssistant *assistant = GIS_ASSISTANT (buildable);
+  gis_assistant_add_page (assistant, GTK_WIDGET (child));
+}
+
+static void
+gis_assistant_buildable_init (GtkBuildableIface *iface)
+{
+  iface->add_child = gis_assistant_buildable_add_child;
+}
diff --git a/gnome-initial-setup/gis-assistant.h b/gnome-initial-setup/gis-assistant.h
new file mode 100644
index 0000000..b1e3f9a
--- /dev/null
+++ b/gnome-initial-setup/gis-assistant.h
@@ -0,0 +1,53 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/* GIS_ASSISTANT */
+/* GisAssistant */
+
+#ifndef __GIS_ASSISTANT_H__
+#define __GIS_ASSISTANT_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GIS_TYPE_ASSISTANT               (gis_assistant_get_type ())
+#define GIS_ASSISTANT(obj)                           (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIS_TYPE_ASSISTANT, GisAssistant))
+#define GIS_ASSISTANT_CLASS(klass)                   (G_TYPE_CHECK_CLASS_CAST ((klass),  GIS_TYPE_ASSISTANT, GisAssistantClass))
+#define GIS_IS_ASSISTANT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIS_TYPE_ASSISTANT))
+#define GIS_IS_ASSISTANT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIS_TYPE_ASSISTANT))
+#define GIS_ASSISTANT_GET_CLASS(obj)                 (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIS_TYPE_ASSISTANT, GisAssistantClass))
+
+typedef struct _GisAssistant        GisAssistant;
+typedef struct _GisAssistantClass   GisAssistantClass;
+typedef struct _GisAssistantPrivate GisAssistantPrivate;
+
+struct _GisAssistant
+{
+  GtkBox parent;
+
+  GisAssistantPrivate *priv;
+};
+
+struct _GisAssistantClass
+{
+  GtkBoxClass parent_class;
+
+  void (* prepare) (GisAssistant *assistant, GtkWidget *page);
+};
+
+GType gis_assistant_get_type (void);
+
+void      gis_assistant_add_page          (GisAssistant *assistant,
+                                           GtkWidget    *page);
+
+void      gis_assistant_next_page         (GisAssistant *assistant);
+void      gis_assistant_previous_page     (GisAssistant *assistant);
+
+void      gis_assistant_set_page_complete (GisAssistant *assistant,
+                                           GtkWidget    *page,
+                                           gboolean      complete);
+gboolean  gis_assistant_get_page_complete (GisAssistant *assistant,
+                                           GtkWidget    *page);
+
+G_END_DECLS
+
+#endif /* __GIS_ASSISTANT_H__ */
diff --git a/gnome-initial-setup/gis-eula-pages.c b/gnome-initial-setup/gis-eula-pages.c
index 0e40ff9..89eb484 100644
--- a/gnome-initial-setup/gis-eula-pages.c
+++ b/gnome-initial-setup/gis-eula-pages.c
@@ -74,7 +74,7 @@ static void
 eula_checkbox_toggled (GtkToggleButton *checkbox,
                        SetupData       *setup)
 {
-  gtk_assistant_set_page_complete (gis_get_assistant (setup),
+  gis_assistant_set_page_complete (gis_get_assistant (setup),
                                    g_object_get_data (G_OBJECT (checkbox), "assistant-page"),
                                    gtk_toggle_button_get_active (checkbox));
 }
@@ -87,7 +87,6 @@ build_eula_page (SetupData *setup,
   GtkWidget *vbox;
   GtkWidget *scrolled_window;
   GtkWidget *checkbox;
-  GtkAssistant *assistant = gis_get_assistant (setup);
 
   text_view = build_eula_text_view (eula);
   if (text_view == NULL)
@@ -108,10 +107,7 @@ build_eula_page (SetupData *setup,
   gtk_container_add (GTK_CONTAINER (vbox), scrolled_window);
   gtk_container_add (GTK_CONTAINER (vbox), checkbox);
 
-  /* XXX: 1 is the location after the welcome page.
-   * Remove this hardcoded thing. */
-  gtk_assistant_insert_page (assistant, vbox, 1);
-  gtk_assistant_set_page_complete (assistant, vbox, FALSE);
+  gis_assistant_add_page (gis_get_assistant (setup), vbox);
 
   gtk_widget_show_all (GTK_WIDGET (vbox));
   g_signal_connect (checkbox, "toggled",
diff --git a/gnome-initial-setup/gis-goa-page.c b/gnome-initial-setup/gis-goa-page.c
index 199ab7e..32321f6 100644
--- a/gnome-initial-setup/gis-goa-page.c
+++ b/gnome-initial-setup/gis-goa-page.c
@@ -32,7 +32,7 @@ show_online_account_dialog (GtkButton *button,
 
   providers = NULL;
 
-  parent = GTK_WINDOW (gis_get_assistant (data->setup));
+  parent = GTK_WINDOW (gis_get_main_window (data->setup));
 
   dialog = goa_panel_add_account_dialog_new (data->goa_client);
   gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
@@ -94,7 +94,7 @@ remove_account_cb (GoaAccount   *account,
   if (!goa_account_call_remove_finish (account, res, &error))
     {
       GtkWidget *dialog;
-      dialog = gtk_message_dialog_new (GTK_WINDOW (gis_get_assistant (data->setup)),
+      dialog = gtk_message_dialog_new (GTK_WINDOW (gis_get_main_window (data->setup)),
                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                        GTK_MESSAGE_ERROR,
                                        GTK_BUTTONS_CLOSE,
@@ -120,7 +120,7 @@ confirm_remove_account (GtkButton *button, gpointer user_data)
 
   object = g_object_get_data (G_OBJECT (button), "goa-object");
 
-  dialog = gtk_message_dialog_new (GTK_WINDOW (gis_get_assistant (data->setup)),
+  dialog = gtk_message_dialog_new (GTK_WINDOW (gis_get_main_window (data->setup)),
                                    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                    GTK_MESSAGE_QUESTION,
                                    GTK_BUTTONS_CANCEL,
diff --git a/gnome-initial-setup/gnome-initial-setup.c b/gnome-initial-setup/gnome-initial-setup.c
index 5f37d9e..4324ed4 100644
--- a/gnome-initial-setup/gnome-initial-setup.c
+++ b/gnome-initial-setup/gnome-initial-setup.c
@@ -8,13 +8,9 @@
 #include <gio/gio.h>
 
 #include <stdlib.h>
-#include <gtk/gtk.h>
 
-#include <glib/gi18n.h>
-#include <gio/gio.h>
-
-#include <stdlib.h>
 #include <gtk/gtk.h>
+#include <clutter-gtk/clutter-gtk.h>
 
 #include <act/act-user-manager.h>
 
@@ -29,6 +25,8 @@
 
 #include <gnome-keyring.h>
 
+#include "gis-assistant.h"
+
 #include "gis-welcome-page.h"
 #include "gis-eula-pages.h"
 #include "gis-location-page.h"
@@ -38,12 +36,14 @@
 /* Setup data {{{1 */
 struct _SetupData {
         GtkBuilder *builder;
-        GtkAssistant *assistant;
+        GtkWindow *main_window;
 
         GKeyFile *overrides;
 
         GdmGreeterClient *greeter_client;
 
+        GisAssistant *assistant;
+
         /* account data */
         ActUserManager *act_client;
         ActUser *act_user;
@@ -66,7 +66,7 @@ struct _SetupData {
 #include "gis-summary-page.c"
 
 static void
-prepare_cb (GtkAssistant *assi, GtkWidget *page, SetupData *setup)
+prepare_cb (GisAssistant *assi, GtkWidget *page, SetupData *setup)
 {
         g_debug ("Preparing page %s", gtk_widget_get_name (page));
 
@@ -77,21 +77,12 @@ prepare_cb (GtkAssistant *assi, GtkWidget *page, SetupData *setup)
 }
 
 static void
-prepare_assistant (SetupData *setup)
+prepare_main_window (SetupData *setup)
 {
-        GList *list;
-
-        setup->assistant = OBJ(GtkAssistant*, "gnome-setup-assistant");
-
-        /* small hack to get rid of cancel button */
-        gtk_assistant_commit (setup->assistant);
+        setup->main_window = OBJ(GtkWindow*, "main-window");
+        setup->assistant = OBJ(GisAssistant*, "assistant");
 
-        /* another small hack to hide the sidebar */
-        list = gtk_container_get_children (GTK_CONTAINER (gtk_bin_get_child (GTK_BIN (setup->assistant))));
-        gtk_widget_hide (GTK_WIDGET (list->data));
-        g_list_free (list);
-
-        g_signal_connect (G_OBJECT (setup->assistant), "prepare",
+        g_signal_connect (setup->assistant, "prepare",
                           G_CALLBACK (prepare_cb), setup);
 
         /* connect to gdm slave */
@@ -118,7 +109,13 @@ gis_get_builder (SetupData *data)
         return data->builder;
 }
 
-GtkAssistant *
+GtkWindow *
+gis_get_main_window (SetupData *data)
+{
+        return data->main_window;
+}
+
+GisAssistant *
 gis_get_assistant (SetupData *data)
 {
         return data->assistant;
@@ -148,12 +145,20 @@ main (int argc, char *argv[])
 
         gtk_init_with_args (&argc, &argv, "", entries, GETTEXT_PACKAGE, NULL);
 
+        if (gtk_clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS) {
+                g_critical ("Clutter-GTK init failed");
+                exit (1);
+        }
+
         error = NULL;
         if (g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error) == NULL) {
                 g_error ("Couldn't get on session bus: %s", error->message);
                 exit (1);
         };
 
+        /* Make sure GisAssistant is initialized. */
+        g_debug ("Registering: %s\n", g_type_name (gis_assistant_get_type ()));
+
         setup->builder = gtk_builder_new ();
         if (g_file_test ("setup.ui", G_FILE_TEST_EXISTS)) {
                 gtk_builder_add_from_file (setup->builder, "setup.ui", &error);
@@ -177,9 +182,9 @@ main (int argc, char *argv[])
         }
         g_free (filename);
 
-        prepare_assistant (setup);
+        prepare_main_window (setup);
 
-        gtk_window_present (GTK_WINDOW (setup->assistant));
+        gtk_window_present (GTK_WINDOW (setup->main_window));
 
         gtk_main ();
 
diff --git a/gnome-initial-setup/gnome-initial-setup.h b/gnome-initial-setup/gnome-initial-setup.h
index 4060d9b..9de1d52 100644
--- a/gnome-initial-setup/gnome-initial-setup.h
+++ b/gnome-initial-setup/gnome-initial-setup.h
@@ -5,13 +5,16 @@
 
 #include <gtk/gtk.h>
 
+#include "gis-assistant.h"
+
 G_BEGIN_DECLS
 
 typedef struct _SetupData SetupData;
 
 GtkBuilder *gis_get_builder (SetupData *data);
-GtkAssistant *gis_get_assistant (SetupData *data);
+GtkWindow *gis_get_main_window (SetupData *data);
 GKeyFile *gis_get_overrides (SetupData *data);
+GisAssistant * gis_get_assistant (SetupData *data);
 
 #define OBJ(type,name) ((type)gtk_builder_get_object(gis_get_builder(setup),(name)))
 #define WID(name) OBJ(GtkWidget*,name)
diff --git a/gnome-initial-setup/setup.ui b/gnome-initial-setup/setup.ui
index d4642ff..b2792eb 100644
--- a/gnome-initial-setup/setup.ui
+++ b/gnome-initial-setup/setup.ui
@@ -38,7 +38,7 @@
   </object>
   <object class="GtkDialog" id="local-account-dialog">
     <property name="title"></property>
-    <property name="transient-for">gnome-setup-assistant</property>
+    <property name="transient-for">main-window</property>
     <property name="modal">True</property>
     <property name="resizable">False</property>
     <child internal-child="action_area">
@@ -258,7 +258,7 @@
       <widget name="summary-tour-button"/>
     </widgets>
   </object>
-  <object class="GtkAssistant" id="gnome-setup-assistant">
+  <object class="GtkWindow" id="main-window">
     <!-- interface-naming-policy toplevel-contextual -->
     <property name="border-width">12</property>
     <property name="title"></property>
@@ -268,140 +268,192 @@
     <property name="resizable">False</property>
     <property name="window-position">center</property>
     <child>
-      <object class="GtkGrid" id="welcome-page">
-        <property name="name">welcome-page</property>
+      <object class="GisAssistant" id="assistant">
         <property name="visible">True</property>
-        <property name="halign">center</property>
         <child>
-          <object class="GtkLabel" id="welcome-title">
+          <object class="GtkGrid" id="welcome-page">
+            <property name="name">welcome-page</property>
             <property name="visible">True</property>
-            <property name="label" translatable="yes">Welcome to GNOME 3</property>
             <property name="halign">center</property>
-            <property name="valign">start</property>
-            <property name="margin-bottom">18</property>
-            <attributes>
-              <attribute name="weight" value="bold"/>
-              <attribute name="scale" value="1.2"/>
-            </attributes>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkImage" id="welcome-image">
-            <property name="visible">True</property>
-            <property name="halign">center</property>
-            <property name="valign">start</property>
-            <property name="pixbuf">resource:///image/welcome-image.png</property>
+            <child>
+              <object class="GtkLabel" id="welcome-title">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Welcome to GNOME 3</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+                <property name="margin-bottom">18</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                  <attribute name="scale" value="1.2"/>
+                </attributes>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkImage" id="welcome-image">
+                <property name="visible">True</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+                <property name="pixbuf">resource:///image/welcome-image.png</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="welcome-subtitle">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Let's set up some essentials.</property>
+                <property name="halign">center</property>
+                <property name="margin-top">18</property>
+                <property name="margin-bottom">18</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">2</property>
+              </packing>
+            </child>
           </object>
           <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
+            <property name="complete">True</property>
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="welcome-subtitle">
+          <object class="GtkGrid" id="network-page">
+            <property name="name">network-page</property>
             <property name="visible">True</property>
-            <property name="label" translatable="yes">Let's set up some essentials.</property>
+            <property name="margin-left">48</property>
+            <property name="margin-right">48</property>
+            <property name="margin-bottom">48</property>
             <property name="halign">center</property>
-            <property name="margin-top">18</property>
-            <property name="margin-bottom">18</property>
-            <attributes>
-              <attribute name="weight" value="bold"/>
-            </attributes>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">2</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="title" translatable="yes">Introduction</property>
-        <property name="complete">True</property>
-        <property name="page-type">intro</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkGrid" id="network-page">
-        <property name="name">network-page</property>
-        <property name="visible">True</property>
-        <property name="margin-left">48</property>
-        <property name="margin-right">48</property>
-        <property name="margin-bottom">48</property>
-        <property name="halign">center</property>
-        <child>
-          <object class="GtkLabel" id="network-title">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Wireless Networks</property>
-            <property name="halign">center</property>
-            <property name="valign">start</property>
-            <property name="margin-bottom">18</property>
-            <attributes>
-              <attribute name="weight" value="bold"/>
-              <attribute name="scale" value="1.2"/>
-            </attributes>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkScrolledWindow" id="network-scrolledwindow">
-            <property name="visible">True</property>
-            <property name="margin-top">0</property>
-            <property name="margin-bottom">32</property>
-            <property name="hscrollbar-policy">never</property>
-            <property name="vscrollbar-policy">automatic</property>
-            <property name="shadow-type">in</property>
             <child>
-              <object class="GtkTreeView" id="network-list">
+              <object class="GtkLabel" id="network-title">
                 <property name="visible">True</property>
-                <property name="can-focus">True</property>
-                <property name="vexpand">True</property>
-                <property name="halign">fill</property>
-                <property name="valign">fill</property>
-                <property name="model">liststore-wireless</property>
-                <property name="headers-visible">False</property>
-                <property name="search-column">2</property>
-                <property name="enable-grid-lines">horizontal</property>
-                <property name="show-expanders">False</property>
-                <child internal-child="selection">
-                  <object class="GtkTreeSelection" id="network-list-selection">
-                    <property name="mode">single</property>
+                <property name="label" translatable="yes">Wireless Networks</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+                <property name="margin-bottom">18</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                  <attribute name="scale" value="1.2"/>
+                </attributes>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">0</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="network-scrolledwindow">
+                <property name="visible">True</property>
+                <property name="margin-top">0</property>
+                <property name="margin-bottom">32</property>
+                <property name="hscrollbar-policy">never</property>
+                <property name="vscrollbar-policy">automatic</property>
+                <property name="shadow-type">in</property>
+                <child>
+                  <object class="GtkTreeView" id="network-list">
+                    <property name="visible">True</property>
+                    <property name="can-focus">True</property>
+                    <property name="vexpand">True</property>
+                    <property name="halign">fill</property>
+                    <property name="valign">fill</property>
+                    <property name="model">liststore-wireless</property>
+                    <property name="headers-visible">False</property>
+                    <property name="search-column">2</property>
+                    <property name="enable-grid-lines">horizontal</property>
+                    <property name="show-expanders">False</property>
+                    <child internal-child="selection">
+                      <object class="GtkTreeSelection" id="network-list-selection">
+                        <property name="mode">single</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkTreeViewColumn" id="network-list-column"/>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">1</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkGrid" id="no-network-grid">
+                <property name="visible">True</property>
+                <property name="halign">start</property>
+                <property name="valign">start</property>
+                <child>
+                  <object class="GtkSpinner" id="no-network-spinner">
+                    <property name="visible">True</property>
+                    <property name="active">True</property>
+                    <property name="halign">center</property>
+                    <property name="valign">center</property>
+                    <property name="margin-left">6</property>
+                    <property name="margin-right">6</property>
                   </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">0</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
                 </child>
                 <child>
-                  <object class="GtkTreeViewColumn" id="network-list-column"/>
+                  <object class="GtkLabel" id="no-network-label">
+                    <property name="visible">True</property>
+                    <property name="label">No text</property>
+                    <property name="halign">center</property>
+                    <property name="valign">center</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">0</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
                 </child>
               </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">3</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
             </child>
           </object>
           <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
+            <property name="complete">True</property>
           </packing>
         </child>
         <child>
-          <object class="GtkGrid" id="no-network-grid">
-            <property name="visible">True</property>
-            <property name="halign">start</property>
-            <property name="valign">start</property>
+          <object class="GtkGrid" id="account-page">
+            <property name="name">account-page</property>
+            <property name="visible">False</property>
+            <property name="halign">center</property>
             <child>
-              <object class="GtkSpinner" id="no-network-spinner">
+              <object class="GtkLabel" id="account-title">
                 <property name="visible">True</property>
-                <property name="active">True</property>
+                <property name="label" translatable="yes">Choose How to Log In</property>
                 <property name="halign">center</property>
-                <property name="valign">center</property>
-                <property name="margin-left">6</property>
-                <property name="margin-right">6</property>
+                <property name="valign">start</property>
+                <property name="margin-bottom">18</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                  <attribute name="scale" value="1.2"/>
+                </attributes>
               </object>
               <packing>
                 <property name="left_attach">0</property>
@@ -411,411 +463,354 @@
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="no-network-label">
+              <object class="GtkScrolledWindow" id="account-scrolledwindow">
                 <property name="visible">True</property>
-                <property name="label">No text</property>
-                <property name="halign">center</property>
-                <property name="valign">center</property>
+                <property name="halign">fill</property>
+                <property name="valign">fill</property>
+                <property name="vexpand">False</property>
+                <property name="hscrollbar-policy">never</property>
+                <property name="vscrollbar-policy">never</property>
+                <property name="shadow-type">in</property>
+                <child>
+                  <object class="GtkTreeView" id="account-list">
+                    <property name="visible">True</property>
+                    <property name="can-focus">True</property>
+                    <property name="halign">fill</property>
+                    <property name="valign">fill</property>
+                    <property name="model">liststore-account</property>
+                    <property name="headers-visible">False</property>
+                    <property name="enable-grid-lines">horizontal</property>
+                    <property name="show-expanders">False</property>
+                    <child internal-child="selection">
+                      <object class="GtkTreeSelection" id="account-list-selection">
+                        <property name="mode">none</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkTreeViewColumn" id="account-list-column"/>
+                    </child>
+                  </object>
+                </child>
               </object>
               <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">0</property>
+                <property name="left_attach">0</property>
+                <property name="top_attach">1</property>
                 <property name="width">1</property>
                 <property name="height">1</property>
               </packing>
             </child>
           </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">3</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
         </child>
-      </object>
-      <packing>
-        <property name="title" translatable="yes">Network</property>
-        <property name="complete">True</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkGrid" id="account-page">
-        <property name="name">account-page</property>
-        <property name="visible">False</property>
-        <property name="halign">center</property>
         <child>
-          <object class="GtkLabel" id="account-title">
+          <object class="GtkGrid" id="location-page">
+            <property name="name">location-page</property>
             <property name="visible">True</property>
-            <property name="label" translatable="yes">Choose How to Log In</property>
             <property name="halign">center</property>
             <property name="valign">start</property>
-            <property name="margin-bottom">18</property>
-            <attributes>
-              <attribute name="weight" value="bold"/>
-              <attribute name="scale" value="1.2"/>
-            </attributes>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkScrolledWindow" id="account-scrolledwindow">
-            <property name="visible">True</property>
-            <property name="halign">fill</property>
-            <property name="valign">fill</property>
-            <property name="vexpand">False</property>
-            <property name="hscrollbar-policy">never</property>
-            <property name="vscrollbar-policy">never</property>
-            <property name="shadow-type">in</property>
+            <property name="hexpand">True</property>
             <child>
-              <object class="GtkTreeView" id="account-list">
+              <object class="GtkLabel" id="location-title">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Choose Your Location</property>
+                <property name="halign">center</property>
+                <property name="hexpand">False</property>
+                <property name="valign">start</property>
+                <property name="margin-bottom">18</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                  <attribute name="scale" value="1.2"/>
+                </attributes>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">0</property>
+                <property name="width">2</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="location-auto-button">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Determine your location automatically</property>
+                <property name="use_underline">True</property>
+                <property name="halign">start</property>
+                <property name="margin-right">24</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">1</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkFrame" id="location-map-frame">
                 <property name="visible">True</property>
-                <property name="can-focus">True</property>
                 <property name="halign">fill</property>
                 <property name="valign">fill</property>
-                <property name="model">liststore-account</property>
-                <property name="headers-visible">False</property>
-                <property name="enable-grid-lines">horizontal</property>
-                <property name="show-expanders">False</property>
-                <child internal-child="selection">
-                  <object class="GtkTreeSelection" id="account-list-selection">
-                    <property name="mode">none</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="margin-top">12</property>
+                <property name="margin-bottom">12</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">2</property>
+                <property name="width">2</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkGrid" id="location-info-grid">
+                <property name="visible">True</property>
+                <property name="halign">start</property>
+                <property name="valign">start</property>
+                <property name="row-spacing">12</property>
+                <property name="column-spacing">6</property>
+                <child>
+                  <object class="GtkLabel" id="location-label">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Location</property>
+                    <property name="halign">end</property>
+                    <style>
+                      <class name="dim-label"/>
+                    </style>
                   </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">0</property>
+                  </packing>
                 </child>
                 <child>
-                  <object class="GtkTreeViewColumn" id="account-list-column"/>
+                  <object class="GtkLabel" id="current-location-label">
+                    <property name="visible">True</property>
+                    <property name="label">Boston, MA</property>
+                    <property name="halign">start</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="timezone-label">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Time Zone</property>
+                    <property name="halign">end</property>
+                    <style>
+                      <class name="dim-label"/>
+                    </style>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="current-timezone-label">
+                    <property name="visible">True</property>
+                    <property name="label">America / New York</property>
+                    <property name="halign">start</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">1</property>
+                  </packing>
                 </child>
               </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">3</property>
+              </packing>
             </child>
           </object>
           <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
+            <property name="complete">True</property>
           </packing>
         </child>
-      </object>
-      <packing>
-        <property name="title" translatable="yes">Account</property>
-        <property name="complete">False</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkGrid" id="location-page">
-        <property name="name">location-page</property>
-        <property name="visible">True</property>
-        <property name="halign">center</property>
-        <property name="valign">start</property>
-        <property name="hexpand">True</property>
         <child>
-          <object class="GtkLabel" id="location-title">
+          <object class="GtkGrid" id="online-page">
+            <property name="name">online-page</property>
             <property name="visible">True</property>
-            <property name="label" translatable="yes">Choose Your Location</property>
             <property name="halign">center</property>
-            <property name="hexpand">False</property>
-            <property name="valign">start</property>
-            <property name="margin-bottom">18</property>
-            <attributes>
-              <attribute name="weight" value="bold"/>
-              <attribute name="scale" value="1.2"/>
-            </attributes>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
-            <property name="width">2</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkButton" id="location-auto-button">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">_Determine your location automatically</property>
-            <property name="use_underline">True</property>
-            <property name="halign">start</property>
-            <property name="margin-right">24</property>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkFrame" id="location-map-frame">
-            <property name="visible">True</property>
-            <property name="halign">fill</property>
-            <property name="valign">fill</property>
-            <property name="hexpand">True</property>
-            <property name="vexpand">True</property>
-            <property name="margin-top">12</property>
-            <property name="margin-bottom">12</property>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">2</property>
-            <property name="width">2</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkGrid" id="location-info-grid">
-            <property name="visible">True</property>
-            <property name="halign">start</property>
-            <property name="valign">start</property>
-            <property name="row-spacing">12</property>
-            <property name="column-spacing">6</property>
             <child>
-              <object class="GtkLabel" id="location-label">
+              <object class="GtkLabel" id="online-title">
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">Location</property>
-                <property name="halign">end</property>
-                <style>
-                  <class name="dim-label"/>
-                </style>
+                <property name="label" translatable="yes">Online Accounts</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+                <property name="margin-bottom">18</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                  <attribute name="scale" value="1.2"/>
+                </attributes>
               </object>
               <packing>
                 <property name="left_attach">0</property>
                 <property name="top_attach">0</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="current-location-label">
+              <object class="GtkLabel" id="online-subtitle">
                 <property name="visible">True</property>
-                <property name="label">Boston, MA</property>
+                <property name="label" translatable="yes">Associate your new account with your existing online accounts.</property>
                 <property name="halign">start</property>
+                <property name="valign">start</property>
+                <property name="margin-bottom">18</property>
+                <property name="xalign">0.0</property>
+                <property name="wrap">True</property>
+                <property name="width-chars">50</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
               </object>
               <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">0</property>
+                <property name="left_attach">0</property>
+                <property name="top_attach">1</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="timezone-label">
+              <object class="GtkBox" id="online-accounts-list">
+                <property name="orientation">vertical</property>
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">Time Zone</property>
-                <property name="halign">end</property>
-                <style>
-                  <class name="dim-label"/>
-                </style>
               </object>
               <packing>
                 <property name="left_attach">0</property>
-                <property name="top_attach">1</property>
+                <property name="top_attach">2</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="current-timezone-label">
+              <object class="GtkButton" id="online-add-button">
                 <property name="visible">True</property>
-                <property name="label">America / New York</property>
+                <property name="label">_Add Account</property>
+                <property name="use_underline">True</property>
                 <property name="halign">start</property>
+                <property name="valign">start</property>
+                <property name="margin-top">24</property>
               </object>
               <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">1</property>
+                <property name="left_attach">0</property>
+                <property name="top_attach">3</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
           </object>
           <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">3</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="title" translatable="yes">Location</property>
-        <property name="complete">True</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkGrid" id="online-page">
-        <property name="name">online-page</property>
-        <property name="visible">True</property>
-        <property name="halign">center</property>
-        <child>
-          <object class="GtkLabel" id="online-title">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Online Accounts</property>
-            <property name="halign">center</property>
-            <property name="valign">start</property>
-            <property name="margin-bottom">18</property>
-            <attributes>
-              <attribute name="weight" value="bold"/>
-              <attribute name="scale" value="1.2"/>
-            </attributes>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="online-subtitle">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Associate your new account with your existing online accounts.</property>
-            <property name="halign">start</property>
-            <property name="valign">start</property>
-            <property name="margin-bottom">18</property>
-            <property name="xalign">0.0</property>
-            <property name="wrap">True</property>
-            <property name="width-chars">50</property>
-            <attributes>
-              <attribute name="weight" value="bold"/>
-            </attributes>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkBox" id="online-accounts-list">
-            <property name="orientation">vertical</property>
-            <property name="visible">True</property>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">2</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkButton" id="online-add-button">
-            <property name="visible">True</property>
-            <property name="label">_Add Account</property>
-            <property name="use_underline">True</property>
-            <property name="halign">start</property>
-            <property name="valign">start</property>
-            <property name="margin-top">24</property>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">3</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="title" translatable="yes">Online Accounts</property>
-        <property name="complete">True</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkGrid" id="summary-page">
-        <property name="name">summary-page</property>
-        <property name="visible">True</property>
-        <property name="halign">center</property>
-        <child>
-          <object class="GtkLabel" id="summary-title">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Enjoy GNOME!</property>
-            <property name="halign">center</property>
-            <property name="valign">start</property>
-            <property name="margin-bottom">18</property>
-            <attributes>
-              <attribute name="weight" value="bold"/>
-              <attribute name="scale" value="1.2"/>
-            </attributes>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="summary-details">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Your new account is ready to use.</property>
-            <property name="halign">center</property>
-            <property name="valign">start</property>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="summary-details2">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">You may change any of these options at any time in the System Settings.</property>
-            <property name="halign">center</property>
-            <property name="valign">start</property>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">2</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkButton" id="summary-start-button">
-            <property name="visible">True</property>
-            <property name="use-underline">True</property>
-            <property name="label" translatable="yes">_Start using GNOME 3</property>
-            <property name="halign">center</property>
-            <property name="valign">start</property>
-            <property name="vexpand">True</property>
-            <property name="margin">18</property>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">3</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="summary-tour-details">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">New to GNOME 3 and need help finding your way around?</property>
-            <property name="halign">center</property>
-            <property name="valign">start</property>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">4</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
+            <property name="complete">True</property>
           </packing>
         </child>
         <child>
-          <object class="GtkButton" id="summary-tour-button">
+          <object class="GtkGrid" id="summary-page">
+            <property name="name">summary-page</property>
             <property name="visible">True</property>
-            <property name="use-underline">True</property>
-            <property name="label" translatable="yes">_Take a Tour</property>
             <property name="halign">center</property>
-            <property name="valign">start</property>
-            <property name="margin">18</property>
+            <child>
+              <object class="GtkLabel" id="summary-title">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Enjoy GNOME!</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+                <property name="margin-bottom">18</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                  <attribute name="scale" value="1.2"/>
+                </attributes>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">0</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="summary-details">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Your new account is ready to use.</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">1</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="summary-details2">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">You may change any of these options at any time in the System Settings.</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">2</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="summary-start-button">
+                <property name="visible">True</property>
+                <property name="use-underline">True</property>
+                <property name="label" translatable="yes">_Start using GNOME 3</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+                <property name="vexpand">True</property>
+                <property name="margin">18</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">3</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="summary-tour-details">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">New to GNOME 3 and need help finding your way around?</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">4</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="summary-tour-button">
+                <property name="visible">True</property>
+                <property name="use-underline">True</property>
+                <property name="label" translatable="yes">_Take a Tour</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+                <property name="margin">18</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">5</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
+              </packing>
+            </child>
           </object>
           <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">5</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
+            <property name="complete">True</property>
           </packing>
         </child>
       </object>
-      <packing>
-        <property name="title" translatable="yes">Summary</property>
-        <property name="page-type">custom</property>
-      </packing>
     </child>
   </object>
 </interface>



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