summaryrefslogtreecommitdiffstats
path: root/perl-install/diskdrake/hd_gtk.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/diskdrake/hd_gtk.pm')
-rw-r--r--perl-install/diskdrake/hd_gtk.pm382
1 files changed, 0 insertions, 382 deletions
diff --git a/perl-install/diskdrake/hd_gtk.pm b/perl-install/diskdrake/hd_gtk.pm
deleted file mode 100644
index ea6a47724..000000000
--- a/perl-install/diskdrake/hd_gtk.pm
+++ /dev/null
@@ -1,382 +0,0 @@
-package diskdrake::hd_gtk; # $Id$
-
-use diagnostics;
-use strict;
-
-use common;
-use resize_fat::main;
-use my_gtk qw(:helpers :wrappers :ask);
-use partition_table qw(:types);
-use partition_table::raw;
-use detect_devices;
-use diskdrake::interactive;
-use run_program;
-use loopback;
-use devices;
-use raid;
-use any;
-use log;
-use fsedit;
-use fs;
-
-my ($width, $height, $minwidth) = (400, 50, 5);
-my ($all_hds, $in, $current_kind, $current_entry, $update_all);
-my ($w, @notebook, $done_button);
-
-=begin
-
-struct {
- string name # which is displayed in tab of the notebook
- bool no_auto # wether the kind can disappear after creation
- string type # one of { 'hd', 'raid', 'lvm', 'loopback', 'removable', 'nfs', 'smb' }
- hd | hd_lvm | part_raid[] | part_loopback[] | raw_hd[] val
-
- #
- widget main_box
- widget display_box
- widget action_box
- widget info_box
-} current_kind
-
-part current_entry
-
-notebook current_kind[]
-
-=cut
-
-sub main {
- ($in, $all_hds, my $nowizard) = @_;
-
- @notebook = ();
-
- local $in->{grab} = 1;
-
- $w = my_gtk->new('DiskDrake');
- my $rc = "/usr/share/libDrakX/diskdrake.rc";
- -r $rc or $rc = dirname(__FILE__) . "/../diskdrake.rc";
- -r $rc or $rc = dirname(__FILE__) . "/../share/diskdrake.rc";
- Gtk::Rc->parse($rc);
-
- # TODO
-# is_empty_array_ref($all_hds->{raids}) or raid::stopAll;
-# updateLoopback();
-
- gtkadd($w->{window},
- gtkpack_(new Gtk::VBox(0,7),
- 0, (my $filesystems_button_box = filesystems_button_box()),
- 1, (my $notebook_widget = new Gtk::Notebook),
- 0, (my $per_kind_action_box = new Gtk::HBox(0,0)),
- 0, (my $general_action_box = new Gtk::HBox(0,0)),
- ),
- );
- my $lock;
- $update_all = sub {
- $lock and return;
- $lock = 1;
- partition_table::assign_device_numbers($_) foreach fsedit::all_hds($all_hds);
- create_automatic_notebooks($notebook_widget);
- general_action_box($general_action_box, $nowizard);
- per_kind_action_box($per_kind_action_box, $current_kind);
- current_kind_changed($in, $current_kind);
- current_entry_changed($current_kind, $current_entry);
- $lock = 0;
- };
- create_automatic_notebooks($notebook_widget);
-
- $notebook_widget->signal_connect('switch_page' => sub {
- $current_kind = $notebook[$_[2]];
- $current_entry = '';
- $update_all->();
- });
- $w->sync;
- $done_button->grab_focus;
- $my_gtk::pop_it = 1;
- $in->ask_okcancel(_("Read carefully!"), _("Please make a backup of your data first"), 1) or return
- if $::isStandalone;
- $in->ask_warn('',
-_("If you plan to use aboot, be carefull to leave a free space (2048 sectors is enough)
-at the beginning of the disk")) if (arch() eq 'alpha') and !$::isEmbedded;
-
- $w->main;
-}
-
-sub try {
- my ($name, @args) = @_;
- my $f = $diskdrake::interactive::{$name} or die "unknown function $name";
- try_($name, \&{$f}, @args);
-}
-sub try_ {
- my ($name, $f, @args) = @_;
-
- fsedit::undo_prepare($all_hds) if $name ne 'Undo';
-
- my $v = eval { $f->($in, @args, $all_hds) };
- if (my $err = $@) {
- $err =~ /setstep/ and die '';
- $in->ask_warn(_("Error"), formatError($err));
- }
-
- $current_entry = '' if !diskdrake::interactive::is_part_existing($current_entry, $all_hds);
- $update_all->();
-
- if ($v && member($name, 'Done', 'Wizard')) {
- $::isEmbedded ? kill('USR1', $::CCPID) : Gtk->main_quit;
- }
-}
-
-################################################################################
-# generic: helpers
-################################################################################
-sub add_kind2notebook {
- my ($notebook_widget, $kind) = @_;
- die if $kind->{main_box};
-
- $kind->{display_box} = gtkset_usize(new Gtk::HBox(0,0), $width, $height);
- $kind->{action_box} = gtkset_usize(new Gtk::VBox(0,0), 150, 180);
- $kind->{info_box} = new Gtk::VBox(0,0);
- $kind->{main_box} =
- gtkpack_(new Gtk::VBox(0,7),
- 0, $kind->{display_box},
- 1, gtkpack_(new Gtk::HBox(0,7),
- 0, $kind->{action_box},
- 1, $kind->{info_box}));
- my_gtk::add2notebook($notebook_widget, $kind->{name}, $kind->{main_box});
- push @notebook, $kind;
- $kind;
-}
-
-sub general_action_box {
- my ($box, $nowizard) = @_;
- $_->widget->destroy foreach $box->children;
- my @actions = (if_($::isInstall && !$nowizard, __("Wizard")),
- diskdrake::interactive::general_possible_actions($in, $all_hds),
- __("Done"));
- foreach my $s (@actions) {
- my $button = new Gtk::Button(translate($s));
- $done_button = $button if $s eq 'Done';
- gtkadd($box, gtksignal_connect($button, clicked => sub { try($s) }));
- }
-}
-sub per_kind_action_box {
- my ($box, $kind) = @_;
- $_->widget->destroy foreach $box->children;
-
- $kind->{type} =~ /hd|lvm/ or return;
-
- foreach my $s (diskdrake::interactive::hd_possible_actions($in, kind2hd($kind), $all_hds)) {
- gtkadd($box,
- gtksignal_connect(new Gtk::Button(translate($s)),
- clicked => sub { try($s, kind2hd($kind)) }));
- }
-}
-sub per_entry_action_box {
- my ($box, $kind, $entry) = @_;
- $_->widget->destroy foreach $box->children;
-
- if ($entry) {
- my @buttons = map {
- my $s = $_;
- my $w = new Gtk::Button(translate($s));
- $w->signal_connect(clicked => sub { try($s, kind2hd($kind), $entry) });
- $w;
- } diskdrake::interactive::part_possible_actions($in, kind2hd($kind), $entry, $all_hds);
-
- gtkadd($box, gtkadd(new Gtk::Frame(_("Choose action")),
- createScrolledWindow(gtkpack__(new Gtk::VBox(0,0), @buttons)))) if @buttons;
- } else {
- my $txt = !$::isStandalone && fsedit::is_one_big_fat($all_hds->{hds}) ?
-_("You have one big FAT partition
-(generally used by MicroSoft Dos/Windows).
-I suggest you first resize that partition
-(click on it, then click on \"Resize\")") : _("Please click on a partition");
- gtkpack($box, gtktext_insert(new Gtk::Text, $txt));
- }
-}
-
-sub per_entry_info_box {
- my ($box, $kind, $entry) = @_;
- $_->widget->destroy foreach $box->children;
- my $info;
- if ($entry) {
- $info = diskdrake::interactive::format_part_info(kind2hd($kind), $entry);
- } elsif ($kind->{type} =~ /hd|lvm/) {
- $info = diskdrake::interactive::format_hd_info($kind->{val});
- }
- gtkpack($box, gtkadd(new Gtk::Frame(_("Details")), gtkset_justify(new Gtk::Label($info), 'left')));
-}
-
-sub current_kind_changed {
- my ($in, $kind) = @_;
-
- $_->widget->destroy foreach $kind->{display_box}->children;
-
- my $v = $kind->{val};
- my @parts =
- $kind->{type} eq 'raid' ? grep { $_ } @$v :
- $kind->{type} eq 'loopback' ? @$v : fsedit::get_fstab_and_holes($v);
- my $totalsectors =
- $kind->{type} =~ /raid|loopback/ ? sum(map { $_->{size} } @parts) : $v->{totalsectors};
- create_buttons4partitions($kind, $totalsectors, @parts);
-}
-
-sub current_entry_changed {
- my ($kind, $entry) = @_;
- $current_entry = $entry;
- if ($kind) {
- per_entry_action_box($kind->{action_box}, $kind, $entry);
- per_entry_info_box($kind->{info_box}, $kind, $entry);
- }
-}
-
-sub create_automatic_notebooks {
- my ($notebook_widget) = @_;
- my @l = fsedit::all_hds($all_hds);
-
- $_->{marked} = 0 foreach @notebook;
- my $may_add = sub {
- my ($kind) = @_;
- my @l = grep { $kind->{val} == $_->{val} } @notebook;
- @l > 1 and log::l("weird: create_automatic_notebooks");
- $kind = $l[0] || add_kind2notebook($notebook_widget, $kind);
- $kind->{marked} = 1;
- };
- $may_add->(hd2kind($_)) foreach @{$all_hds->{hds}};
- $may_add->(lvm2kind($_)) foreach @{$all_hds->{lvms}};
- $may_add->(raid2kind()) if grep { $_ } @{$all_hds->{raids}};
- $may_add->(loopback2kind()) if @{$all_hds->{loopbacks}};
-
- @notebook = grep_index {
- my $b = $_->{marked} or $notebook_widget->remove_page($::i);
- $b;
- } @notebook;
- @notebook or die '';
-}
-
-################################################################################
-# parts: helpers
-################################################################################
-sub create_buttons4partitions {
- my ($kind, $totalsectors, @parts) = @_;
-
- $width = max($width, 0.9 * second($w->{window}->window->get_size)) if $w->{window}->window;
-
- my $ratio = $totalsectors ? ($width - @parts * $minwidth) / $totalsectors : 1;
- while (1) {
- my $totalwidth = sum(map { $_->{size} * $ratio + $minwidth } @parts);
- $totalwidth <= $width and last;
- $ratio /= $totalwidth / $width * 1.1;
- }
-
- foreach my $entry (@parts) {
- my $w = new Gtk::Button($entry->{mntpoint} || '') or die '';
- $w->signal_connect(focus_in_event => sub { current_entry_changed($kind, $entry) });
- $w->signal_connect(button_press_event => sub { current_entry_changed($kind, $entry) });
- $w->signal_connect(key_press_event => sub {
- my ($w, $e) = @_;
- $e->{state} & 4 or return;
- my $c = chr $e->{keyval};
-
- foreach my $s (diskdrake::interactive::part_possible_actions($in, kind2hd($kind), $entry, $all_hds)) {
- ${{
- Create => 'c', Delete => 'd', Format => 'f',
- Loopback => 'l', Resize => 'r', Type => 't',
- Mount => 'M', Unmount => 'u', 'Mount point' => 'm',
- 'Add to LVM' => 'L', 'Remove from LVM' => 'L',
- 'Add to RAID' => 'R', 'Remove from RAID' => 'R',
- }}{$s} eq $c or next;
-
- try($s, kind2hd($kind), $entry);
- last;
- }
- });
- $w->set_name("PART_" . type2name($entry->{type}));
- $w->set_usize($entry->{size} * $ratio + $minwidth, 0);
- gtkpack__($kind->{display_box}, $w);
- $w->grab_focus if $current_entry && fsedit::is_same_part($current_entry, $entry);
- }
-}
-
-
-################################################################################
-# disks: helpers
-################################################################################
-sub current_hd {
- $current_kind->{type} eq 'hd' or die 'current_hd called but $current_kind is not an hd';
- $current_kind->{val};
-}
-sub current_part {
- current_hd();
- $current_entry;
-}
-
-sub kind2hd {
- my ($kind) = @_;
- $kind->{type} =~ /hd|lvm/ ? $kind->{val} : {}
-}
-
-sub hd2kind {
- my ($hd) = @_;
- { type => 'hd', name => $hd->{device}, val => $hd };
-}
-
-sub filesystems_button_box() {
- my @types = (__("Ext2"), __("Journalised FS"), __("Swap"), arch() =~ /sparc/ ? __("SunOS") : arch() eq "ppc" ? __("HFS") : __("FAT"),
- __("Other"), __("Empty"));
- my %name2type = (Ext2 => 0x83, 'Journalised FS' => 0x483, Swap => 0x82, Other => 1, FAT => 0xb, HFS => 0x402);
-
- gtkpack(new Gtk::HBox(0,0),
- _("Filesystem types:"),
- map { my $w = new Gtk::Button(translate($_));
- my $t = $name2type{$_};
- $w->signal_connect(clicked => sub { try_('', \&createOrChangeType, $t, current_hd(), current_part()) });
- $w->can_focus(0);
- $w->set_name($_);
- $w;
- } @types);
-}
-
-sub createOrChangeType {
- my ($in, $type, $hd, $part, $all_hds) = @_;
-
- $part ||= !fsedit::get_fstab($hd) &&
- { type => 0, start => 1, size => $hd->{totalsectors} - 1 };
- $part or return;
- if ($type == 1) {
- $in->ask_warn('', _("Use ``%s'' instead", $part->{type} ? _("Type") : _("Create")));
- } elsif (!$type) {
- $in->ask_warn('', _("Use ``%s'' instead", _("Delete"))) if $part->{type};
- } elsif ($part->{type}) {
- return unless $::expert;
- return if $type == $part->{type};
- isBusy($part) and $in->ask_warn('', _("Use ``Unmount'' first")), return;
- diskdrake::interactive::ask_alldatawillbelost($in, $part, __("After changing type of partition %s, all data on this partition will be lost")) or return;
- diskdrake::interactive::check_type($in, $type, $hd, $part) and fsedit::change_type($type, $hd, $part);
- } else {
- $part->{type} = $type;
- diskdrake::interactive::Create($in, $hd, $part, $all_hds);
- }
-}
-
-################################################################################
-# lvms: helpers
-################################################################################
-sub lvm2kind {
- my ($lvm) = @_;
- { type => 'lvm', name => $lvm->{LVMname}, val => $lvm };
-}
-
-################################################################################
-# raids: helpers
-################################################################################
-sub raid2kind {
- { type => 'raid', name => 'raid', val => $all_hds->{raids} };
-}
-
-################################################################################
-# loopbacks: helpers
-################################################################################
-sub loopback2kind {
- { type => 'loopback', name => 'loopback', val => $all_hds->{loopbacks} };
-}
-
-1;