diff options
Diffstat (limited to 'perl-install/diskdrake/hd_gtk.pm')
| -rw-r--r-- | perl-install/diskdrake/hd_gtk.pm | 147 | 
1 files changed, 87 insertions, 60 deletions
| diff --git a/perl-install/diskdrake/hd_gtk.pm b/perl-install/diskdrake/hd_gtk.pm index 80536b24f..ed3955ea7 100644 --- a/perl-install/diskdrake/hd_gtk.pm +++ b/perl-install/diskdrake/hd_gtk.pm @@ -1,11 +1,11 @@ -package diskdrake::hd_gtk; # $Id: hd_gtk.pm 269772 2010-06-03 11:51:31Z pterjan $ +package diskdrake::hd_gtk;  use diagnostics;  use strict;  use common; -use mygtk2 qw(gtknew); -use ugtk2 qw(:helpers :wrappers :create); +use mygtk3 qw(gtknew); +use ugtk3 qw(:helpers :wrappers :create);  use partition_table;  use fs::type;  use detect_devices; @@ -16,21 +16,19 @@ use log;  use fsedit;  use feature qw(state); -my ($width, $height, $minwidth) = (400, 50, 5); +my ($width, $height, $minwidth) = (400, 50, 16);  my ($all_hds, $in, $do_force_reload, $current_kind, $current_entry, $update_all);  my ($w, @notebook, $done_button); -=begin -  =head1 SYNOPSYS -struct { + 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', 'dmcrypt' }    hd | hd_lvm | part_raid[] | part_dmcrypt[] | part_loopback[] | raw_hd[]  val - +     #     widget main_box    widget display_box @@ -38,17 +36,19 @@ struct {    widget info_box  } current_kind -part current_entry + part current_entry -notebook current_kind[] + notebook current_kind[]  =cut  sub load_theme() { -    my $rc = "/usr/share/libDrakX/diskdrake.rc"; -    -r $rc or $rc = dirname(__FILE__) . "/../diskdrake.rc"; -    -r $rc or $rc = dirname(__FILE__) . "/../share/diskdrake.rc"; -    Gtk2::Rc->parse($rc); +    my $css = "/usr/share/libDrakX/diskdrake.css"; +    -r $css or $css = dirname(__FILE__) . "/../diskdrake.css"; +    -r $css or $css = dirname(__FILE__) . "/../share/diskdrake.css"; +    my $pl = Gtk3::CssProvider->new; +    $pl->load_from_path($css); +    Gtk3::StyleContext::add_provider_for_screen(Gtk3::Gdk::Screen::get_default(), $pl, Gtk3::STYLE_PROVIDER_PRIORITY_APPLICATION);  }  sub main { @@ -58,26 +58,26 @@ sub main {      local $in->{grab} = 1; -    $w = ugtk2->new(N("Partitioning")); -    mygtk2::register_main_window($w->{real_window}) if !$::isEmbedded && !$::isInstall; +    $w = ugtk3->new(N("Partitioning")); +    mygtk3::register_main_window($w->{real_window}) if !$::isEmbedded && !$::isInstall;      load_theme(); +    $w->{window}->signal_connect('style-updated' => \&load_theme);      # TODO  #    is_empty_array_ref($all_hds->{raids}) or raid::stopAll;  #    updateLoopback();      gtkadd($w->{window}, -	   gtkpack_(Gtk2::VBox->new(0,7), +	   gtkpack_(Gtk3::VBox->new(0,7),  		    0, gtknew(($::isInstall ? ('Title1', 'label') : ('Label_Left', 'text'))                                  => N("Click on a partition, choose a filesystem type then choose an action"),                                # workaround infamous 6 years old gnome bug #101968: -                              width => mygtk2::get_label_width() +                              width => mygtk3::get_label_width()                              ), -		    1, (my $notebook_widget = Gtk2::Notebook->new), +		    1, (my $notebook_widget = Gtk3::Notebook->new),  		    0, (my $per_kind_action_box = gtknew('HButtonBox', layout => 'edge')), -		    0, (my $per_kind_action_box2 = gtknew('HButtonBox', layout => 'end')), -		    0, Gtk2::HSeparator->new, +		    0, Gtk3::HSeparator->new,  		    0, (my $general_action_box  = gtknew('HBox', spacing => 5)),  		   ),  	  ); @@ -92,12 +92,12 @@ sub main {  	partition_table::assign_device_numbers($_) foreach fs::get::hds($all_hds);  	create_automatic_notebooks($notebook_widget);  	general_action_box($general_action_box); -	per_kind_action_box($per_kind_action_box, $per_kind_action_box2, $current_kind); +	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;  	if ($o_refresh_gui) { -            my $new_page = $o_refresh_gui > 1 ? $notebook_widget->get_current_page() : 0; +            my $new_page = $o_refresh_gui > 1 ? $notebook_widget->get_current_page : 0;              $notebook_widget->set_current_page(-1);              $notebook_widget->set_current_page($new_page);  	} @@ -109,15 +109,33 @@ sub main {  	$current_entry = '';  	$update_all->();      }); -    # ensure partitions bar is properlyz size on first display: +    # ensure partitions bar is properly sized on first display:      $notebook_widget->signal_connect(realize => $update_all);      $w->sync; +    # add a bogus tab so that gtk+ displayed everything when there's only one disk: +    $notebook_widget->prepend_page(Gtk3::Label->new, Gtk3::Label->new); +    $notebook_widget->set_current_page(0); +    # there's always at least one child (at least a button for create a new part on empty discs): +    my @children = $current_kind->{display_box} ? $current_kind->{display_box}->get_children : (); +    # workaround for $notebook_widget being realized too early: +    if (!@children ||!$done_button) { +	$notebook_widget->set_current_page(-1); +	$notebook_widget->set_current_page(0); +	undef $initializing; +	$update_all->(2); +    } +    undef $initializing; +    # remove bogus tab we added just to be sure gtk+ displayed everything: +    $notebook_widget->remove_page(0); +    # restore position when there's several disks: +    $notebook_widget->set_current_page(0);      $done_button->grab_focus; -    $in->ask_from_list_(N("Read carefully"), N("Please make a backup of your data first"),  -			[ N_("Exit"), N_("Continue") ], N_("Continue")) eq N_("Continue") or return -      if $::isStandalone; +    if (!$::testing) { +      $in->ask_from_list_(N("Read carefully"), N("Please make a backup of your data first"),  +			  [ N_("Exit"), N_("Continue") ], N_("Continue")) eq N_("Continue") or return +        if $::isStandalone; +    } -    undef $initializing;      $w->main;  } @@ -132,6 +150,7 @@ sub try_ {      my $dm_active_before = ($current_entry && $current_entry->{dm_active} && $current_entry->{dm_name});      my $v = eval { $f->($in, @args, $all_hds) };      if (my $err = $@) { +	warn $err, "\n", backtrace() if $in->isa('interactive::gtk');  	$in->ask_warn(N("Error"), formatError($err));      }      my $refresh = 0; @@ -141,7 +160,7 @@ sub try_ {      }      if (!diskdrake::interactive::is_part_existing($current_entry, $all_hds)) { -        $current_entry = '' ; +        $current_entry = '';      } elsif (!$dm_active_before && $current_entry->{dm_active} && $current_entry->{dm_name}) {          if (my $mapped_part = fs::get::device2part("mapper/$current_entry->{dm_name}", $all_hds->{dmcrypts})) {              $current_entry = $mapped_part; @@ -150,7 +169,7 @@ sub try_ {      }      $update_all->($refresh); -    Gtk2->main_quit if $v && member($name, 'Done'); +    Gtk3->main_quit if $v && member($name, 'Done');  }  sub get_action_box_size() { @@ -164,19 +183,19 @@ sub add_kind2notebook {      my ($notebook_widget, $kind) = @_;      die if $kind->{main_box}; -    $kind->{display_box} = gtkset_size_request(Gtk2::HBox->new(0,0), $width, $height); -    $kind->{action_box} = gtkset_size_request(Gtk2::VBox->new, get_action_box_size()); -    $kind->{info_box} = Gtk2::VBox->new(0,0); +    $kind->{display_box} = gtkset_size_request(Gtk3::HBox->new(0,0), $width, $height); +    $kind->{action_box} = gtkset_size_request(Gtk3::VBox->new, get_action_box_size()); +    $kind->{info_box} = Gtk3::VBox->new(0,0);      my $box = -      gtkpack_(Gtk2::VBox->new(0,7), -	       0, $kind->{display_box}, +      gtkpack_(Gtk3::VBox->new(0,7), +	       0, create_scrolled_window($kind->{display_box}, [ 'automatic', 'never' ]),  	       0, filesystems_button_box(),  	       1, $kind->{info_box});      $kind->{main_box} = gtknew('HBox', spacing => 5, children => [          1, $box,          0, $kind->{action_box},      ]); -    ugtk2::add2notebook($notebook_widget, $kind->{name}, $kind->{main_box}); +    ugtk3::add2notebook($notebook_widget, $kind->{name}, $kind->{main_box});      push @notebook, $kind;      $kind;  } @@ -203,28 +222,25 @@ sub general_action_box {  		   N_("Done"));      my $box_end = gtknew('HButtonBox', layout => 'end', spacing => 5);      foreach my $s (@actions) { -	my $button = Gtk2::Button->new(translate($s)); +	my $button = Gtk3::Button->new(translate($s));  	$done_button = $button if $s eq 'Done';  	gtkadd($box_end, gtksignal_connect($button, clicked => sub { try($s) }));      }      gtkadd($box, $box_start, $box_end);  }  sub per_kind_action_box { -    my ($box, $box2, $kind) = @_; -    $_->destroy foreach $box->get_children, $box2->get_children; - -    $kind->{type} =~ /hd|lvm/ or return; +    my ($box, $kind) = @_; +    $_->destroy foreach $box->get_children; -    foreach my $s (diskdrake::interactive::hd_possible_actions_base($in)) { +    my @actions = (if_($kind->{type} =~ /hd|lvm/, diskdrake::interactive::hd_possible_actions_base($in)), +	diskdrake::interactive::hd_possible_actions_extra($in)); +    foreach my $s (@actions) {  	gtkadd($box,  -	       gtksignal_connect(Gtk2::Button->new(translate($s)), -				 clicked => sub { try($s, kind2hd($kind)) })); -    } -    foreach my $s (diskdrake::interactive::hd_possible_actions_extra($in)) { -	gtkadd($box2,  -	       gtksignal_connect(Gtk2::Button->new(translate($s)), +	       gtksignal_connect(Gtk3::Button->new(translate($s)),  				 clicked => sub { try($s, kind2hd($kind)) }));      } +    # make sure a big translations window to resize (as by default all buttons have the same size): +    $box->set_child_non_homogeneous($_, Glib::TRUE), "\n" foreach $box->get_children;  }  sub per_entry_action_box {      my ($box, $kind, $entry) = @_; @@ -233,18 +249,18 @@ sub per_entry_action_box {      if ($entry) {  	my @buttons = map {   	    my $s = $_; -	    my $w = Gtk2::Button->new(translate($s)); +	    my $w = Gtk3::Button->new(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, create_scrolled_window(gtkpack__(Gtk2::VBox->new, @buttons), undef, 'none')) if @buttons; +	gtkadd($box, create_scrolled_window(gtkpack__(Gtk3::VBox->new, @buttons), undef, 'none')) if @buttons;      } else {  	my $txt = !$::isStandalone && fsedit::is_one_big_fat_or_NT($all_hds->{hds}) ?  N("You have one big Microsoft Windows partition.  I suggest you first resize that partition  (click on it, then click on \"Resize\")") : N("Please click on a partition"); -	gtkpack($box, gtktext_insert(Gtk2::TextView->new, $txt)); +	gtkpack($box, gtktext_insert(Gtk3::TextView->new, $txt));      }  } @@ -265,6 +281,7 @@ sub per_entry_info_box {  sub current_kind_changed {      my ($_in, $kind) = @_; +    return if !$kind->{display_box};      $_->destroy foreach $kind->{display_box}->get_children;      my @parts = kind2parts($kind);      my $totalsectors = kind2sectors($kind, @parts); @@ -313,12 +330,20 @@ sub create_automatic_notebooks {  # parts: helpers  ################################################################################  sub create_buttons4partitions { -    my ($kind, $totalsectors, @parts) = @_; +    my ($kind, $totalsectors, @all_parts) = @_; + +    if ($w->{window}->get_window) { +	my $windowwidth = $w->{window}->get_allocated_width; +	$windowwidth = $::real_windowwidth if $windowwidth <= 1; +	$width = $windowwidth - first(get_action_box_size()) - 25; +    } -    $width = first($w->{window}->window->get_size) - first(get_action_box_size()) - 25 if $w->{window}->window; +    my @parts = grep { $_->{size} > MB(2) || !isEmpty($_) } @all_parts;      my $ratio = $totalsectors ? ($width - @parts * $minwidth) / $totalsectors : 1; -    while (1) { +    my $i = 1; +    while ($i < 30) { +	$i++;  	my $totalwidth = sum(map { $_->{size} * $ratio + $minwidth } @parts);  	$totalwidth <= $width and last;  	$ratio /= $totalwidth / $width * 1.1; @@ -336,9 +361,11 @@ sub create_buttons4partitions {  	    my $p = find { $entry->{dm_name} eq $_->{dmcrypt_name} } @{$all_hds->{dmcrypts}};  	    $entry = $p if $p;  	} -	my $info = $entry->{mntpoint} || $entry->{device_LABEL}; +	my $info = $entry->{mntpoint} || $entry->{device_LABEL} || '';  	$info .= "\n" . ($entry->{size} ? formatXiB($entry->{size}, 512) : N("Unknown")) if $info; -	my $w = Gtk2::ToggleButton->new_with_label($info) or internal_error('new_with_label'); +	my $w = ($info ? Gtk3::ToggleButton->new_with_label($info) : Gtk3::ToggleButton->new) or internal_error('new_with_label'); +	$info and $w->get_child->set_ellipsize('end'); +	$w->set_tooltip_text($info);  	$w->signal_connect(clicked => sub {   	    $current_button != $w or return;  	    current_entry_changed($kind, $entry);  @@ -365,7 +392,7 @@ sub create_buttons4partitions {  	if (isLUKS($entry) || isRawLUKS($entry)) {  	    $w->set_image(gtknew("Image", file => "security-strong"));  	} -	my @colorized_fs_types = qw(ext3 ext4 xfs swap vfat ntfs ntfs-3g); +	my @colorized_fs_types = qw(ext3 ext4 xfs swap vfat ntfs ntfs-3g exfat);  	$w->set_name("PART_" . (isEmpty($entry) ? 'empty' :   				$entry->{fs_type} && member($entry->{fs_type}, @colorized_fs_types) ? $entry->{fs_type} :  				'other')); @@ -402,17 +429,17 @@ sub hd2kind {  }  sub filesystems_button_box() { -    my @types = (N_("Ext4"), N_("XFS"), N_("Swap"), arch() =~ /sparc/ ? N_("SunOS") : arch() eq "ppc" ? N_("HFS") : N_("Windows"), +    my @types = (N_("Ext4"), N_("XFS"), N_("Swap"), N_("Windows"),  		 N_("Other"), N_("Empty"));      my %name2fs_type = (Ext3 => 'ext3', Ext4 => 'ext4', 'XFS' => 'xfs', Swap => 'swap', Other => 'other', "Windows" => 'vfat', HFS => 'hfs'); -    gtkpack(Gtk2::HBox->new,  +    gtkpack(Gtk3::HBox->new,   	    map {  		  my $t = $name2fs_type{$_};                    my $w = gtknew('Button', text => translate($_), widget_name => 'PART_' . ($t || 'empty'),                                   tip => N("Filesystem types:"),                                   clicked => sub { try_('', \&createOrChangeType, $t, current_hd(), current_part()) }); -		  $w->can_focus(0); +		  $w->set_can_focus(0);  		  $w;  	    } @types);  } | 
