diff options
Diffstat (limited to 'app/xterm/vttests/scroll.pl')
-rw-r--r-- | app/xterm/vttests/scroll.pl | 299 |
1 files changed, 167 insertions, 132 deletions
diff --git a/app/xterm/vttests/scroll.pl b/app/xterm/vttests/scroll.pl index f95e1deb1..274bfca73 100644 --- a/app/xterm/vttests/scroll.pl +++ b/app/xterm/vttests/scroll.pl @@ -1,9 +1,9 @@ #!/usr/bin/env perl -# $XTermId: scroll.pl,v 1.2 2009/07/02 23:54:51 tom Exp $ +# $XTermId: scroll.pl,v 1.4 2022/10/10 17:02:54 tom Exp $ # ----------------------------------------------------------------------------- # this file is part of xterm # -# Copyright 2009 by Thomas E. Dickey +# Copyright 2009,2022 by Thomas E. Dickey # # All Rights Reserved # @@ -38,189 +38,222 @@ # add option to wrap the test-pattern # use scrolling-margins to help fill-in a chunk use strict; +use warnings; use Getopt::Std; -# do this so outout from successive calls to this script won't get in the +# do this so output from successive calls to this script won't get in the # wrong order: use IO::Handle; STDERR->autoflush(1); STDOUT->autoflush(1); -our ($opt_c, $opt_n, $opt_r, $opt_w); -our ($lineno, $test_string, $term_height, $term_width, $max_scroll); +our ( $opt_c, $opt_n, $opt_r, $opt_w ); +our ( $lineno, $test_string, $term_height, $term_width, $max_scroll ); + +our @resize; + +sub read_resize($) { + my $field = shift; + my $result = shift; + if ( $#resize < 0 ) { + open( FP, "resize -u |" ) or exit $!; + @resize = <FP>; + chomp @resize; + close(FP); + } + for my $n ( 0 .. $#resize ) { + if ( $resize[$n] =~ /^$field=/ ) { + $result = $resize[$n]; + $result =~ s/^[^=]*=//; + $result =~ s/;.*//; + last; + } + } + return $result; +} # returns the number of rows in the screen sub screen_height() { - my $data = `resize -u |fgrep LINES=`; - $data =~ s/LINES=//; - $data =~ s/;//; - return $data + return &read_resize( "LINES", 24 ); } # returns the number of columns in the screen sub screen_width() { - my $data = `resize -u |fgrep COLUMNS=`; - $data =~ s/COLUMNS=//; - $data =~ s/;//; - return $data + return &read_resize( "COLUMNS", 80 ); } sub set_color($) { - my $code = $_[0]; - if (defined($opt_c)) { - if ($code == 3) { - printf "\x1b[1;33;42m"; # yellow-on-green - } elsif ($code == 2) { - printf "\x1b[0;31;45m"; # red-on-magenta - } elsif ($code == 1) { - printf "\x1b[0;36;44m"; # cyan-on-blue - } else { - printf "\x1b[0;39;49m"; - } - } + my $code = $_[0]; + if ( defined($opt_c) ) { + if ( $code == 3 ) { + printf "\x1b[1;33;42m"; # yellow-on-green + } + elsif ( $code == 2 ) { + printf "\x1b[0;31;45m"; # red-on-magenta + } + elsif ( $code == 1 ) { + printf "\x1b[0;36;44m"; # cyan-on-blue + } + else { + printf "\x1b[0;39;49m"; + } + } } # returns a string of two-column characters given an ASCII alpha/numeric string sub double_cells($) { - my $value = $_[0]; - $value =~ s/ / /g; - pack("U*", - map { ($_ <= 32 || $_ > 127) # if non-ASCII character... - ? 32 # ...just show a blank - : (0xff00 + ($_ - 32)) # map to "Fullwidth Form" - } unpack("C*", $value)); # unpack unsigned-char characters + my $value = $_[0]; + $value =~ s/ / /g; + pack( + "U*", + map { + ( $_ <= 32 || $_ > 127 ) # if non-ASCII character... + ? 32 # ...just show a blank + : ( 0xff00 + ( $_ - 32 ) ) # map to "Fullwidth Form" + } unpack( "C*", $value ) + ); # unpack unsigned-char characters } sub clear_screen() { - upper_left(); - printf "\x1b[J"; + upper_left(); + printf "\x1b[J"; } sub clr_to_eol() { - printf "\x1b[K"; + printf "\x1b[K"; } sub lower_left() { - printf "\x1b[%dH", $term_height; + printf "\x1b[%dH", $term_height; } sub upper_left() { - printf "\x1b[H"; + printf "\x1b[H"; } sub move_to($) { - printf "\x1b[%dG", $_[0] + 1; + printf "\x1b[%dG", $_[0] + 1; } sub bak_scroll($) { - #lower_left; - if ($_[0]) { - printf "\x1b[%dS", $_[0]; - } else { - printf "\x1b[S"; - } + + #lower_left; + if ( $_[0] ) { + printf "\x1b[%dS", $_[0]; + } + else { + printf "\x1b[S"; + } } sub fwd_scroll($) { - if ($_[0]) { - printf "\x1b[%dT", $_[0]; - } else { - printf "\x1b[T"; - } + if ( $_[0] ) { + printf "\x1b[%dT", $_[0]; + } + else { + printf "\x1b[T"; + } } sub delete_char() { - set_color(2); - printf "\x1b[%dP", 1; - set_color(1); + set_color(2); + printf "\x1b[%dP", 1; + set_color(1); } sub insert_once($) { - set_color(2); - printf "\x1b[%d@%s", length($_[0]); - write_chars($_[0]); + my $data = shift; + set_color(2); + printf "\x1b[%d@%s", length($data), $data; + write_chars($data); } sub insert_mode($) { - set_color(2); - printf "\x1b[%dP", length($_[0]); - printf "\x1b[4h"; - write_chars($_[0]); - printf "\x1b[4l"; + set_color(2); + printf "\x1b[%dP", length( $_[0] ); + printf "\x1b[4h"; + write_chars( $_[0] ); + printf "\x1b[4l"; } sub write_chars($) { - set_color(3); - printf "%s", $_[0]; - set_color(1); + set_color(3); + printf "%s", $_[0]; + set_color(1); } # vary the starting point of each line, to make a more interesting pattern sub starts_of($) { - my $value = $_[0]; - if (defined($opt_w)) { - # 0,1,1,2,2,3,3,... - $value = (($value + 1) / 2) % length($test_string); - } else { - $value %= length($test_string); - } - return $value; + my $value = $_[0]; + if ( defined($opt_w) ) { + + # 0,1,1,2,2,3,3,... + $value = ( ( $value + 1 ) / 2 ) % length($test_string); + } + else { + $value %= length($test_string); + } + return $value; } # write the text for the given line-number sub testit($) { - my $number = $_[0]; - my $length = $term_width; - # use delete-lines to "pull" the screen up, like scrolling. - select(undef, undef, undef, 0.1); - if ((($number / $max_scroll) % 2) != 0) { - lower_left; - fwd_scroll(1); - } else { - lower_left; - bak_scroll(1); - } - if ( defined($opt_n) ) { - printf "%5d ", $number % 99999; - $length -= 6; - } - # if we're printing double-column characters, we have half as much - # space effectively - but don't forget the remainder, so we can push - # the characters by single-columns. - if (defined($opt_c)) { - set_color(1); - clr_to_eol(); - } - my $starts = starts_of($number); - if ( defined($opt_w) ) { - printf " ", if ( ($number % 2 ) != 0); - $length = ($length - (($number) % 2)) / 2; - } - my $string = substr($test_string, $starts); - while ( length($string) < $length ) { - $string = $string . $test_string; - } - $string = substr($string, 0, $length); - if ( defined($opt_w) ) { - $string = double_cells($string); - } - printf "%s", $string; - # now - within the line - modify it - move_to((4 * $term_width) / 5); - insert_mode("XX"); - move_to((3 * $term_width) / 5); - delete_char(); - move_to((2 * $term_width) / 5); - insert_once('~'); - move_to((1 * $term_width) / 5); - write_chars('~'); - move_to(0); - set_color(0); + my $number = $_[0]; + my $length = $term_width; + + # use delete-lines to "pull" the screen up, like scrolling. + select( undef, undef, undef, 0.1 ); + if ( ( ( $number / $max_scroll ) % 2 ) != 0 ) { + lower_left; + fwd_scroll(1); + } + else { + lower_left; + bak_scroll(1); + } + if ( defined($opt_n) ) { + printf "%5d ", $number % 99999; + $length -= 6; + } + + # if we're printing double-column characters, we have half as much + # space effectively - but don't forget the remainder, so we can push + # the characters by single-columns. + if ( defined($opt_c) ) { + set_color(1); + clr_to_eol(); + } + my $starts = starts_of($number); + if ( defined($opt_w) ) { + printf " ", if ( ( $number % 2 ) != 0 ); + $length = ( $length - ( ($number) % 2 ) ) / 2; + } + my $string = substr( $test_string, $starts ); + while ( length($string) < $length ) { + $string = $string . $test_string; + } + $string = substr( $string, 0, $length ); + if ( defined($opt_w) ) { + $string = double_cells($string); + } + printf "%s", $string; + + # now - within the line - modify it + move_to( ( 4 * $term_width ) / 5 ); + insert_mode("XX"); + move_to( ( 3 * $term_width ) / 5 ); + delete_char(); + move_to( ( 2 * $term_width ) / 5 ); + insert_once('~'); + move_to( ( 1 * $term_width ) / 5 ); + write_chars('~'); + move_to(0); + set_color(0); } sub main::HELP_MESSAGE() { - printf STDERR <<EOF + printf STDERR <<EOF Usage: $0 [options] Options: @@ -230,28 +263,30 @@ Options: -r repeat indefinitely -w write wide-characters EOF -; - exit; + ; + exit; } &getopts('cnrw') || die(); $term_height = screen_height(); -$term_width = screen_width(); -$max_scroll = $term_height * 2; +$term_width = screen_width(); +$max_scroll = $term_height * 2; -$test_string="0123456789 abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +$test_string = + "0123456789 abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -binmode(STDOUT, ":utf8"); +binmode( STDOUT, ":utf8" ); clear_screen(); if ( defined($opt_r) ) { - for ($lineno = 0; ; ++$lineno) { - testit($lineno); - } -} else { - for ($lineno = 0; $lineno < $max_scroll * 2; ++$lineno) { - testit($lineno); - } + for ( $lineno = 0 ; ; ++$lineno ) { + testit($lineno); + } +} +else { + for ( $lineno = 0 ; $lineno < $max_scroll * 2 ; ++$lineno ) { + testit($lineno); + } } lower_left(); clr_to_eol(); |