#!/usr/bin/perl #- Copyright (C) 2005 Mandrakesoft use strict; use warnings; BEGIN { #- set up a safe path and environment $ENV{PATH} = "/bin:/usr/bin:/usr/X11R6/bin"; delete @ENV{qw(ENV BASH_ENV IFS CDPATH)}; } use gurpmi; use urpm::msg qw(N); use Gtk2; use MDK::Common::Func qw(partition); sub quit () { Gtk2->main_quit } #- globals my (@all_rpms, $srpms, $rpms); my ($mainw, $mainbox); #- Gtk2 helper functions sub add_button_box { my ($vbox, @buttons) = @_; my $hbox = Gtk2::HButtonBox->new; $vbox->pack_start($hbox, 0, 0, 0); $hbox->set_layout('edge'); $_->set_alignment(0.5, 0.5), $hbox->add($_) foreach @buttons; } sub new_label { my ($msg) = @_; my $label = Gtk2::Label->new($msg); $label->set_line_wrap(1); $label->set_alignment(0.5, 0.5); if (($msg =~ tr/\n/\n/) > 5) { my $sw = Gtk2::ScrolledWindow->new; $sw->set_policy('never', 'automatic'); $sw->add_with_viewport($label); $sw->set_size_request(-1,200); return $sw; } else { return $label; } } #- Parse command line foreach (@ARGV) { if (/^-/) { /^--?[hv?]/ and gurpmi::usage(); gurpmi::fatal N("Unknown option %s", $_); } push @all_rpms, $_; } @all_rpms or gurpmi::fatal N("No packages specified"); #- Now, the graphical stuff. Gtk2->init; #- Create main window $mainw = Gtk2::Window->new('toplevel'); $mainw->set_border_width(3); $mainw->set_title(N("RPM installation")); $mainw->signal_connect(destroy => \&quit); $mainw->set_position('center'); $mainw->set_modal(0); $mainbox = Gtk2::VBox->new(0, 5); $mainw->add($mainbox); #- Ask question: save or install ? #- change depending on the number of rpms, and on the presence of srpms ($srpms, $rpms) = partition { /\.src\.rpm$/ } @all_rpms; { my $msg = ( @$srpms > 0 ? N("You have selected a source package: %s You probably didn't want to install it on your computer (installing it would allow you to make modifications to its sourcecode then compile it). What would you like to do?", $srpms->[0]) : @all_rpms == 1 ? N("You are about to install the following software package on your computer: %s You may prefer to just save it. What is your choice?", $rpms->[0]) : N("You are about to install the following software packages on your computer: %s Proceed?", join "\n", @all_rpms) ); $mainbox->pack_start(new_label($msg), 1, 1, 0); } { #- buttons my $inst_button = Gtk2::Button->new(gurpmi::but N("_Install")); my $save_button = @all_rpms == 1 ? Gtk2::Button->new(gurpmi::but N("_Save")) : undef; my $ccel_button = Gtk2::Button->new(gurpmi::but N("_Cancel")); $inst_button->signal_connect(clicked => sub { #- performs installation. quit(); #- we need to switch to root if we're not already (via consolehelper) #- yes. hardcoded paths. safe. exec $> ? '/usr/bin/gurpmi2' : '/usr/sbin/gurpmi2', @ARGV; }); $save_button and $save_button->signal_connect(clicked => sub { my $file_dialog = Gtk2::FileSelection->new(N("Choose location to save file")); $file_dialog->set_modal(1); $file_dialog->set_position('center'); my $filename = @$srpms > 0 ? $srpms->[0] : $rpms->[0]; $file_dialog->set_filename($filename); $file_dialog->hide_fileop_buttons; $file_dialog->ok_button->signal_connect(clicked => sub { my $location = $file_dialog->get_filename; quit(); $location and exec '/bin/mv', '-f', $filename, $location; }); $file_dialog->cancel_button->signal_connect(clicked => \&quit); $file_dialog->show; }); $ccel_button->signal_connect(clicked => \&quit); add_button_box($mainbox, grep { defined $_ } $inst_button, $save_button, $ccel_button); } $mainw->show_all; Gtk2->main;