summaryrefslogtreecommitdiffstats
path: root/perl-install/interactive/curses.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/interactive/curses.pm')
-rw-r--r--perl-install/interactive/curses.pm38
1 files changed, 29 insertions, 9 deletions
diff --git a/perl-install/interactive/curses.pm b/perl-install/interactive/curses.pm
index ffeeafd32..64bdee5c7 100644
--- a/perl-install/interactive/curses.pm
+++ b/perl-install/interactive/curses.pm
@@ -3,7 +3,7 @@
# to debug, use something like
# PERLDB_OPTS=TTY=`tty` LC_ALL=fr_FR.UTF-8 xterm -geometry 80x25 -e sh -c 'DISPLAY= perl -d t.pl'
-package interactive::curses; # $Id$
+package interactive::curses;
use diagnostics;
use strict;
@@ -32,12 +32,19 @@ sub new {
open STDERR, ">", common::secured_file($stderr_file);
$cui ||= Curses::UI->new('-color_support' => 1);
+
+ # Set some default terminal size, for serial install
+ unless ($cui->{'-width'}) {
+ $cui->{'-width'} = $cui->{'-w'} = $cui->{'-bw'} = 80;
+ $cui->{'-height'} = $cui->{'-h'} = $cui->{'-bh'} = 25;
+ }
+
bless { cui => $cui }, $class;
}
sub enter_console { &suspend }
sub leave_console { &end }
-sub suspend { $cui->leave_curses }
+sub suspend { $cui && $cui->leave_curses }
sub resume { $cui->reset_curses }
sub end { &suspend; print $SAVEERR $_ foreach cat_($stderr_file); unlink $stderr_file }
sub exit { end(); CORE::exit($_[1] || 0) }
@@ -170,7 +177,7 @@ sub compute_size {
$e->{curses}{'-width'} ||= length($s);
} elsif ($e->{type} eq 'expander') {
$e->{curses}{'-width'} ||= length("<+> $e->{text}");
- } elsif ($e->{type} eq 'text' || $e->{type} eq 'label' || $e->{type} eq 'only_label') {
+ } elsif (member($e->{type}, qw(text label only_label))) {
my @text = _messages(min(80, $width_avail - 1), ${$e->{val}}); #- -1 because of the scrollbar
$e->{curses}{'-focusable'} = 0;
$e->{curses}{'-height'} ||= heights(int(@text), 10, 4);
@@ -345,7 +352,7 @@ sub create_widget {
$w->set_binding('focus-up', Curses::KEY_LEFT());
$w->set_binding('focus-down', Curses::KEY_RIGHT());
$set = sub { $w->set_label(0, sprintf('< %s >', may_apply($e->{format}, $_[0]))) };
- } elsif ($e->{type} eq 'list' || $e->{type} eq 'combo') {
+ } elsif (member($e->{type}, qw(list combo))) {
$w = $win->add(undef, $e->{type} eq 'combo' ? 'Popupmenu' : 'Listbox',
'-values' => $e->{formatted_list},
'-onchange' => $onchange->(sub { $e->{list}[$w->id] }),
@@ -398,13 +405,26 @@ sub create_widget {
} elsif ($e->{type} eq 'label' && $e->{curses}{'-height'} == 1) {
$w = $win->add(undef, 'Label', %options);
$set = sub { $w->text($_[0] || '') };
- } elsif ($e->{type} eq 'label' || $e->{type} eq 'only_label' || $e->{type} eq 'text') {
+ } elsif (member($e->{type}, qw(label only_label text))) {
$w = $win->add(undef, 'TextViewer', %options);
$set = sub {
my ($text) = @_;
my $width = $w->{'-sw'} - ($w->{'-vscrollbar'} ? 1 : 0);
$w->text(join("\n", _messages($width, $text)));
};
+ } elsif ($e->{type} eq 'range') {
+ $w = $win->add(undef, 'TextEntry',
+ '-sbborder' => 1,
+ '-text' => '',
+ '-regexp' => '/^\d*$/',
+ '-onchange' => sub {
+ $w->text($e->{min}) if $w->text < $e->{min};
+ $w->text($e->{max}) if $w->text > $e->{max};
+ ${$e->{val}} = $w->text;
+ $changed->() if $changed;
+ },
+ %options);
+ $set = sub { $w->text($_[0] || '') };
} else {
$w = $win->add(undef, $e->{hidden} ? 'PasswordEntry' : 'TextEntry',
'-sbborder' => 1,
@@ -545,7 +565,7 @@ sub ask_fileW {
$dir = $opts->{directory} || $opts->{file} && dirname($opts->{file});
- if($opts->{save}) {
+ if ($opts->{save}) {
$file = $o->{cui}->savefilebrowser('-title' => $opts->{title}, '-path' => $dir, '-file' => basename($file));
} else {
$file = $o->{cui}->loadfilebrowser('-title' => $opts->{title}, '-path' => $dir, '-file' => basename($file));
@@ -554,13 +574,13 @@ sub ask_fileW {
my $err;
if (!$file) {
$err = N("No file chosen");
- } elsif(-f $file && $opts->{want_a_dir}) {
+ } elsif (-f $file && $opts->{want_a_dir}) {
$file = dirname($file);
- } elsif(-d $file && !$opts->{want_a_dir}) {
+ } elsif (-d $file && !$opts->{want_a_dir}) {
$err = N("You have chosen a directory, not a file");
} elsif (!-e $file && !$opts->{save}) {
$err = $opts->{want_a_dir} ? N("No such directory") : N("No such file");
- };
+ }
$err and $o->ask_warn('', $err) or $file;
}