summaryrefslogtreecommitdiffstats
path: root/perl-install/install_steps_gtk.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/install_steps_gtk.pm')
-rw-r--r--perl-install/install_steps_gtk.pm1077
1 files changed, 431 insertions, 646 deletions
diff --git a/perl-install/install_steps_gtk.pm b/perl-install/install_steps_gtk.pm
index 150ff183f..a3ca086a4 100644
--- a/perl-install/install_steps_gtk.pm
+++ b/perl-install/install_steps_gtk.pm
@@ -1,4 +1,4 @@
-package install_steps_gtk;
+package install_steps_gtk; # $Id$
use diagnostics;
use strict;
@@ -9,162 +9,18 @@ use vars qw(@ISA);
#-######################################################################################
#- misc imports
#-######################################################################################
+use install_steps_interactive;
+use interactive_gtk;
use common qw(:common :file :functional :system);
-use partition_table qw(:types);
use my_gtk qw(:helpers :wrappers);
use Gtk;
-use Gtk::XmHTML;
use devices;
-use fsedit;
-use keyboard;
-use network;
use modules;
-use printer;
-use install_steps;
-use run_program;
-use install_steps_interactive;
-use Xconfigurator;
-use Xconfig;
-use interactive_gtk;
+use install_gtk;
use install_any;
-use diskdrake;
-use pkgs;
-use log;
+use mouse;
use help;
-use lang;
-
-#-#####################################################################################
-#-INTERN CONSTANT
-#-#####################################################################################
-my $w_help;
-my $itemsNB = 1;
-my (@background1, @background2);
-my ($width, $height) = (640, 480);
-my ($stepswidth, $stepsheight) = (140, $height);
-my ($logowidth, $logoheight) = ($width - $stepswidth, 40);
-my ($helpwidth, $helpheight) = ($width - $stepswidth, 100);
-my ($windowwidth, $windowheight) = ($width - $stepswidth, $height - $helpheight - $logoheight);
-
-my @themes_vga16 = qw(blue blackwhite savane);
-my @themes = qw(DarkMarble marble3d blueHeart);
-
-my @circle_head = (
- "19 17 4 1"
-);
-
-my @circle_body = (
-" c None",
-"+ c #FFFFFF",
-" ===== ",
-" ========= ",
-" =+++======= ",
-" =++========== ",
-" ==+============ ",
-" +++============ ",
-" ================o",
-" ================o",
-" ================o",
-" ===============oo",
-" ===============oo",
-" =============oo ",
-" ============ooo ",
-" o=========ooo ",
-" oo=====oooo ",
-" ooooooooo ",
-" ooooo ",
-);
-
-#-my @questionmark_head = (
-#-"39 97 6 1",
-#-" c None",
-#-". c #000000",
-#-"+ c #FFFFFF",
-#-"o c #AAAAAA",
-#-);
-#-my @questionmark_body = (
-#-("OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO") x 10,
-#-"OOOOOOOOOOOOO.......OOOOOOOOOOOOOOOOOOO",
-#-"OOOOOOOOOOOO..OOOOOOO.OOOOOOOOOOOOOOOOO",
-#-"OOOOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOOO",
-#-"OOOOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOOO",
-#-"OOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
-#-"OOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
-#-"OOOOOOO..OOOOOOOOOOOOOOOOOOXOOOOOOOOOOO",
-#-"OOOOOOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
-#-"OOOOOO.OOOOOOOOOOOOOOOOOOOOOXOOOOOOOOOO",
-#-"OOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
-#-"OOOOO.OOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOO",
-#-"OOOO..OOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOO",
-#-"OOOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
-#-"OOOO.OOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOO",
-#-"OOO..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
-#-"OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOO",
-#-"OO..OOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOO",
-#-"OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOO",
-#-"OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOO",
-#-"OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOO",
-#-"O..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOO",
-#-"OO.OOOOOOOOOOOoo+++++ooOOOOOOOOOOXOOOOO",
-#-"O.OOOOOOOOOOo+++o+++++++oOOOOOOOOOXOOOO",
-#-"O.OOOOOOOOO+++OOOOo+++++++OOOOOOOOXOOOO",
-#-"O.OOOOOOOOo++oOOOOOo++++++oOOOOOOOXOOOO",
-#-"O.OOOOOOOo+++oOOOOOO+++++++OOOOOOOXOOOO",
-#-"..OOOOOOOo++++OOOOOOo++++++oOOOOOOXOOOO",
-#-"O.OOOOOOO+++++oOOOOOo+++++++OOOOOOXOOOO",
-#-".OOOOOOOO++++++OOOOOo+++++++OOOOOOOXOOO",
-#-".OOOOOOOO++++++OOOOOo+++++++OOOOOOXOOOO",
-#-".OOOOOOOOo++++oOOOOOo++++++oOOOOOOOXOOO",
-#-".OOOOOOOOOo++oOOOOOOo++++++oOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOOOOO+++++++OOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOOOOO++++++OOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOOOOo+++++oOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOOOO+++++OOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOOOo+++oOOOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOOO+++oOOOOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOOo++OOOOOOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOO++OOOOOOOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOO+oOOOOOOOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOO+OOOOOOOOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOO+OOOOOOOOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOO",
-#-"O.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOO",
-#-"OOOOOOOOOOOOOOOOoooOOOOOOOOOOOOOOOOXOOO",
-#-".OOOOOOOOOOOOOO+++++OOOOOOOOOOOOOOXOOOO",
-#-"O.OOOOOOOOOOOO++++++oOOOOOOOOOOOOOXXOOO",
-#-"O.OOOOOOOOOOOo+++++++OOOOOOOOOOOOOXOOOO",
-#-"O.OOOOOOOOOOOo+++++++OOOOOOOOOOOOOXOOOO",
-#-"O.OOOOOOOOOOOo+++++++OOOOOOOOOOOOOXOOOO",
-#-"OOOOOOOOOOOOOO++++++oOOOOOOOOOOOOOXOOOO",
-#-"O.OOOOOOOOOOOOO+++++OOOOOOOOOOOOOXXOOOO",
-#-"OO.OOOOOOOOOOOOOoooOOOOOOOOOOOOOOOXOOOO",
-#-"OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOO",
-#-"OO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXOOOOO",
-#-"OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOO",
-#-"OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOO",
-#-"OOOO.OOOOOOOOOOOOOOOOOOOOOOOOOOXXOOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOO",
-#-"OOOOO.OOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXOOOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOO",
-#-"OOOOOO.OOOOOOOOOOOOOOOOOOOOOOXXOOOOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOOOOXXOOOOOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOOOXXOOOOOOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOXXXOOOOOOOOOOO",
-#-"OOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOOOOOO",
-#-"OOOOOOOOOOOOXOOOOOOOOOOXXXOOOOOOOOOOOOO",
-#-"OOOOOOOOOOOOOOXOOOOOOXXXOOOOOOOOOOOOOOO",
-#-"OOOOOOOOOOOOOOOXXXXXXXOOOOOOOOOOOOOOOOO",
-#-("OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO") x 10);
-
-my @red_circle = (@circle_head, "= c #FF0000", "o c #AA5500", @circle_body);
-my @orange_circle = (@circle_head, "= c #FFAA00", "o c #AA5500", @circle_body);
-my @green_circle = (@circle_head, "= c #00FF00", "o c #00AA00", @circle_body);
+use log;
#-######################################################################################
#- In/Out Steps Functions
@@ -175,51 +31,79 @@ sub new($$) {
my $old = $SIG{__DIE__};
$SIG{__DIE__} = sub { $_[0] !~ /my_gtk\.pm/ and goto $old };
- $ENV{DISPLAY} = $o->{display} || ":0";
+ $ENV{DISPLAY} ||= $o->{display} || ":0";
unless ($::testing) {
$my_gtk::force_focus = $ENV{DISPLAY} eq ":0";
- my $f = "/tmp/Xconf";
- createXconf($f, @{$o->{mouse}}{"XMOUSETYPE", "device"});
+ if ($ENV{DISPLAY} eq ":0" && !$::live) {
+ my $f = "/tmp/Xconf";
+ install_gtk::createXconf($f, @{$o->{mouse}}{"XMOUSETYPE", "device"}, $o->{wacom});
+ devices::make("/dev/kbd");
+
+ local (*T1, *T2);
+ open T1, ">/dev/tty5";
+ open T2, ">/dev/tty6";
- if ($ENV{DISPLAY} eq ":0") {
my $launchX = sub {
my $ok = 1;
- local $SIG{CHLD} = sub { $ok = 0 };
+ local $SIG{CHLD} = sub { $ok = 0 if waitpid(-1, c::WNOHANG()) > 0 };
unless (fork) {
- exec $_[0], "-kb", "-dpms","-s" ,"240", "-allowMouseOpenFail", "-xf86config", $f or exit 1;
+ exec $_[0], (arch() =~ /^sparc/ || arch() eq "ppc" ? () : ("-kb")), "-dpms","-s" ,"240",
+ ($_[0] =~ /Xsun/ || $_[0] =~ /Xpmac/ ? ("-fp", "/usr/X11R6/lib/X11/fonts:unscaled") :
+ ("-allowMouseOpenFail", "-xf86config", $f)) or exit 1;
}
- foreach (1..10) {
+ foreach (1..60) {
sleep 1;
- return 0 if !$ok;
+ log::l("Server died"), return 0 if !$ok;
return 1 if c::Xtest($ENV{DISPLAY});
}
+ log::l("Timeout!!");
0;
};
-
- if (listlength(cat_("/proc/fb"))) {
- &$launchX("XF86_FBDev");
- $o->{allowFB} = 1; #- keep in mind FB is used.
- } else {
+ my @servers = qw(FBDev VGA16); #-)
+ if (arch() eq "alpha") {
+ require Xconfigurator;
+ my $card = Xconfigurator::cardConfigurationAuto();
+ Xconfigurator::updateCardAccordingName($card, $card->{type}) if $card && $card->{type};
+ @servers = $card->{server} || "TGA";
+ #-@servers = qw(SVGA 3DLabs TGA)
+ } elsif (arch() =~ /^sparc/) {
+ local $_ = cat_("/proc/fb");
+ if (/Mach64/) { @servers = qw(Mach64) }
+ elsif (/Permedia2/) { @servers = qw(3DLabs) }
+ else { @servers = qw(Xsun24) }
+ } elsif (arch() eq "ppc") {
+ @servers = qw(Xpmac);
+ }
+
+ foreach (@servers) {
+ log::l("Trying with server $_");
my $dir = "/usr/X11R6/bin";
- unless (-x "$dir/XF86_VGA16") {
- unlink "$dir/XF86_FBDev";
- local *F; open F, ">$dir/XF86_VGA16" or die '';
- local $/ = \ (16 * 1024);
- my $f = install_any::getFile("$dir/XF86_VGA16") or die '';
- syswrite F, $_ foreach <$f>;
- chmod 0755, "$dir/XF86_VGA16";
+ my $prog = /Xsun|Xpmac/ ? $_ : "XF86_$_";
+ unless (-x "$dir/$prog") {
+ unlink $_ foreach glob_("$dir/X*");
+ install_any::getAndSaveFile("Mandrake/mdkinst$dir/$prog", "$dir/$prog") or die "failed to get server $prog: $!";
+ chmod 0755, "$dir/$prog";
+ }
+ if (/FB/) {
+ !$o->{vga16} && $o->{allowFB} or next;
+
+ $o->{allowFB} = &$launchX($prog) #- keep in mind FB is used.
+ and goto OK;
+ } else {
+ $o->{vga16} = 1 if /VGA16/;
+ &$launchX($prog) and goto OK;
}
- &$launchX("XF86_VGA16");
}
+ return undef;
}
}
- @themes = @themes_vga16 if $o->{simple_themes} || !$o->{display} && !($o->{allowFB} ||= $::testing);
+ OK:
+ install_gtk::init_sizes();
+ install_gtk::default_theme($o);
+ install_gtk::create_logo_window($o);
- install_theme($o);
- create_logo_window($o);
-
- $my_gtk::force_center = [ $width - $windowwidth, $logoheight, $windowwidth, $windowheight ];
+ $my_gtk::force_center = [ $::rootwidth - $::windowwidth, $::logoheight, $::windowwidth, $::windowheight ];
(bless {}, ref $type || $type)->SUPER::new($o);
}
@@ -227,9 +111,10 @@ sub new($$) {
sub enteringStep {
my ($o, $step) = @_;
+ printf "Entering step `%s'\n", $o->{steps}{$step}{text};
$o->SUPER::enteringStep($step);
- create_steps_window($o);
- create_help_window($o);
+ install_gtk::create_steps_window($o);
+ install_gtk::create_help_window($o);
}
sub leavingStep {
my ($o, $step) = @_;
@@ -242,244 +127,333 @@ sub leavingStep {
#- Steps Functions
#-######################################################################################
sub selectLanguage {
- my ($o) = @_;
+ my ($o, $first_time) = @_;
$o->SUPER::selectLanguage;
Gtk->set_locale;
- install_theme($o);
+ install_gtk::install_theme($o);
+
+ $o->ask_warn('',
+_("Your system is low on resource. You may have some problem installing
+Linux-Mandrake. If that occurs, you can try a text install instead. For this,
+press `F1' when booting on CDROM, then enter `text'.")) if $first_time && availableRamMB() < 60; # 60MB
+
}
#------------------------------------------------------------------------------
-sub doPartitionDisks($$) {
- my ($o, $hds, $raid) = @_;
+sub selectInstallClass1 {
+ my ($o, $verif, $l, $def, $l2, $def2) = @_;
+ $::live || @$l == 1 and return $o->SUPER::selectInstallClass1($verif, $l, $def, $l2, $def2);
- while (1) {
- diskdrake::main($hds, $raid, interactive_gtk->new, $o->{partitions});
- if (!grep { isSwap($_) } fsedit::get_fstab(@{$o->{hds}})) {
- if ($::beginner) {
- $o->ask_warn('', _("You must have a swap partition"));
- } elsif (!$::expert) {
- $o->ask_okcancel('', _("You don't have a swap partition\n\nContinue anyway?")) and last;
- } else { last }
- } else { last }
- }
+ my $w = my_gtk->new('');
+ my ($radio, $focused);
+ gtkadd($w->{window},
+ gtkpack($o->create_box_with_title(_("Please, choose one of the following classes of installation:")),
+ (my @radios = map { $radio = new Gtk::RadioButton($_, $radio ? $radio : ());
+ $radio->set_active($_ eq $def); $radio } @$l),
+ gtkadd(create_hbox(),
+ map { my $v = $_;
+ my $b = new Gtk::Button(translate($_));
+ $focused = $b if $_ eq $def2;
+ gtksignal_connect($b, "clicked" => sub { $w->{retval} = $v; Gtk->main_quit });
+ } @$l2)
+ ));
+ $focused->grab_focus if $focused;
+ $w->main;
+
+ mapn { $verif->($_[1]) if $_[0]->active } \@radios, $l;
+ install_gtk::create_steps_window($o);
+
+ $w->{retval};
}
#------------------------------------------------------------------------------
-sub choosePackages {
- my ($o, $packages, $compss, $compssUsers, $first_time) = @_;
+sub selectMouse {
+ my ($o, $force) = @_;
+ my %old = %{$o->{mouse}};
+ $o->SUPER::selectMouse($force);
+ my $mouse = $o->{mouse};
+ $mouse->{type} eq 'none' ||
+ $old{type} eq $mouse->{type} &&
+ $old{name} eq $mouse->{name} &&
+ $old{device} eq $mouse->{device} && !$force and return;
+
+ local $my_gtk::grab = 1; #- unsure a crazy mouse don't go wild clicking everywhere
- return if $::beginner;
- chooseSizeToInstall(@_);
- install_steps_interactive::choosePackages(@_);
- choosePackagesTree(@_) if $::expert;
+ while (1) {
+ log::l("telling X server to use another mouse");
+ eval { modules::load('serial') } if $mouse->{device} =~ /ttyS/;
+
+ if (!$::testing) {
+ symlinkf($mouse->{device}, "/dev/mouse");
+ c::setMouseLive($ENV{DISPLAY}, mouse::xmouse2xId($mouse->{XMOUSETYPE}), $mouse->{nbuttons} < 3);
+ }
+ install_gtk::test_mouse($mouse) and return;
+ $o->SUPER::selectMouse(1);
+ $mouse = $o->{mouse};
+ }
}
+
+#------------------------------------------------------------------------------
sub chooseSizeToInstall {
- my ($o, $packages, $compss, $compssUsers, $first_time) = @_;
- my $availableSpace = int(install_any::getAvailableSpace($o) / sqr(1024));
- my $default = pkgs::correctSize((sum map { $_->{size} } grep { $_->{selected} } values %$packages) / sqr(1024) || $availableSpace * 0.7);
+ my ($o, $packages, $min_size, $max_size_, $availableC, $individual) = @_;
+ my $max_size = min($max_size_, $availableC);
+ my $enough = $max_size == $max_size_;
+ my $percentage = int 100 * $max_size / $max_size_;
+
+ #- don't ask anything if the difference between min and max is too small
+ return $max_size if $min_size && $max_size / $min_size < 1.05;
+
+ log::l("choosing size to install between $min_size and $max_size");
my $w = my_gtk->new('');
- my $adj = create_adjustment($default, 100, $availableSpace);
- my $spin = gtkset_usize(new Gtk::SpinButton($adj, 0, 0), 100, 0);
+ my $adj = create_adjustment($percentage, $min_size * 100 / $max_size_, $percentage);
+ my $spin = gtkset_usize(new Gtk::SpinButton($adj, 0, 0), 20, 0);
+ my $val;
+ require pkgs;
gtkadd($w->{window},
gtkpack(new Gtk::VBox(0,20),
- create_packtable({ col_spacings => 10 },
- [ _("Choose the size you want to install"), $spin, _("MB"), ],
+ _("The total size for the groups you have selected is approximately %d MB.\n", pkgs::correctSize($max_size_ / sqr(1024))) .
+ ($enough ?
+_("If you wish to install less than this size,
+select the percentage of packages that you want to install.
+
+A low percentage will install only the most important packages;
+a percentage of 100%% will install all selected packages.") :
+_("You have space on your disk for only %d%% of these packages.
+
+If you wish to install less than this,
+select the percentage of packages that you want to install.
+A low percentage will install only the most important packages;
+a percentage of %d%% will install as many packages as possible.", $percentage, $percentage))
+. ($individual ? "\n\n" . _("You will be able to choose them more specifically in the next step.") : ''),
+ create_packtable({},
+ [ _("Percentage of packages to install") . ' ', $spin, "%", my $mb = new Gtk::Label ],
[ undef, new Gtk::HScrollbar($adj) ],
),
create_okcancel($w)
)
);
+ $spin->signal_connect(changed => my $changed = sub {
+ $val = $spin->get_value_as_int / 100 * $max_size_;
+ $mb->set(sprintf("(%dMB)", pkgs::correctSize($val / sqr(1024))));
+ }); &$changed();
$spin->signal_connect(activate => sub { $w->{retval} = 1; Gtk->main_quit });
$spin->grab_focus();
- $w->main or return;
-
- $_->{selected} = 0 foreach values %$packages;
- pkgs::setSelectedFromCompssList($o->{compssListLevels}, $o->{packages}, pkgs::invCorrectSize($spin->get_value_as_int) * sqr(1024), $o->{installClass}, $o->{lang}, $o->{isUpgrade});
+ $w->main and $val + 1; #- add a single byte (hack?) to make selection of 0 bytes ok.
}
sub choosePackagesTree {
- my ($o, $packages, $compss, $compssUsers) = @_;
- my $availableSpace = int(install_any::getAvailableSpace($o) / sqr(1024));
- my $w = my_gtk->new('');
- add2hash_($o->{packages_}, { show_level => 0 }); #- keep show more or less 80 });
+ my ($o, $packages, $compss) = @_;
- my ($current, $ignore, $showall, $selectall, $w_size, $info_widget, $showall_button, $selectall_button, $go, %items) = 0, 0, 0, 0;
+ $o->set_help('choosePackagesTree');
+ my ($curr, $parent, $info_widget, $w_size, $go, $idle, $flat, $auto_deps);
+ my (%wtree, %ptree);
+
+ my $w = my_gtk->new('');
my $details = new Gtk::VBox(0,0);
- $compss->{tree} = new Gtk::Tree();
- $compss->{tree}->set_selection_mode('multiple');
-
- my $clean; $clean = sub {
- my ($p) = @_;
- foreach (values %{$p->{childs}}) {
- &$clean($_) if $_->{childs};
- delete $_->{itemNB};
- delete $_->{tree};
- delete $_->{packages_item};
- }
- }; &$clean($compss);
-
- my $update = sub {
- my $size = 0;
- $ignore = 1;
- foreach (grep { $_->[0] } values %items) {
- $compss->{tree}->unselect_child($_->[0]);
- $compss->{tree}->select_child($_->[0]) if $_->[1]{selected};
+ my $tree = Gtk::CTree->new(3, 0);
+ $tree->set_selection_mode('browse');
+ $tree->set_column_width(0, 200);
+ $tree->set_column_auto_resize($_, 1) foreach 1..2;
+
+ gtkadd($w->{window},
+ gtkpack_(new Gtk::VBox(0,5),
+ 0, _("Choose the packages you want to install"),
+ 1, gtkpack(new Gtk::HBox(0,0),
+ createScrolledWindow($tree),
+ gtkadd(gtkset_usize(new Gtk::Frame(_("Info")), $::windowwidth - 490, 0),
+ createScrolledWindow($info_widget = new Gtk::Text),
+ )),
+ 0, my $l = new Gtk::HBox(0,15),
+ 0, gtkpack(new Gtk::HBox(0,10),
+ $go = gtksignal_connect(new Gtk::Button(_("Install")), "clicked" => sub { $w->{retval} = 1; Gtk->main_quit }),
+ )
+ ));
+ gtkpack__($l, my $toolbar = new Gtk::Toolbar('horizontal', 'icons'));
+ gtkpack__($l, gtksignal_connect(new Gtk::CheckButton(_("Automatic dependencies")), clicked => sub { invbool \$auto_deps }));
+ $l->pack_end($w_size = new Gtk::Label(''), 0, 1, 20);
+
+ $w->{window}->set_usize(map { $_ - 2 * $my_gtk::border - 4 } $::windowwidth, $::windowheight);
+ $go->grab_focus;
+ $w->{rwindow}->show_all;
+
+ my $pix_base = [ gtkcreate_xpm($w->{window}, "$ENV{SHARE_PATH}/rpm-base.xpm") ];
+ my $pix_selected = [ gtkcreate_xpm($w->{window}, "$ENV{SHARE_PATH}/rpm-selected.xpm") ];
+ my $pix_unselect = [ gtkcreate_xpm($w->{window}, "$ENV{SHARE_PATH}/rpm-unselected.xpm") ];
+ my $pix_semisele = [ gtkcreate_xpm($w->{window}, "$ENV{SHARE_PATH}/rpm-semiselected.xpm") ];
+ my $pix_installed= [ gtkcreate_xpm($w->{window}, "$ENV{SHARE_PATH}/rpm-installed.xpm") ];
+
+ my $add_parent; $add_parent = sub {
+ $_[0] or return undef;
+ if (my $w = $wtree{$_[0]}) { return $w }
+ my $s; foreach (split '/', $_[0]) {
+ my $s2 = $s ? "$s/$_" : $_;
+ $wtree{$s2} ||= do {
+ my $n = $tree->insert_node($s ? $add_parent->($s) : undef, undef, [$_, '', ''], 5, (undef) x 4, 0, 0);
+ $n;
+ };
+ $s = $s2;
}
- $ignore = 0;
-
- foreach (values %$packages) {
- $size += $_->{size} - ($_->{installedCumulSize} || 0) if $_->{selected}; #- on upgrade, installed packages will be removed.
+ $tree->node_set_pixmap($wtree{$s}, 1, $pix_semisele->[0], $pix_semisele->[1]);
+ $wtree{$s};
+ };
+ my $add_node = sub {
+ my ($leaf, $root) = @_;
+ my $p = $packages->[0]{$leaf} or return;
+ $p->{medium}{selected} or return;
+ my $node = $tree->insert_node($add_parent->($root),
+ undef, [$leaf, '', ''], 5, (undef) x 4, 1, 0);
+ my $pix = pkgs::packageFlagBase($p) ? $pix_base : pkgs::packageFlagSelected($p) ? $pix_selected : pkgs::packageFlagInstalled($p) ? $pix_installed : $pix_unselect;
+ $tree->node_set_pixmap($node, 1, $pix->[0], $pix->[1]);
+ push @{$ptree{$leaf}}, $node;
+ };
+ my $add_nodes = sub {
+ %ptree = %wtree = ();
+
+ $tree->freeze;
+ while (1) { $tree->remove_node($tree->node_nth(0) || last) }
+
+ my ($root, $leaf);
+ if ($flat = $_[0]) {
+ $add_node->($_, undef) foreach sort grep { my $pkg = pkgs::packageByName($packages, $_);
+ $pkg->{medium}{selected} } keys %{$packages->[0]};
+ } else {
+ foreach (sort @$compss) {
+ ($root, $leaf) = m|(.*)/(.+)|o or ($root, $leaf) = ('', $_);
+ my $pkg = pkgs::packageByName($packages, $leaf);
+ $add_node->($leaf, $root) if $pkg->{medium}{selected};
+ }
}
-
- $w_size->set(_("Total size: ") . int (pkgs::correctSize($size / sqr(1024))) . " / $availableSpace " . _("MB") );
+ $tree->thaw;
};
- my $new_item = sub {
- my ($p, $name, $parent) = @_;
- my $w = create_treeitem($name);
- $items{++$itemsNB} = [ $w, $p ];
- $parent->{packages_item}{$itemsNB} = undef if $parent;
- $w->show;
- $w->set_sensitive(!$p->{base} && !$p->{installed});
- $w->signal_connect(focus_in_event => sub {
- my $p = pkgs::getHeader($p);
- gtktext_insert($info_widget,
- _("Version: %s\n", c::headerGetEntry($p, 'version') . '-' . c::headerGetEntry($p, 'release')) .
- _("Size: %d KB\n", c::headerGetEntry($p, 'size') / 1024) .
-
- formatLines(c::headerGetEntry($p, 'description')));
- }) unless $p->{childs};
- $itemsNB;
+ $add_nodes->($flat);
+
+ my %toolbar = my @toolbar =
+ (
+ ftout => [ _("Expand Tree") , sub { $tree->expand_recursive(undef) } ],
+ ftin => [ _("Collapse Tree") , sub { $tree->collapse_recursive(undef) } ],
+ reload=> [ _("Toggle between flat and group sorted"), sub { $add_nodes->(!$flat) } ],
+ );
+ $toolbar->set_button_relief("none");
+ foreach (grep_index { $::i % 2 == 0 } @toolbar) {
+ gtksignal_connect($toolbar->append_item(undef, $toolbar{$_}[0], undef, gtkxpm($tree, "$ENV{SHARE_PATH}/$_.xpm")),
+ clicked => $toolbar{$_}[1]);
+ }
+ $toolbar->set_style("icons");
+
+ my $display_info = sub {
+ my $p = $packages->[0]{$curr} or return gtktext_insert($info_widget, '');
+ pkgs::extractHeaders($o->{prefix}, [$p], $p->{medium});
+ $p->{header} or die;
+
+ my $ind = $o->{compssListLevels}{$o->{installClass}};
+ my $imp = translate($pkgs::compssListDesc{pkgs::packageFlagBase($p) ? 100 : round_down($p->{values}[$ind], 10)});
+
+ gtktext_insert($info_widget, $@ ? _("Bad package") :
+ _("Name: %s\n", pkgs::packageName($p)) .
+ _("Version: %s\n", pkgs::packageVersion($p) . '-' . pkgs::packageRelease($p)) .
+ _("Size: %d KB\n", pkgs::packageSize($p) / 1024) .
+ ($imp && _("Importance: %s\n", $imp)) . "\n" .
+ formatLines(c::headerGetEntry($p->{header}, 'description')));
+ c::headerFree(delete $p->{header});
+ 0;
};
- $compss->{tree}->signal_connect(selection_changed => sub {
- $ignore and return;
-
- my %s; @s{$_[0]->selection} = ();
- my @changed;
- #- needs to find @changed first, _then_ change the selected, otherwise
- #- we won't be able to find the changed
- foreach (values %items) {
- push @changed, $_->[1] if ($_->[1]{selected} xor exists $s{$_->[0]});
+ my $update_size = sub {
+ my $size = pkgs::selectedSize($packages);
+ $w_size->set(_("Total size: %d / %d MB",
+ pkgs::correctSize($size / sqr(1024)),
+ install_any::getAvailableSpace($o) / sqr(1024)));
+ };
+ my $select = sub {
+ my %l;
+ my $isSelection = !pkgs::packageFlagSelected($_[0]);
+ foreach (@_) {
+ pkgs::togglePackageSelection($packages, $_, my $l = {});
+ @l{grep {$l->{$_}} keys %$l} = ();
}
- #- works before @changed is (or must be!) one element
- foreach (@changed) {
- if ($_->{childs}) {
- my $s = invbool \$_->{selected};
- my $f; $f = sub {
- my ($p) = @_;
- $p->{itemNB} or return;
- if ($p->{packages}) {
- foreach (keys %{$p->{packages_item} || {}}) {
- my ($a, $b) = @{$items{$_}};
- $a and pkgs::set($packages, $b, $s);
- }
- } else {
- foreach (values %{$p->{childs}}) {
- $_->{selected} = $s;
- &$f($_);
- }
- }
- }; &$f($_);
-#- } elsif ($_->{base}) {
-#- $o->ask_warn('', _("Sorry, i won't unselect this package. The system needs it"));
-#- } elsif ($_->{installed}) {
-#- $o->ask_warn('', _("Sorry, i won't select this package. A more recent version is already installed"));
- } else {
- pkgs::toggle($packages, $_);
+ if (my @l = keys %l) {
+ #- check for size before trying to select.
+ my $size = pkgs::selectedSize($packages);
+ foreach (@l) {
+ my $p = $packages->[0]{$_};
+ pkgs::packageFlagSelected($p) or $size += pkgs::packageSize($p);
+ }
+ if (pkgs::correctSize($size / sqr(1024)) > install_any::getAvailableSpace($o) / sqr(1024)) {
+ return $o->ask_warn('', _("You can't select this package as there is not enough space left to install it"));
}
- }
- &$update();
- });
-
- my $select_add = sub {
- my ($ind, $level) = @{$o->{packages_}}{"ind", "select_level"};
- $level = max(0, min(100, ($level + $_[0])));
- $o->{packages_}{select_level} = $level;
- pkgs::unselect_all($packages);
- foreach (pkgs::allpackages($packages)) {
- pkgs::select($packages, $_) if $_->{values}[$ind] >= $level;
+ @l > @_ && !$auto_deps and $o->ask_okcancel('', [ $isSelection ?
+ _("The following packages are going to be installed") :
+ _("The following packages are going to be removed"),
+ join(", ", common::truncate_list(20, sort @l)) ], 1) || return;
+ $isSelection ? pkgs::selectPackage($packages, $_) : pkgs::unselectPackage($packages, $_) foreach @_;
+ foreach (@l) {
+ my $p = $packages->[0]{$_};
+ my $pix = pkgs::packageFlagSelected($p) ? $pix_selected : $pix_unselect;
+ $tree->node_set_pixmap($_, 1, $pix->[0], $pix->[1]) foreach @{$ptree{$_}};
+ }
+ &$update_size;
+ } else {
+ $o->ask_warn('', _("You can't select/unselect this package"));
}
- &$update;
};
-
- my $show_add = sub {
- my ($ind, $level) = @{$o->{packages_}}{"ind", "show_level"};
- $level = max(0, min(90, ($level + $_[0])));
- $o->{packages_}{show_level} = $level;
-
- my $update_tree = sub {
- my $P = shift;
- my $i = 0; foreach (@_) {
- my ($flag, $itemNB, $q) = @$_;
- my $item = $items{$flag || $itemNB}[0] if $flag || $itemNB;
- if ($flag) {
- $P->{tree}->insert($item, $i) if $flag ne "1";
- $item->set_subtree($q->{tree}) if $flag ne "1" && $q->{tree};
- $i++;
- } elsif ($itemNB) {
- delete $items{$itemNB};
- delete $P->{packages_item}{$itemNB};
- $P->{tree}->remove_item($item) if $P->{tree};
- }
- }
- };
- my $f; $f = sub {
- my ($p) = @_;
- if ($p->{packages}) {
- my %l; $l{$items{$_}[1]} = $_ foreach keys %{$p->{packages_item}};
- map {
- [ $_->{values}[$ind] >= $level ?
- ($l{$_} ? 1 : &$new_item($_, $_->{name}, $p)) : '', $l{$_}, $_ ];
- } sort {
- $a->{name} cmp $b->{name} } @{$p->{packages}};
+ my $children = sub { map { $packages->[0]{($tree->node_get_pixtext($_, 0))[0]} } gtkctree_children($_[0]) };
+ my $toggle = sub {
+ if (ref $curr && ! $_[0]) {
+ $tree->toggle_expansion($curr);
+ } else {
+ if (ref $curr) {
+ my @l = grep { !pkgs::packageFlagBase($_) } $children->($curr) or return;
+ my @unsel = grep { !pkgs::packageFlagSelected($_) } @l;
+ my @p = @unsel ?
+ @unsel : # not all is selected, select all
+ @l;
+ $select->(@p);
+ $parent = $curr;
} else {
- map {
- my $P = $p->{childs}{$_};
- my @L; @L = &$f($P) if !$P->{values} || $P->{values}[$ind] > ($::expert ? -1 : 0);
- if (grep { $_->[0] } @L) {
- my $r = $P->{tree} ? 1 : do {
- my $t = $P->{tree} = new Gtk::Tree(); $t->show;
- $P->{itemNB} = &$new_item($P, $_);
- };
- &$update_tree($P, @L);
- [ $r, $P->{itemNB}, $P ];
+ my $p = $packages->[0]{$curr} or return;
+ if (pkgs::packageFlagBase($p)) {
+ return $o->ask_warn('', _("This is a mandatory package, it can't be unselected"));
+ } elsif (pkgs::packageFlagInstalled($p)) {
+ return $o->ask_warn('', _("You can't unselect this package. It is already installed"));
+ } elsif (pkgs::packageFlagUpgrade($p)) {
+ if ($::expert) {
+ if (pkgs::packageFlagSelected($p)) {
+ $o->ask_yesorno('', _("This package must be upgraded\nAre you sure you want to deselect it?")) or return;
+ }
} else {
- &$update_tree($P, @L);
- delete $P->{tree};
- [ '', delete $P->{itemNB}, $P ];
+ return $o->ask_warn('', _("You can't unselect this package. It must be upgraded"));
}
- } sort keys %{$p->{childs} || {}};
+ }
+ $select->($p);
}
- };
- $ignore = 1;
- &$update_tree($compss, &$f($compss));
- &$update;
- $ignore = 0;
+ if (my @l = $children->($parent)) {
+ my $nb = grep { pkgs::packageFlagSelected($_) } @l;
+ my $pix = $nb==0 ? $pix_unselect : $nb<@l ? $pix_semisele : $pix_selected;
+ $tree->node_set_pixmap($parent, 1, $pix->[0], $pix->[1]);
+ }
+ }
};
- gtkadd($w->{window}, gtkpack_(new Gtk::VBox(0,5),
- 0, _("Choose the packages you want to install"),
- 1, gtkpack(new Gtk::HBox(0,0),
- createScrolledWindow($compss->{tree}),
- gtkadd(gtkset_usize(new Gtk::Frame(_("Info")), 150, 0),
- createScrolledWindow($info_widget = new Gtk::Text),
- ),
- ),
- 0, gtkpack_(new Gtk::HBox(0,0), 0, $w_size = new Gtk::Label('')),
- 0, gtkpack(new Gtk::HBox(0,10),
- map { $go ||= $_; $_ }
- map { gtksignal_connect(new Gtk::Button($_->[0]), "clicked" => $_->[1]) }
- [ _("Install") => sub { $w->{retval} = 1; Gtk->main_quit } ],
- #- keep show more or less [ _("Show less") => sub { &$show_add(+10) } ],
- #- keep show more or less [ _("Show more") => sub { &$show_add(-10) } ],
- )
- ));
- $w->{window}->set_usize(map { $_ - 2 * $my_gtk::border - 4 } $windowwidth, $windowheight);
- $w->show;
- &$show_add(0);
- &$update();
- $go->grab_focus;
+ $tree->signal_connect(key_press_event => sub {
+ my ($w, $e) = @_;
+ my $c = chr($e->{keyval} & 0xff);
+ $toggle->(0) if $e->{keyval} >= 0x100 ? $c eq "\r" || $c eq "\x8d" : $c eq ' ';
+ 1;
+ });
+ $tree->signal_connect(tree_select_row => sub {
+ Gtk->timeout_remove($idle) if $idle;
+
+ if ($_[1]->row->is_leaf) {
+ ($curr) = $tree->node_get_pixtext($_[1], 0);
+ $parent = $_[1]->row->parent;
+ $idle = Gtk->timeout_add(100, $display_info);
+ } else {
+ $curr = $_[1];
+ }
+ $toggle->(1) if $_[2] == 1;
+ });
+ &$update_size;
$w->main;
}
@@ -487,15 +461,14 @@ sub choosePackagesTree {
sub installPackages {
my ($o, $packages) = @_;
- my ($current_total_size, $last_size, $nb, $total_size, $start_time, $last_dtime);
+ my ($current_total_size, $last_size, $nb, $total_size, $start_time, $last_dtime, $trans_progress_total);
- my $w = my_gtk->new(_("Installing"), grab => 1);
- $w->{window}->set_usize($windowwidth * 0.8, $windowheight * 0.5);
+ my $w = my_gtk->new(_("Installing"));
+ $w->{window}->set_usize($::windowwidth * 0.8, 260);
my $text = new Gtk::Label;
- my ($msg, $msg_time_remaining, $msg_time_total) = map { new Gtk::Label } (1..3);
+ my ($msg, $msg_time_remaining, $msg_time_total) = map { new Gtk::Label($_) } '', (_("Estimating")) x 2;
my ($progress, $progress_total) = map { new Gtk::ProgressBar } (1..2);
- gtkadd($w->{window}, gtkadd(new Gtk::EventBox,
- gtkpack(new Gtk::VBox(0,10),
+ gtkadd($w->{window}, gtkpack(new Gtk::VBox(0,10),
_("Please wait, "), $msg, $progress,
create_packtable({},
[_("Time remaining "), $msg_time_remaining],
@@ -503,42 +476,91 @@ sub installPackages {
),
$text,
$progress_total,
- )));
- $msg->set(_("Preparing installation"));
+ '',
+ gtkadd(create_hbox(),
+ my $cancel = new Gtk::Button(_("Cancel"))),
+ ));
$w->sync;
+ $msg->set(_("Preparing installation"));
+ gtkset_mousecursor_normal($cancel->window);
+ $cancel->signal_connect(clicked => sub { $pkgs::cancel_install = 1 });
- my $old = \&log::ld;
- local *log::ld = sub {
+ my $oldInstallCallback = \&pkgs::installCallback;
+ local *pkgs::installCallback = sub {
my $m = shift;
- if ($m =~ /^starting installation:/) {
+ if ($m =~ /^Starting installation/) {
$nb = $_[0];
- $total_size = $_[2]; $current_total_size = 0;
+ $total_size = $_[1]; $current_total_size = 0;
$start_time = time();
- $msg->set(join '', @_);
+ $msg->set(_("%d packages", $nb));
$w->flush;
- } elsif ($m =~ /^starting installing/) {
+ } elsif ($m =~ /^Starting installing package/) {
$progress->update(0);
my $name = $_[0];
$msg->set(_("Installing package %s", $name));
$current_total_size += $last_size;
- $last_size = c::headerGetEntry($o->{packages}{$name}{header}, 'size');
- $text->set((split /\n/, c::headerGetEntry($o->{packages}{$name}{header}, 'summary'))[0] || '');
+ $last_size = c::headerGetEntry($o->{packages}[0]{$name}{header}, 'size');
+ $text->set((split /\n/, c::headerGetEntry($o->{packages}[0]{$name}{header}, 'summary'))[0] || '');
$w->flush;
- } elsif ($m =~ /^progressing installation/) {
- $progress->update($_[2] ? $_[0] / $_[2] : 0);
+ } elsif ($m =~ /^Progressing installing package/) {
+ $progress->update($_[2] ? $_[1] / $_[2] : 0);
my $dtime = time() - $start_time;
- my $ratio = $total_size ? ($_[0] + $current_total_size) / $total_size : 0;
+ my $ratio = $total_size ? ($_[1] + $current_total_size) / $total_size : 0;
my $total_time = $ratio ? $dtime / $ratio : time();
$progress_total->update($ratio);
- if ($dtime != $last_dtime) {
- $msg_time_total->set(formatTime($total_time));
- $msg_time_remaining->set(formatTime(max($total_time - $dtime, 0)));
+ if ($dtime != $last_dtime && $current_total_size > 10 * 1024 * 1024) {
+ $msg_time_total->set(formatTime(10 * round($total_time / 10) + 10));
+ $msg_time_remaining->set(formatTime(10 * round(max($total_time - $dtime, 0) / 10) + 10));
$last_dtime = $dtime;
}
$w->flush;
- } else { goto $old }
+ } else { unshift @_, $m; goto $oldInstallCallback }
+ };
+ #- the modification is not local as the box should be living for other package installation.
+ undef *install_any::changeMedium;
+ *install_any::changeMedium = sub {
+ my ($method, $medium) = @_;
+
+ #- if not using a cdrom medium, always abort.
+ $method eq 'cdrom' and do {
+ local $my_gtk::grab = 1;
+ my $name = pkgs::mediumDescr($o->{packages}, $medium);
+ print "\a";
+ $name !~ /Application/ || ($o->{useless_thing_accepted2} ||= $o->ask_from_list_('', formatAlaTeX(_("
+Warning
+
+Please read carefully the terms below. If you disagree with any
+portion, you are not allowed to install the next CD media. Press 'Refuse'
+to continue the installation without using these media.
+
+
+Some components contained in the next CD media are not governed
+by the GPL License or similar agreements. Each such component is then
+governed by the terms and conditions of its own specific license.
+Please read carefully and comply with such specific licenses before
+you use or redistribute the said components.
+Such licenses will in general prevent the transfer, duplication
+(except for backup purposes), redistribution, reverse engineering,
+de-assembly, de-compilation or modification of the component.
+Any breach of agreement will immediately terminate your rights under
+the specific license. Unless the specific license terms grant you such
+rights, you usually cannot install the programs on more than one
+system, or adapt it to be used on a network. In doubt, please contact
+directly the distributor or editor of the component.
+Transfer to third parties or copying of such components including the
+documentation is usually forbidden.
+
+
+All rights to the components of the next CD media belong to their
+respective authors and are protected by intellectual property and
+copyright laws applicable to software programs.
+")), [ __("Accept"), __("Refuse") ], "Accept") eq "Accept") and $o->ask_okcancel('', _("Change your Cd-Rom!
+
+Please insert the Cd-Rom labelled \"%s\" in your drive and press Ok when done.
+If you don't have it, press Cancel to avoid installation from this Cd-Rom.", $name));
+ };
};
catch_cdie { $o->install_steps::installPackages($packages); }
sub {
@@ -546,265 +568,28 @@ sub installPackages {
$o->ask_yesorno('', [
_("There was an error ordering packages:"), $1, _("Go on anyway?") ], 1) and return 1;
${$_[0]} = "already displayed";
+ } elsif ($@ =~ /^error installing package list: (.*)/) {
+ $o->ask_yesorno('', [
+_("There was an error installing packages:"), $1, _("Go on anyway?") ], 1) and return 1;
+ ${$_[0]} = "already displayed";
}
0;
};
- $w->destroy;
-}
-
-
-
-
-#------------------------------------------------------------------------------
-sub load_rc($) {
- if (my ($f) = grep { -r $_ } map { "$_/$_[0].rc" } (".", "/usr/share", dirname(__FILE__))) {
- Gtk::Rc->parse($f);
- foreach (cat_($f)) {
- if (/style\s+"background"/ .. /^\s*$/) {
- @background1 = map { $_ * 256 * 256 } split ',', $1 if /NORMAL.*\{(.*)\}/;
- @background2 = map { $_ * 256 * 256 } split ',', $1 if /PRELIGHT.*\{(.*)\}/;
- }
- }
+ if ($pkgs::cancel_install) {
+ $pkgs::cancel_install = 0;
+ die "setstep choosePackages\n";
}
+ $w->destroy;
}
-sub install_theme {
- my ($o, $theme) = @_;
- $o->{theme} = $theme || $o->{theme} || $themes[0];
-
- gtkset_mousecursor(68);
-
- load_rc($_) foreach "themes-$o->{theme}", "install", "themes";
-
- if (my ($font, $font2) = lang::get_x_fontset($o->{lang})) {
- $font2 ||= $font;
- Gtk::Rc->parse_string(qq(
-style "default-font"
-{
- fontset = "$font"
-}
-style "steps"
-{
- fontset = "$font2"
-}
-widget "*" style "default-font"
-widget "*Steps*" style "steps"
-
-));
- }
- gtkset_background(@background1);# unless $::testing;
-
- create_logo_window($o);
- create_help_window($o);
-}
-
-#------------------------------------------------------------------------------
-sub create_help_window {
- my ($o) = @_;
-
-# $o->{help_window}->destroy if $o->{help_window};
-
- my $w;
- if ($w = $o->{help_window}) {
- $_->destroy foreach $w->{window}->children;
- } else {
- $w = bless {}, 'my_gtk';
- $w->{rwindow} = $w->{window} = new Gtk::Window;
- $w->{rwindow}->set_uposition($width - $helpwidth, $height - $helpheight);
- $w->{rwindow}->set_usize($helpwidth, $helpheight);
- $w->sync;
- }
-
-#- my $b = new Gtk::Button;
-#- $b->signal_connect(clicked => sub {
-#- my $w = my_gtk->new('', grab => 1, force_position => [ $stepswidth, $logoheight ]);
-#- $w->{rwindow}->set_usize($logowidth, $height - $logoheight);
-#- gtkadd($w->{window},
-#- gtkpack_(new Gtk::VBox(0,0),
-#- 1, createScrolledWindow(gtktext_insert(new Gtk::Text,
-#- formatAlaTeX(translate($help::steps_long{$o->{step}})))),
-#- 0, gtksignal_connect(new Gtk::Button(_("Ok")), "clicked" => sub { Gtk->main_quit }),
-#- ));
-#- $w->main;
-#- });
-#- my @l = (@questionmark_head,
-#- join('', "X c #", map { sprintf "%02X", $_ / 256 } @background1),
-#- join('', "O c #", map { sprintf "%02X", $_ / 256 } @background2),
-#- @questionmark_body);
-#- my @pixmap = Gtk::Gdk::Pixmap->create_from_xpm_d($w->{window}->window, undef, @l);
-#- gtkadd($b, new Gtk::Pixmap(@pixmap));
-
- Gtk::XmHTML->init;
- gtkadd($w->{window},
- gtkpack_(new Gtk::HBox(0,-2),
-#- 0, $b,
- 1, createScrolledWindow($w_help = new Gtk::XmHTML)));
-#- 1, createScrolledWindow($w_help = new Gtk::Text)));
- $w_help->source($o->{step} ? translate($o->{steps}{$o->{step}}{help}) : '');
-#- gtktext_insert($w_help, $o->{step} ? formatAlaTeX(translate($o->{steps}{$o->{step}}{help})) : '');
-
- $w->show;
- $o->{help_window} = $w;
-}
-
-#------------------------------------------------------------------------------
-sub create_steps_window {
- my ($o) = @_;
-
- $o->{steps_window}->destroy if $o->{steps_window};
- my %reachableSteps if 0;
- %reachableSteps = ();
-
- my $w = bless {}, 'my_gtk';
- $w->{rwindow} = $w->{window} = new Gtk::Window;
- $w->{rwindow}->set_uposition(0, 0);
- $w->{rwindow}->set_usize($stepswidth, $stepsheight);
- $w->{rwindow}->set_name("Steps");
- $w->{rwindow}->set_events('button_press_mask');
- $w->{rwindow}->signal_connect(button_press_event => sub {
- $::setstep or return;
- my $Y = $_[1]{'y'};
- map_each {
- my (undef, $y, undef, $height) = @{$::b->allocation};
- $y <= $Y && $Y < $y + $height and die "setstep $::a\n";
- } %reachableSteps;
- });
- $w->show;
+sub set_help {
+ my ($o, @l) = @_;
- gtkadd($w->{window},
- gtkpack_(new Gtk::VBox(0,0),
- (map { 1, $_ } map {
- my $step = $o->{steps}{$_};
- my $circle =
- $step->{done} && \@green_circle ||
- $step->{entered} && \@orange_circle ||
- \@red_circle;
- my @pixmap = Gtk::Gdk::Pixmap->create_from_xpm_d($w->{window}->window, undef, @$circle);
-
- my $w = new Gtk::Label(translate($step->{text}));
-
- $w->set_name("Steps" . ($step->{reachable} && "Reachable"));
- my $b = new Gtk::HBox(0,5);
- gtkpack_($b, 0, new Gtk::Pixmap(@pixmap), 0, $w);
-
- $reachableSteps{$_} = $b if $step->{reachable};
- $b;
- } grep { !(($::beginner || !$o->{installClass}) && $o->{steps}{$_}{beginnerHidden}) } @{$o->{orderedSteps}}),
- 0, gtkpack(new Gtk::HBox(0,0), map {
- my $t = $_;
- my $w = new Gtk::Button('');
- $w->set_name($t);
- $w->set_usize(0, 7);
- gtksignal_connect($w, clicked => sub { install_theme($o, $t); die "theme_changed\n" });
- } @themes)));
- $w->show;
- $o->{steps_window} = $w;
+ $o->{current_help} = formatAlaTeX(join "\n", map { _ deref($help::steps{$_}) } @l);
+ gtktext_insert($o->{help_window_text}, $o->{current_help});
+ 1;
}
-#------------------------------------------------------------------------------
-sub create_logo_window() {
- my ($o) = @_;
- gtkdestroy($o->{logo_window});
- my $w = bless {}, 'my_gtk';
- $w->{rwindow} = $w->{window} = new Gtk::Window;
- $w->{rwindow}->set_uposition($stepswidth, 0);
- $w->{rwindow}->set_usize($logowidth, $logoheight);
- $w->{rwindow}->set_name("background");
- $w->show;
- my $file = "logo-mandrake.xpm";
- -r $file or $file = "/usr/share/$file";
- if (-r $file) {
- my $ww = $w->{window};
- my @logo = Gtk::Gdk::Pixmap->create_from_xpm($ww->window, $ww->style->bg('normal'), $file);
- gtkadd($ww, new Gtk::Pixmap(@logo));
- }
- $o->{logo_window} = $w;
-}
-
-#------------------------------------------------------------------------------
-sub createXconf($$$) {
- my ($file, $mouse_type, $mouse_dev) = @_;
- $mouse_type ||= "Microsoft";
- $mouse_dev = devices::make($mouse_dev || "ttyS0");
-
- local *F;
- open F, ">$file" or die "can't create X configuration file $file";
- print F <<END;
-Section "Files"
- FontPath "/usr/X11R6/lib/X11/fonts"
-EndSection
-
-Section "Keyboard"
- Protocol "Standard"
- AutoRepeat 500 5
-
- LeftAlt Meta
- RightAlt Meta
- ScrollLock Compose
- RightCtl Control
-EndSection
-
-Section "Pointer"
- Protocol "$mouse_type"
- Device "$mouse_dev"
- Emulate3Buttons
- Emulate3Timeout 50
-EndSection
-
-
-Section "Monitor"
- Identifier "My Monitor"
- VendorName "Unknown"
- ModelName "Unknown"
- HorizSync 31.5-35.5
- VertRefresh 50-70
- Modeline "640x480" 25.175 640 664 760 800 480 491 493 525
- Modeline "640x480" 28.3 640 664 760 800 480 491 493 525
-EndSection
-
-
-Section "Device"
- Identifier "Generic VGA"
- VendorName "Unknown"
- BoardName "Unknown"
- Chipset "generic"
-EndSection
-
-
-Section "Screen"
- Driver "svga"
- Device "Generic VGA"
- Monitor "My Monitor"
- Subsection "Display"
- Modes "640x480"
- ViewPort 0 0
- EndSubsection
-EndSection
-
-Section "Screen"
- Driver "vga16"
- Device "Generic VGA"
- Monitor "My Monitor"
- Subsection "Display"
- Modes "640x480"
- ViewPort 0 0
- EndSubsection
-EndSection
-
-Section "Screen"
- Driver "fbdev"
- Device "Generic VGA"
- Monitor "My Monitor"
- Subsection "Display"
- Depth 16
- Modes "default"
- ViewPort 0 0
- EndSubsection
-EndSection
-END
-
-}
-#- ModeLine "640x480" 28 640 672 768 800 480 490 492 525
#-######################################################################################
#- Wonderful perl :(
#-######################################################################################