Viewing file: session-management.pl (3.61 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/perl -w use strict; use Gnome2;
# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gnome2/examples/session-management.pl,v 1.1 2003/12/10 21:13:17 kaffeetisch Exp $
my $application = Gnome2::Program -> init("Test", "0.1", "libgnomeui"); my $client = Gnome2::Client -> master();
###############################################################################
$client -> signal_connect(die => sub { # No time to save anything, just die. Gtk2 -> main_quit(); });
$client -> signal_connect(save_yourself => sub { my ($client, $phase, $save_style, $shutting_down, $interact_style, $fast) = @_;
if ($fast) { # We're in a hurry, so don't do anything that takes ages. unless (save_session_quickly()) { error("Saving session failed.") if ($interact_style & "error"); return 0; } } else { # We've plenty of time. unless (save_session()) { if ($interact_style & "any") { question("Couldn't save session. Do you want me to " . "delete all your personal files in response?", sub { delete_all_personal_files(); }); } elsif ($interact_style & "error") { error("Saving session failed."); }
return 0; } }
return 1; });
###############################################################################
my $app = Gnome2::App -> new("test", "Test"); my $box = Gtk2::VBox -> new(0, 0);
my $button_die = Gtk2::Button -> new("_Die"); my $button_save = Gtk2::Button -> new("_Save"); my $button_save_quickly = Gtk2::Button -> new("Save quickly");
# Normally, those events are fired by the session manager when the user logs # out or kills the application via the session UI. We emulate them here. $button_die -> signal_connect(clicked => sub { $client -> signal_emit("die"); });
$button_save -> signal_connect(clicked => sub { $client -> request_save("local", 0, "any", 0, 0); });
$button_save_quickly -> signal_connect(clicked => sub { $client -> request_save("local", 0, "errors", 1, 0); });
$box -> pack_start($button_die, 0, 0, 0); $box -> pack_start($button_save, 0, 0, 0); $box -> pack_start($button_save_quickly, 0, 0, 0);
$app -> set_contents($box); $app -> show_all();
$app -> signal_connect(destroy => sub { Gtk2 -> main_quit(); });
Gtk2 -> main();
###############################################################################
sub delete_all_personal_files { $| = 1; print "Deleting all personal files ..."; select(undef, undef, undef, 0.25); print " done.\n"; }
sub error { my ($label) = @_;
my $dialog = Gtk2::MessageDialog -> new($app, [qw(modal destroy-with-parent)], "error", "ok", $label);
$dialog -> signal_connect(response => sub { my ($dialog, $response) = @_; $dialog -> hide(); });
$client -> save_error_dialog($dialog); }
sub question { my ($label, $callback) = @_;
my $dialog = Gtk2::MessageDialog -> new($app, [qw(modal destroy-with-parent)], "question", "yes-no", $label);
$dialog -> signal_connect(response => sub { my ($dialog, $response) = @_; $callback -> () if ($response eq "yes"); $dialog -> hide(); });
$client -> save_any_dialog($dialog); }
sub save_session { select(undef, undef, undef, 0.5); return int(rand(2)); }
sub save_session_quickly { select(undef, undef, undef, 0.1); return int(rand(2)); }
|