summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Moskovcak <jmoskovc@redhat.com>2011-02-13 23:00:40 +0100
committerJiri Moskovcak <jmoskovc@redhat.com>2011-02-13 23:00:40 +0100
commit3e1cef334960780cbea2aa8be8ce23eb7e8068fe (patch)
treeb77696eb75910773cb936a43ef038a4c794b9a89
parent3c53ecbea96ef837a64edb9fcdd4777c58dacb52 (diff)
downloadabrt-3e1cef334960780cbea2aa8be8ce23eb7e8068fe.tar.gz
abrt-3e1cef334960780cbea2aa8be8ce23eb7e8068fe.tar.xz
abrt-3e1cef334960780cbea2aa8be8ce23eb7e8068fe.zip
gtk wizard
-rw-r--r--abrt.spec11
-rw-r--r--configure.ac1
-rw-r--r--src/Makefile.am2
-rw-r--r--src/gtk-wizard/Makefile.am35
-rw-r--r--src/gtk-wizard/main.c18
-rw-r--r--src/gtk-wizard/wizard.c122
-rw-r--r--src/gtk-wizard/wizard.glade455
-rw-r--r--src/gtk-wizard/wizard.h1
8 files changed, 644 insertions, 1 deletions
diff --git a/abrt.spec b/abrt.spec
index 9cccc305..19ad99bd 100644
--- a/abrt.spec
+++ b/abrt.spec
@@ -86,6 +86,13 @@ Group: System Environment/Libraries
%description -n libreport-python
Python bindings for report-libs.
+%package -n libreport-gtk
+Summary: GTK frontend for libreport
+Group: User Interface/Desktops
+
+%description -n libreport-gtk
+Applications for reporting bugs using libreport backend.
+
%package libs
Summary: Libraries for %{name}
Group: System Environment/Libraries
@@ -402,6 +409,10 @@ fi
%defattr(-,root,root,-)
%{python_sitearch}/report/*
+%files -n libreport-gtk
+%defattr(-,root,root,-)
+%{_bindir}/bug-reporting-wizard
+
%files libs
%defattr(-,root,root,-)
%{_libdir}/libabrt*.so.*
diff --git a/configure.ac b/configure.ac
index 70ce285f..b78c9768 100644
--- a/configure.ac
+++ b/configure.ac
@@ -133,6 +133,7 @@ AC_CONFIG_FILES([
src/applet/Makefile
src/gui/Makefile
src/gui-gtk/Makefile
+ src/gtk-wizard/Makefile
src/cli/Makefile
po/Makefile.in
icons/Makefile
diff --git a/src/Makefile.am b/src/Makefile.am
index 638d91ce..61410d6d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1 +1 @@
-SUBDIRS = include lib report-python hooks btparser daemon applet gui gui-gtk cli plugins
+SUBDIRS = include lib report-python hooks btparser daemon applet gui gui-gtk cli plugins gtk-wizard
diff --git a/src/gtk-wizard/Makefile.am b/src/gtk-wizard/Makefile.am
new file mode 100644
index 00000000..c199ad01
--- /dev/null
+++ b/src/gtk-wizard/Makefile.am
@@ -0,0 +1,35 @@
+bin_PROGRAMS = bug-reporting-wizard
+
+bug_reporting_wizard_SOURCES = \
+ wizard.h wizard.c \
+ main.c
+
+#-Wl,--export-dynamic and lgmodule-2.0
+#is required for gtk_builder_connect_signals() to work correctly
+bug_reporting_wizard_CFLAGS = \
+ -I$(srcdir)/../include/report -I$(srcdir)/../include \
+ -I$(srcdir)/../lib \
+ -DBIN_DIR=\"$(bindir)\" \
+ -DVAR_RUN=\"$(VAR_RUN)\" \
+ -DCONF_DIR=\"$(CONF_DIR)\" \
+ -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
+ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
+ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ -DICON_DIR=\"${datadir}/abrt/icons/hicolor/48x48/status\" \
+ $(GTK_CFLAGS) \
+ -D_GNU_SOURCE \
+ -g \
+ -Wl,--export-dynamic \
+ -Wall -Werror
+
+bug_reporting_wizard_LDADD = \
+ ../lib/libreport.la \
+ ../lib/libabrt_dbus.la \
+ -lglib-2.0 \
+ -lgthread-2.0 \
+ -lgmodule-2.0 \
+ $(GTK_LIBS)
+
+DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
+
+@INTLTOOL_DESKTOP_RULE@
diff --git a/src/gtk-wizard/main.c b/src/gtk-wizard/main.c
new file mode 100644
index 00000000..0206d020
--- /dev/null
+++ b/src/gtk-wizard/main.c
@@ -0,0 +1,18 @@
+#include <gtk/gtk.h>
+#include "abrtlib.h"
+#include "parse_options.h"
+#include "wizard.h"
+
+int main(int argc, char **argv)
+{
+ //GtkWidget *assistant;
+
+ gtk_init(&argc, &argv);
+
+ GtkWidget *assistant = create_assistant();
+ gtk_widget_show_all(assistant);
+
+ /* Enter main loop */
+ gtk_main();
+ return 0;
+} \ No newline at end of file
diff --git a/src/gtk-wizard/wizard.c b/src/gtk-wizard/wizard.c
new file mode 100644
index 00000000..2f04ea65
--- /dev/null
+++ b/src/gtk-wizard/wizard.c
@@ -0,0 +1,122 @@
+#include <gtk/gtk.h>
+#include "abrtlib.h"
+
+/* THE PAGE FLOW
+ * page_1: analyze action selection
+ * page_2: analyze progress
+ * page_3: reporter selection
+ * page_4: backtrace editor
+ * page_5: how to + user comments
+ * page_6: summary
+ * page_7: reporting progress
+ */
+
+#define PAGE_ANALYZE_ACTION_SELECTOR "page_1"
+#define PAGE_ANALYZE_PROGRESS "page_2"
+#define PAGE_REPORTER_SELECTOR "page_3"
+#define PAGE_BACKTRACE_APPROVAL "page_4"
+#define PAGE_HOWTO "page_5"
+#define PAGE_SUMMARY "page_6"
+#define PAGE_REPORT "page_7"
+
+
+#define DEFAULT_WIDTH 800
+#define DEFAULT_HEIGHT 500
+
+gchar *pages[] =
+ { "page_1",
+ "page_2",
+ "page_3",
+ "page_4",
+ "page_5",
+ "page_6",
+ "page_7",
+ NULL
+ };
+
+GtkBuilder *builder;
+GtkWidget *assistant;
+
+void on_b_refresh_clicked(GtkButton *button)
+{
+ g_print("Refresh clicked!\n");
+}
+
+void add_pages()
+{
+
+ GError *error = NULL;
+ gtk_builder_add_objects_from_file(builder, "wizard.glade", pages, &error);
+ if(error != NULL)
+ {
+ g_print(error->message);
+ g_free(error);
+ }
+
+ GtkWidget *page;
+ gchar **page_names;
+ for(page_names = pages; *page_names != NULL; page_names++)
+ {
+ page = GTK_WIDGET(gtk_builder_get_object(builder, *page_names));
+ if(page == NULL)
+ continue;
+
+ gtk_assistant_append_page(GTK_ASSISTANT(assistant), page);
+ //FIXME: shouldn't be complete until something is selected!
+ gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant), page, true);
+ if(strcmp(PAGE_ANALYZE_ACTION_SELECTOR, *page_names) == 0)
+ {
+ gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), page, "Select analyzer");
+ gtk_assistant_set_page_type(GTK_ASSISTANT(assistant), page, GTK_ASSISTANT_PAGE_INTRO);
+
+ }
+ if(strcmp(PAGE_ANALYZE_PROGRESS, *page_names) == 0)
+ {
+ gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), page, "Analyzing problem");
+ gtk_assistant_set_page_type(GTK_ASSISTANT(assistant), page, GTK_ASSISTANT_PAGE_PROGRESS);
+ }
+ if(strcmp(PAGE_REPORTER_SELECTOR, *page_names) == 0)
+ {
+ gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), page, "Select reporter");
+ gtk_assistant_set_page_type(GTK_ASSISTANT(assistant), page, GTK_ASSISTANT_PAGE_CONTENT);
+ }
+ if(strcmp(PAGE_BACKTRACE_APPROVAL, *page_names) == 0)
+ {
+ gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), page, "Approve the backtrace");
+ gtk_assistant_set_page_type(GTK_ASSISTANT(assistant), page, GTK_ASSISTANT_PAGE_CONTENT);
+ }
+
+ if(strcmp(PAGE_HOWTO, *page_names) == 0)
+ {
+ gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), page, "Provide additional information");
+ gtk_assistant_set_page_type(GTK_ASSISTANT(assistant), page, GTK_ASSISTANT_PAGE_CONTENT);
+ }
+
+ if(strcmp(PAGE_SUMMARY, *page_names) == 0)
+ {
+ gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), page, "Confirm and send the report");
+ gtk_assistant_set_page_type(GTK_ASSISTANT(assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
+ }
+
+ if(strcmp(PAGE_REPORT, *page_names) == 0)
+ {
+ gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), page, "Approve the backtrace");
+ gtk_assistant_set_page_type(GTK_ASSISTANT(assistant), page, GTK_ASSISTANT_PAGE_SUMMARY);
+ }
+ g_print("added page: %s\n", *page_names);
+ }
+}
+
+GtkWidget *create_assistant()
+{
+ assistant = gtk_assistant_new();
+ gtk_window_set_default_size(GTK_WINDOW(assistant), DEFAULT_WIDTH,DEFAULT_HEIGHT);
+ g_signal_connect(G_OBJECT(assistant), "cancel", G_CALLBACK(gtk_main_quit), NULL);
+ g_signal_connect(G_OBJECT(assistant), "close", G_CALLBACK(gtk_main_quit), NULL);
+ builder = gtk_builder_new();
+ add_pages();
+ gtk_builder_connect_signals(builder, NULL);
+
+
+ return assistant;
+} \ No newline at end of file
diff --git a/src/gtk-wizard/wizard.glade b/src/gtk-wizard/wizard.glade
new file mode 100644
index 00000000..ed81cb5d
--- /dev/null
+++ b/src/gtk-wizard/wizard.glade
@@ -0,0 +1,455 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkWindow" id="window1">
+ <property name="width_request">750</property>
+ <property name="height_request">400</property>
+ <child>
+ <object class="GtkVBox" id="page_1">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="xalign">0.05000000074505806</property>
+ <property name="yalign">0.05000000074505806</property>
+ <property name="label" translatable="yes">It looks like an application from the package &lt;b&gt;APPLICATION&lt;/b&gt; has crashed on your system. It is a good idea to send a bug report about this issue. The report will provide software maintainers with information essential in figuring out how to provide a bug fix for you.
+
+Please review the information that follows and modify it as needed to ensure your bug report does not contain any sensitive data you would rather not share.
+
+Select where you would like to analyze the bug, and press 'Forward' to continue.</property>
+ <property name="use_markup">True</property>
+ <property name="width_chars">80</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vb_analyzers">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkRadioButton" id="radiobutton1">
+ <property name="label" translatable="yes">Analyzer 1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="radiobutton2">
+ <property name="label" translatable="yes">Analyzer 2</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">radiobutton1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="radiobutton3">
+ <property name="label" translatable="yes">Analyzer 3</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">radiobutton1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window2">
+ <property name="width_request">750</property>
+ <property name="height_request">400</property>
+ <child>
+ <object class="GtkVBox" id="page_2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="xalign">0.05000000074505806</property>
+ <property name="yalign">0.05000000074505806</property>
+ <property name="label" translatable="yes">Please wait while ABRT is analyzing the problem...</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTextView" id="analyze_log">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ <property name="accepts_tab">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkProgressBar" id="pb_analyze">
+ <property name="visible">True</property>
+ <property name="activity_mode">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window3">
+ <property name="width_request">750</property>
+ <property name="height_request">400</property>
+ <child>
+ <object class="GtkVBox" id="page_3">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="xalign">0.05000000074505806</property>
+ <property name="yalign">0.05000000074505806</property>
+ <property name="label" translatable="yes">
+Select where you would like to report the bug, and press 'Forward' to continue.</property>
+ <property name="use_markup">True</property>
+ <property name="width_chars">80</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vb_analyzers1">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton4">
+ <property name="label" translatable="yes">reporter_1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton5">
+ <property name="label" translatable="yes">Reporter 2</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton6">
+ <property name="label" translatable="yes">Reporter 3</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window4">
+ <property name="width_request">750</property>
+ <property name="height_request">400</property>
+ <child>
+ <object class="GtkVBox" id="page_4">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="xalign">0.05000000074505806</property>
+ <property name="yalign">0.05000000074505806</property>
+ <property name="label" translatable="yes">Below is the backtrace associated with your crash. A crash backtrace provides developers with details about how the crash happened, helping them track down the source of the problem.
+Please review the backtrace below and modify it as needed to ensure your bug report does not contain any sensitive data you would rather not share:</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTextView" id="textview1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkEntry" id="entry1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="secondary_icon_stock">gtk-find</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkArrow" id="arrow1">
+ <property name="visible">True</property>
+ <property name="arrow_type">up</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkArrow" id="arrow2">
+ <property name="visible">True</property>
+ <property name="arrow_type">down</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkButton" id="b_refresh">
+ <property name="label" translatable="yes">Refresh</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_b_refresh_clicked"/>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="b_copy">
+ <property name="label" translatable="yes">Copy</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton1">
+ <property name="label" translatable="yes">I agree with submitting the backtrace</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window5">
+ <child>
+ <object class="GtkVBox" id="page_5">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Page 5</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window6">
+ <child>
+ <object class="GtkVBox" id="page_6">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Page 6</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="window7">
+ <child>
+ <object class="GtkVBox" id="page_7">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Page 7</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/src/gtk-wizard/wizard.h b/src/gtk-wizard/wizard.h
new file mode 100644
index 00000000..daa25eeb
--- /dev/null
+++ b/src/gtk-wizard/wizard.h
@@ -0,0 +1 @@
+GtkWidget *create_assistant(void);