+my $current;
+my $pid;
+my $pipeline;
+my $fullscreen = 1;
+my $width;
+my $height;
+
+&reread_directory ();
+
+print STDERR "read ", 0+@files, " files\n" if $verbose;
+if (@files == 0) {
+ warn "techtalk-pse: no files found, continuing anyway ...\n"
+}
+
+my $w = Gtk3::Window->new ("toplevel");
+my $vbox = Gtk3::VBox->new ();
+my $webkit = Gtk3::WebKit::WebView->new ();
+my $vte = Vte::Terminal->new ();
+my $notebook = Gtk3::Notebook->new ();
+my $splash = make_splash_page ();
+my $emptylabel = Gtk3::Label->new ();
+
+my $webkitscroll = Gtk3::ScrolledWindow->new();
+$webkitscroll->add ($webkit);
+$webkitscroll->set_policy('automatic', 'automatic');
+
+my $webkitpage = $notebook->append_page ($webkitscroll);
+my $shpage = $notebook->append_page ($emptylabel);
+my $vtepage = $notebook->append_page ($vte);
+my $splashpage = $notebook->append_page ($splash);
+
+my ($bbox, $bquit, $breload, $bnext, $bback, $brestart) = make_button_bar ();
+
+$vbox->pack_start($bbox, 0, 0, 0);
+$vbox->pack_start($notebook, 1, 1, 0);
+
+$notebook->set_show_tabs(0);
+$notebook->set_show_border(0);
+
+# Default font size is almost certainly too small
+# for audience to see.
+# XXX we should make font size configurable via
+# @ARGV.
+# XXX any way we can scale WebKit programmatically
+# to set base size which CSS is relative to ?
+# NB careful setting it too big, because it will
+# force a min size on the terminal. Scaling 1.3
+# is biggest we can do while fitting 1024x768
+$vte->set_font_scale(1.3);
+
+# When an external command exits, automatically
+# go to the next slide
+$vte->signal_connect (
+ 'child-exited' => sub {
+ if ($pid) {
+ $pid = 0;
+ &switch_slide("NEXT");
+ }
+ });
+
+# Exit if the window is closed
+$w->signal_connect (
+ destroy => sub {
+ Gtk3::main_quit;
+ return FALSE;
+ });
+
+$w->signal_connect (
+ 'window-state-event' => sub {
+ if (!$fullscreen) {
+ $w->resize ($width, $height);
+ $w->move (500, 500);
+ }
+ return FALSE;
+ });
+
+
+# Handle left/right arrows, page up/down & home/end
+# as slide navigation commands. But not when there
+# is a shell running
+$w->signal_connect (
+ 'key-press-event' => sub {
+ my $src = shift;
+ my $ev = shift;
+
+ # If a shell is running, don't trap keys
+ if ($pid) {
+ return 0;
+ }
+
+ if ($ev->keyval == &Gtk3::Gdk::KEY_Right ||
+ $ev->keyval == &Gtk3::Gdk::KEY_Page_Down) {
+ &switch_slide("NEXT");
+ return 1;
+ } elsif ($ev->keyval == &Gtk3::Gdk::KEY_Left ||
+ $ev->keyval == &Gtk3::Gdk::KEY_Page_Up) {
+ &switch_slide("PREV");
+ return 1;
+ } elsif ($ev->keyval == &Gtk3::Gdk::KEY_Home) {
+ &switch_slide("FIRST");
+ return 1;
+ } elsif ($ev->keyval == &Gtk3::Gdk::KEY_End) {
+ &switch_slide("LAST");
+ return 1;
+ } elsif ($ev->keyval == &Gtk3::Gdk::KEY_q ||
+ $ev->keyval == &Gtk3::Gdk::KEY_Escape) {
+ Gtk3::main_quit;
+ return 1;
+ }
+ return 0;
+ });
+
+
+$w->add ($vbox);
+
+$w->show_all ();
+window_fullscreen ();
+
+&update_slide();
+
+Gtk3::main();
+
+exit 0;
+