307 lines
7.3 KiB
Perl
307 lines
7.3 KiB
Perl
|
|
#!/usr/bin/perl -w
|
||
|
|
# This file was preprocessed, do not edit!
|
||
|
|
|
||
|
|
|
||
|
|
package Debconf::FrontEnd::Gnome;
|
||
|
|
use strict;
|
||
|
|
use utf8;
|
||
|
|
use Debconf::Gettext;
|
||
|
|
use Debconf::Config;
|
||
|
|
use Debconf::Encoding qw(to_Unicode);
|
||
|
|
use base qw{Debconf::FrontEnd};
|
||
|
|
|
||
|
|
|
||
|
|
our @ARGV_for_gnome=('--sm-disable');
|
||
|
|
|
||
|
|
sub create_assistant_page {
|
||
|
|
my $this=shift;
|
||
|
|
|
||
|
|
$this->assistant_page(Gtk3::VBox->new);
|
||
|
|
$this->assistant->append_page($this->assistant_page);
|
||
|
|
|
||
|
|
if ($this->logo) {
|
||
|
|
$this->assistant->set_page_header_image($this->assistant_page, $this->logo);
|
||
|
|
}
|
||
|
|
|
||
|
|
$this->configure_assistant_page;
|
||
|
|
$this->assistant_page->show_all;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub configure_assistant_page {
|
||
|
|
my $this=shift;
|
||
|
|
|
||
|
|
$this->assistant->set_page_title($this->assistant_page, to_Unicode($this->title));
|
||
|
|
$this->assistant->set_page_type($this->assistant_page, 'custom');
|
||
|
|
$this->forward_button->grab_default;
|
||
|
|
$this->forward_button->show;
|
||
|
|
if ($this->capb_backup) {
|
||
|
|
$this->back_button->show;
|
||
|
|
} else {
|
||
|
|
$this->back_button->hide;
|
||
|
|
}
|
||
|
|
$this->assistant->set_page_complete($this->assistant_page, 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
sub reset_assistant_page {
|
||
|
|
my $this=shift;
|
||
|
|
|
||
|
|
$this->assistant_page($this->assistant->get_nth_page($this->assistant->get_current_page));
|
||
|
|
foreach my $element ($this->assistant_page->get_children) {
|
||
|
|
$this->assistant_page->remove($element);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
my $prev_page = 0;
|
||
|
|
|
||
|
|
sub prepare_callback {
|
||
|
|
my ($assistant, $page, $this) = @_;
|
||
|
|
my $current_page = $assistant->get_current_page;
|
||
|
|
|
||
|
|
if ($prev_page < $current_page) {
|
||
|
|
$this->goback(0);
|
||
|
|
if (Gtk3::main_level()) {
|
||
|
|
Gtk3::main_quit();
|
||
|
|
}
|
||
|
|
} elsif ($prev_page > $current_page) {
|
||
|
|
$this->goback(1);
|
||
|
|
if (Gtk3::main_level()) {
|
||
|
|
Gtk3::main_quit();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$prev_page = $current_page;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub close_callback {
|
||
|
|
my ($assistant) = @_;
|
||
|
|
|
||
|
|
my $title = gettext("Really quit configuration?");
|
||
|
|
my $text = gettext("If you quit this configuration dialog, then the package being configured will probably fail to install, and you may have to fix it manually. This may be especially difficult if you are in the middle of a large upgrade.")."\n\n".gettext("You may need to quit anyway if you are stuck in a configuration loop due to a buggy package.")."\n";
|
||
|
|
my $quit = gettext("_Quit");
|
||
|
|
my $continue = gettext("Continue");
|
||
|
|
|
||
|
|
my $dialog = Gtk3::Dialog->new_with_buttons(to_Unicode($title),
|
||
|
|
$assistant, "modal",
|
||
|
|
to_Unicode($quit), "yes",
|
||
|
|
to_Unicode($continue),
|
||
|
|
"no");
|
||
|
|
$dialog->set_default_response("no");
|
||
|
|
$dialog->set_border_width(3);
|
||
|
|
|
||
|
|
my $grid = Gtk3::Grid->new();
|
||
|
|
$grid->set_orientation("horizontal");
|
||
|
|
$grid->set_column_homogeneous(0);
|
||
|
|
$dialog->get_content_area->pack_start($grid, 1, 1, 5);
|
||
|
|
$grid->show;
|
||
|
|
|
||
|
|
my $alignment = Gtk3::Alignment->new(0.5, 0.0, 1.0, 0.0);
|
||
|
|
$grid->add($alignment);
|
||
|
|
$alignment->show;
|
||
|
|
|
||
|
|
my $image = Gtk3::Image->new_from_icon_name("dialog-information", "dialog");
|
||
|
|
$alignment->add($image);
|
||
|
|
$image->show;
|
||
|
|
|
||
|
|
my $label = Gtk3::Label->new(to_Unicode($text));
|
||
|
|
$label->set_line_wrap(1);
|
||
|
|
$grid->add($label);
|
||
|
|
$label->show;
|
||
|
|
|
||
|
|
my $response = $dialog->run;
|
||
|
|
$dialog->destroy;
|
||
|
|
|
||
|
|
exit 1 if $response eq "yes";
|
||
|
|
}
|
||
|
|
|
||
|
|
sub delete_event_callback {
|
||
|
|
my ($assistant, $event) = @_;
|
||
|
|
|
||
|
|
close_callback($assistant);
|
||
|
|
}
|
||
|
|
|
||
|
|
sub forward_page_func {
|
||
|
|
my ($current_page, $assistant) = @_;
|
||
|
|
|
||
|
|
return $current_page + 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub on_forward {
|
||
|
|
my ($button) = @_;
|
||
|
|
|
||
|
|
my $assistant = $button->get_ancestor("Gtk3::Assistant");
|
||
|
|
$assistant->next_page;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub on_back {
|
||
|
|
my ($button) = @_;
|
||
|
|
|
||
|
|
my $assistant = $button->get_ancestor("Gtk3::Assistant");
|
||
|
|
$assistant->previous_page;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub init {
|
||
|
|
my $this=shift;
|
||
|
|
|
||
|
|
if (fork) {
|
||
|
|
wait(); # for child
|
||
|
|
if ($? != 0) {
|
||
|
|
die "DISPLAY problem?\n";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
use Gtk3;
|
||
|
|
|
||
|
|
@ARGV=@ARGV_for_gnome; # temporary change at first
|
||
|
|
Gtk3->init;
|
||
|
|
|
||
|
|
my $window = Gtk3::Window->new('toplevel');
|
||
|
|
|
||
|
|
exit(0); # success
|
||
|
|
}
|
||
|
|
|
||
|
|
eval q{use Gtk3;};
|
||
|
|
die "Unable to load Gtk -- is libgtk3-perl installed?\n" if $@;
|
||
|
|
|
||
|
|
my @gnome_sucks=@ARGV;
|
||
|
|
@ARGV=@ARGV_for_gnome;
|
||
|
|
Gtk3->init;
|
||
|
|
@ARGV=@gnome_sucks;
|
||
|
|
|
||
|
|
$this->SUPER::init(@_);
|
||
|
|
$this->interactive(1);
|
||
|
|
$this->capb('backup');
|
||
|
|
$this->need_tty(0);
|
||
|
|
|
||
|
|
$this->assistant(Gtk3::Assistant->new);
|
||
|
|
$this->assistant->set_position("center");
|
||
|
|
$this->assistant->set_default_size(600, 400);
|
||
|
|
my $hostname = `hostname`;
|
||
|
|
chomp $hostname;
|
||
|
|
$this->assistant->set_title(to_Unicode(sprintf(gettext("Debconf on %s"), $hostname)));
|
||
|
|
$this->assistant->signal_connect("delete_event", \&delete_event_callback);
|
||
|
|
|
||
|
|
my $distribution='';
|
||
|
|
if (system('type lsb_release >/dev/null 2>&1') == 0) {
|
||
|
|
$distribution=lc(`lsb_release -is`);
|
||
|
|
chomp $distribution;
|
||
|
|
} elsif (-e '/etc/debian_version') {
|
||
|
|
$distribution='debian';
|
||
|
|
}
|
||
|
|
|
||
|
|
my $logo="/usr/share/pixmaps/$distribution-logo.png";
|
||
|
|
if (-e $logo) {
|
||
|
|
$this->logo(Gtk3::Gdk::Pixbuf->new_from_file($logo));
|
||
|
|
}
|
||
|
|
|
||
|
|
$this->assistant->signal_connect("close", \&close_callback);
|
||
|
|
$this->assistant->signal_connect("prepare", \&prepare_callback, $this);
|
||
|
|
$this->assistant->set_forward_page_func(\&forward_page_func, $this->assistant);
|
||
|
|
|
||
|
|
$this->forward_button(Gtk3::Button->new_with_mnemonic(to_Unicode(gettext("_Next"))));
|
||
|
|
$this->forward_button->set_can_focus(1);
|
||
|
|
$this->forward_button->set_can_default(1);
|
||
|
|
$this->forward_button->set_receives_default(1);
|
||
|
|
$this->forward_button->signal_connect("clicked", \&on_forward);
|
||
|
|
$this->assistant->add_action_widget($this->forward_button);
|
||
|
|
|
||
|
|
$this->back_button(Gtk3::Button->new_with_mnemonic(to_Unicode(gettext("_Back"))));
|
||
|
|
$this->back_button->set_can_focus(1);
|
||
|
|
$this->back_button->set_receives_default(1);
|
||
|
|
$this->back_button->signal_connect("clicked", \&on_back);
|
||
|
|
$this->assistant->add_action_widget($this->back_button);
|
||
|
|
|
||
|
|
$this->create_assistant_page();
|
||
|
|
|
||
|
|
$this->assistant->show;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
sub go {
|
||
|
|
my $this=shift;
|
||
|
|
my @elements=@{$this->elements};
|
||
|
|
|
||
|
|
$this->reset_assistant_page;
|
||
|
|
|
||
|
|
my $interactive='';
|
||
|
|
foreach my $element (@elements) {
|
||
|
|
next unless $element->hbox;
|
||
|
|
|
||
|
|
$interactive=1;
|
||
|
|
$this->assistant_page->pack_start($element->hbox, $element->fill, $element->expand, 0);
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($interactive) {
|
||
|
|
$this->configure_assistant_page;
|
||
|
|
if ($this->assistant->get_current_page == $this->assistant->get_n_pages - 1) {
|
||
|
|
$this->create_assistant_page();
|
||
|
|
}
|
||
|
|
Gtk3::main();
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach my $element (@elements) {
|
||
|
|
$element->show;
|
||
|
|
}
|
||
|
|
|
||
|
|
return '' if $this->goback;
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub progress_start {
|
||
|
|
my $this=shift;
|
||
|
|
$this->SUPER::progress_start(@_);
|
||
|
|
|
||
|
|
$this->reset_assistant_page;
|
||
|
|
|
||
|
|
my $element=$this->progress_bar;
|
||
|
|
$this->assistant_page->pack_start($element->hbox, $element->fill, $element->expand, 0);
|
||
|
|
$this->configure_assistant_page;
|
||
|
|
if ($this->assistant->get_current_page == $this->assistant->get_n_pages - 1) {
|
||
|
|
$this->create_assistant_page();
|
||
|
|
}
|
||
|
|
$this->assistant->set_page_complete($this->assistant_page, 0);
|
||
|
|
$this->assistant->show_all;
|
||
|
|
|
||
|
|
while (Gtk3::events_pending()) {
|
||
|
|
Gtk3::main_iteration();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
sub progress_set {
|
||
|
|
my $this=shift;
|
||
|
|
|
||
|
|
my $ret=$this->SUPER::progress_set(@_);
|
||
|
|
|
||
|
|
while (Gtk3::events_pending()) {
|
||
|
|
Gtk3::main_iteration();
|
||
|
|
}
|
||
|
|
|
||
|
|
return $ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub progress_info {
|
||
|
|
my $this=shift;
|
||
|
|
my $ret=$this->SUPER::progress_info(@_);
|
||
|
|
|
||
|
|
while (Gtk3::events_pending()) {
|
||
|
|
Gtk3::main_iteration();
|
||
|
|
}
|
||
|
|
|
||
|
|
return $ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub progress_stop {
|
||
|
|
my $this=shift;
|
||
|
|
$this->SUPER::progress_stop(@_);
|
||
|
|
|
||
|
|
while (Gtk3::events_pending) {
|
||
|
|
Gtk3::main_iteration;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($this->assistant->get_current_page == $this->assistant->get_n_pages - 1) {
|
||
|
|
$this->create_assistant_page();
|
||
|
|
}
|
||
|
|
$this->assistant->set_current_page($prev_page + 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
1
|