- # Run a shell command.
- elsif ($slide->{ext} eq "sh") {
- my $pid;
- # http://docstore.mik.ua/orelly/perl/cookbook/ch10_17.htm
- local *run_process = sub {
- $pid = fork ();
- die "fork: $!" unless defined $pid;
- unless ($pid) {
- # Child.
- POSIX::setsid ();
- exec ("./".$slide->{name});
- die "failed to execute command: ", $slide->{name}, ": $!";
- }
- # Parent returns.
- };
- local *kill_process = sub {
- print STDERR "sending TERM signal to process group $pid\n"
- if $verbose;
- kill "TERM", -$pid;
- };
- run_process ();
-
- my $r = "NEXT";
-
- my $w = Gtk2::Window->new ();
-
- my $s = $w->get_screen;
- $w->set_default_size ($s->get_width, -1);
- $w->move (0, 0);
- $w->set_decorated (0);
-
- my $bbox = Gtk2::HButtonBox->new ();
- $bbox->set_layout ('start');
-
- my $bnext = Gtk2::Button->new ("Next slide");
- $bnext->signal_connect (clicked => sub { $r = "NEXT"; $w->destroy });
- $bnext->set_sensitive (!(exists $slide->{last}));
- $bbox->add ($bnext);
-
- my $bback = Gtk2::Button->new ("Back");
- $bback->signal_connect (clicked => sub { $r = "PREV"; $w->destroy });
- $bback->set_sensitive (!(exists $slide->{first}));
- $bbox->add ($bback);
-
- my $brestart = Gtk2::Button->new ("Kill & restart");
- $brestart->signal_connect (clicked => sub {
- kill_process ();
- run_process ();
- });
- $bbox->add ($brestart);
-
- my $bquit = Gtk2::Button->new ("Quit");
- $bquit->signal_connect (clicked => sub { $r = "QUIT"; $w->destroy });
- $bbox->add ($bquit);
- $bbox->set_child_secondary ($bquit, 1);
-
- $w->add ($bbox);
-
- $w->signal_connect (destroy => sub {
- Gtk2->main_quit;
- return FALSE;
- });
- $w->show_all ();
-
- Gtk2->main;
-
- kill_process ();
- print STDERR "returning r=$r\n" if $verbose;
- return $r;
+
+ if (defined $current) {
+ $bquit->hide ();
+ $breload->hide ();
+ $bnext->set_sensitive (1);
+ $bback->set_sensitive (!exists $current->{first});
+ } else {
+ $bquit->show ();
+ if (@files) {
+ $breload->hide ();
+ } else {
+ $breload->show ();
+ }
+ $bnext->set_sensitive (0);
+ $bback->set_sensitive (int(@files));
+ }
+}
+
+
+sub make_splash_page {
+ my $box = Gtk2::VBox->new();
+
+ my $title = Gtk2::Label->new ("<b><span size='x-large'>Tech Talk Platinum Supreme Edition (PSE)</span></b>");
+ $title->set_use_markup (1);
+
+ $box->pack_start ($title, 0, 1, 0);
+
+ my $vers = Gtk2::Label->new ("<b><span size='large'>@VERSION@</span></b>");
+ $vers->set_use_markup (1);
+ $box->pack_start ($vers, 0, 1, 0);
+
+ my $tagline = Gtk2::Label->new ("<i><span size='large'>Superior technical demonstration software</span></i>");
+ $tagline->set_use_markup (1);
+
+ $box->pack_start ($tagline, 0, 1, 0);
+ $box->pack_start (Gtk2::Label->new (""), 0, 1, 0);
+ $box->pack_start (Gtk2::Label->new ("Author: Richard W.M. Jones"), 0, 1, 0);
+
+ my $url = Gtk2::Label->new ("<a href='http://people.redhat.com/~rjones'>http;//people.redhat.com/~rjones/</a>");
+ $url->set_use_markup (1);
+ $box->pack_start ($url, 0, 1, 0);
+ $box->pack_start (Gtk2::Label->new ("GNU General Public License v2 or above"), 0, 1, 0);
+
+ return $box;
+}
+
+# Make the standard button bar across the top of the page.
+sub make_button_bar
+{
+ my $bbox = Gtk2::Toolbar->new ();
+ $bbox->set_style ("GTK_TOOLBAR_TEXT");
+
+ my $i = 0;
+
+ my $bquit = Gtk2::ToolButton->new (undef, "Quit");
+ $bquit->signal_connect (clicked => sub { Gtk2->main_quit });
+ $bbox->insert ($bquit, $i++);
+
+ my $breload = Gtk2::ToolButton->new (undef, "Reload");
+ $breload->signal_connect (clicked => sub { reread_directory () });
+ $bbox->insert ($breload, $i++);
+
+ my $bnext = Gtk2::ToolButton->new (undef, "Next slide");
+ $bnext->signal_connect (clicked => sub { &switch_slide ("NEXT") });
+ $bbox->insert ($bnext, $i++);
+
+ my $bback = Gtk2::ToolButton->new (undef, "Back");
+ $bback->signal_connect (clicked => sub { &switch_slide ("PREV") });
+ $bbox->insert ($bback, $i++);
+
+ $bbox->insert (Gtk2::SeparatorToolItem->new (), $i++);
+
+ my $brestart = Gtk2::ToolButton->new (undef, "Kill & restart");
+ $brestart->signal_connect (clicked =>
+ sub {
+ kill_process ();
+ run_process ();
+ });
+ $bbox->insert ($brestart, $i++);
+
+ my $sep = Gtk2::SeparatorToolItem->new ();
+ $sep->set_expand (TRUE);
+ $sep->set_draw (FALSE);
+ $bbox->insert ($sep, $i++);
+
+ my $optsmenu = Gtk2::Menu->new ();
+
+ my $mfirst = Gtk2::MenuItem->new ("First slide");
+ $mfirst->signal_connect (activate => sub { &switch_slide ("FIRST") });
+ $mfirst->show ();
+ $optsmenu->append ($mfirst);
+
+ my $mlast = Gtk2::MenuItem->new ("Last slide");
+ $mlast->signal_connect (activate => sub { &switch_slide ("LAST") });
+ $mlast->show ();
+ $optsmenu->append ($mlast);
+
+ my $slidesmenu = Gtk2::Menu->new ();
+ foreach (@files) {
+ my $item = Gtk2::MenuItem->new ($_->{name});
+ my $index = $_->{i};
+ $item->signal_connect (activate => sub { &switch_slide ("I_$index") });
+ $item->set_sensitive ($current->{i} != $index);
+ $item->show ();
+ $slidesmenu->append ($item);