summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--perl-install/Xconfig/resolution_and_depth.pm117
1 files changed, 109 insertions, 8 deletions
diff --git a/perl-install/Xconfig/resolution_and_depth.pm b/perl-install/Xconfig/resolution_and_depth.pm
index bb23b8f95..d2a6ff16f 100644
--- a/perl-install/Xconfig/resolution_and_depth.pm
+++ b/perl-install/Xconfig/resolution_and_depth.pm
@@ -118,13 +118,9 @@ sub filter_using_HorizSync {
sub choose {
my ($in, $default_resolution, @resolutions) = @_;
- if (0 && $in->isa('interactive::gtk')) {
- chooseResolutionsGtk($default_resolution, @resolutions);
- } else {
- $in->ask_from_listf(_("Resolutions"), "",
- sub { "$_->{X}x$_->{Y} $_->{Depth}bpp" },
- \@resolutions, $default_resolution || {});
- }
+ $in->ask_from_listf(_("Resolutions"), "",
+ sub { "$_->{X}x$_->{Y} $_->{Depth}bpp" },
+ \@resolutions, $default_resolution || {});
}
@@ -163,7 +159,11 @@ sub configure {
my ($default_resolution, @resolutions) = choices($raw_X, $raw_X->get_resolution, $card, $monitor);
- $default_resolution = choose($in, $default_resolution, @resolutions) or return;
+ if ($in->isa('interactive::gtk')) {
+ $default_resolution = choose_gtk($card, $default_resolution, @resolutions) or return;
+ } else {
+ $default_resolution = choose($in, $default_resolution, @resolutions) or return;
+ }
$raw_X->set_resolution($default_resolution);
$default_resolution;
@@ -182,4 +182,105 @@ sub configure_auto_install {
$default_resolution;
}
+sub choose_gtk {
+ my ($card, $default_resolution, @resolutions) = @_;
+
+ my ($chosen_x_res, $chosen_Depth) = @$default_resolution{'X', 'Depth'};
+ $chosen_x_res ||= 640;
+
+ my %x_res2y_res = map { $_->{X} => $_->{Y} } @resolutions;
+ my %x_res2depth; push @{$x_res2depth{$_->{X}}}, $_->{Depth} foreach @resolutions;
+ my %depth2x_res; push @{$depth2x_res{$_->{Depth}}}, $_->{X} foreach @resolutions;
+
+ require my_gtk;
+ my_gtk->import(qw(:helpers :wrappers));
+ my $W = my_gtk->new(_("Resolution"));
+
+ my %monitor_images_x_res = do {
+ my @l = qw(640 800 1024 1280);
+ my %h = map { $_ => [ gtkcreate_png("monitor-$_.png") ] } @l;
+
+ #- for the other, use the biggest smaller
+ foreach my $x_res (uniq map { $_->{X} } @resolutions) {
+ my $x_res_ = max(grep { $_ <= $x_res } @l);
+ $h{$x_res} ||= $h{$x_res_};
+ }
+ %h;
+ };
+
+ my ($depth_combo, $x_res_combo);
+
+ my $pix_colors = gtkpng("colors");
+ my $set_chosen_Depth_image = sub {
+ $pix_colors->set(gtkcreate_png(
+ $chosen_Depth >= 24 ? "colors.png" :
+ $chosen_Depth >= 15 ? "colors16.png" : "colors8.png"));
+ };
+
+ my $set_chosen_Depth = sub {
+ $chosen_Depth = $_[0];
+ $depth_combo->entry->set_text(translate($depth2text{$chosen_Depth}));
+ $set_chosen_Depth_image->();
+ };
+
+ my $pixmap_mo;
+ my $set_chosen_x_res = sub {
+ $chosen_x_res = $_[0];
+ my $image = $monitor_images_x_res{$chosen_x_res} or internal_error("no image for resolution $chosen_x_res");
+ $pixmap_mo ? $pixmap_mo->set($image->[0], $image->[1]) : ($pixmap_mo = new Gtk::Pixmap($image->[0], $image->[1]));
+ };
+ $set_chosen_x_res->($chosen_x_res);
+
+ gtkadd($W->{window},
+ gtkpack_($W->create_box_with_title(_("Choose the resolution and the color depth"),
+ if_($card->{BoardName}, "(" . _("Graphics card: %s", $card->{BoardName}) . ")"),
+ ),
+ 1, gtkpack2(new Gtk::VBox(0,0),
+ gtkpack2__(new Gtk::VBox(0, 15),
+ $pixmap_mo,
+ gtkpack2(new Gtk::HBox(0,0),
+ create_packtable({ col_spacings => 5, row_spacings => 5},
+ [ $x_res_combo = new Gtk::Combo, new Gtk::Label("")],
+ [ $depth_combo = new Gtk::Combo, gtkadd(gtkset_shadow_type(new Gtk::Frame, 'etched_out'), $pix_colors) ],
+ ),
+ ),
+ ),
+ ),
+ 0, gtkadd($W->create_okcancel(_("Ok"), _("Cancel"))),
+ ));
+ $depth_combo->disable_activate;
+ $depth_combo->set_use_arrows_always(1);
+ $depth_combo->entry->set_editable(0);
+ $depth_combo->set_popdown_strings(map { translate($depth2text{$_}) } ikeys %depth2x_res);
+ $depth_combo->entry->signal_connect(changed => sub {
+ my %txt2depth = reverse %depth2text;
+ my $s = $depth_combo->entry->get_text;
+ $chosen_Depth = $txt2depth{untranslate($s, keys %txt2depth)};
+ $set_chosen_Depth_image->();
+
+ if (!member($chosen_x_res, @{$depth2x_res{$chosen_Depth}})) {
+ $set_chosen_x_res->(max(@{$depth2x_res{$chosen_Depth}}));
+ }
+ });
+ $x_res_combo->disable_activate;
+ $x_res_combo->set_use_arrows_always(1);
+ $x_res_combo->entry->set_editable(0);
+ $x_res_combo->set_popdown_strings(map { $_ . "x" . $x_res2y_res{$_} } ikeys %x_res2y_res);
+ $x_res_combo->entry->signal_connect(changed => sub {
+ $x_res_combo->entry->get_text =~ /(.*?)x/;
+ $set_chosen_x_res->($1);
+
+ if (!member($chosen_Depth, @{$x_res2depth{$chosen_x_res}})) {
+ $set_chosen_Depth->(max(@{$x_res2depth{$chosen_x_res}}));
+ }
+ });
+ $set_chosen_Depth->($chosen_Depth);
+ $W->{ok}->grab_focus;
+
+ $x_res_combo->entry->set_text($chosen_x_res . "x" . $x_res2y_res{$chosen_x_res});
+ $W->main or return;
+
+ { X => $chosen_x_res, Depth => $chosen_Depth };
+}
+
1;