From: Ailin Nemui Date: Wed, 6 May 2020 16:34:49 +0000 (+0200) Subject: [adv_windowlist] update to 1.9 X-Git-Url: http://git.99rst.org/?a=commitdiff_plain;h=6876f693b4bab1b7425eceaf20665ca7bbe7fe20;p=irssi-scripts.irssi.org.git [adv_windowlist] update to 1.9 - add %Z support to viewer --- diff --git a/scripts/adv_windowlist.pl b/scripts/adv_windowlist.pl index e652ae7..031c550 100644 --- a/scripts/adv_windowlist.pl +++ b/scripts/adv_windowlist.pl @@ -1,7 +1,7 @@ use strict; use warnings; -our $VERSION = '1.8'; # 63feb35d8b0a8b6 +our $VERSION = '1.9'; # 32a6d4807a45e71 our %IRSSI = ( authors => 'Nei', contact => 'Nei @ anti@conference.jabber.teamidiot.de', @@ -1266,6 +1266,7 @@ sub syncViewer { ha => $S{height_adjust}, mc => $S{maxcolumns}, ml => $S{maxlines}, + tc => $S{true_colour}, ); $viewer{client_settings} = 1; } @@ -1357,6 +1358,7 @@ sub reset_awl { mouse_escape => Irssi::settings_get_int( 'mouse_escape'), line_shade => Irssi::settings_get_time(set 'last_line_shade'), no_mode_hint => Irssi::settings_get_bool(set 'no_mode_hint'), + true_colour => Irssi::parse_special('$colors_ansi_24bit'), viewer_launch => Irssi::settings_get_bool(set 'viewer_launch'), viewer_launch_env => Irssi::settings_get_str(set 'viewer_launch_env'), viewer_xwin_command => Irssi::settings_get_str(set 'viewer_xwin_command'), @@ -1433,7 +1435,7 @@ return sub { } my $new_settings = join "\n", $VIEWER_MODE - ? ("\\", $S{block}, $S{height_adjust}, $S{maxlines}, $S{maxcolumns}) + ? ("\\", $S{block}, $S{height_adjust}, $S{maxlines}, $S{maxcolumns}, $S{true_colour}) : ("!", $S{placement}, $S{position}); my $first_viewer = $settings_str eq '1'; @@ -2122,6 +2124,8 @@ UNITCHECK sub setab16 { "\e[10" . $_[0] . 'm' } sub setaf256 { "\e[38;5;" . $_[0] . 'm' } sub setab256 { "\e[48;5;" . $_[0] . 'm' } + sub setafrgb { "\e[38;2;" . $_[0] . ';' . $_[1] . ';' . $_[2] . 'm' } + sub setabrgb { "\e[48;2;" . $_[0] . ';' . $_[1] . ';' . $_[2] . 'm' } sub sgr0 { "\e[0m" } sub bold { "\e[1m" } sub it { "\e[3m" } @@ -2308,16 +2312,84 @@ UNITCHECK $ansi_table{ "X7\U$ch" } = sub { Terminfo::setaf256($close) }; } + # fe-windows.c:color_24bit_256 + my $cc = sub { + use integer; + + my $cstep_size = 40; + my $cstep_start = 0x5f; + + my $gstep_size = 10; + my $gstep_start = 0x08; + + my @dist = (0) x 3; + my @r; my @gr; + + for (my $i = 0; $i < 3; ++$i) { + my $n = $_[$i]; + $gr[$i] = -1; + if ($n < $cstep_start /2) { + $r[$i] = 0; + $dist[$i] = -$cstep_size/2; + } + else { + $r[$i] = 1+(($n-$cstep_start + $cstep_size /2)/$cstep_size); + $dist[$i] = (($n-$cstep_start + $cstep_size /2)% $cstep_size - $cstep_size/2); + } + if ($n < $gstep_start /2) { + $gr[$i] = -1; + } + else { + $gr[$i] = (($n-$gstep_start + $gstep_size /2)/$gstep_size); + } + } + if ($r[0] == $r[1] && $r[1] == $r[2] && + 4*abs($dist[0]) < $gstep_size && 4*abs($dist[1]) < $gstep_size && 4*abs($dist[2]) < $gstep_size) { + # skip gray detection + } + else { + my $j = $r[1] == $r[2] ? 0 : 1; + if (($r[0] == $r[1] || $r[$j] == $r[2]) && abs($r[$j]-$r[($j+1)% 3]) <= 1) { + my $k = $gr[1] == $gr[2] ? 0 : 1; + if (($gr[0] == $gr[1] || $gr[$k] == $gr[2]) && abs($gr[$k]-$gr[($k+1)% 3]) <= 2) { + if ($gr[$k] < 0) { + $r[0] = $r[1] = $r[2] = 0; + } + elsif ($gr[$k] > 23) { + $r[0] = $r[1] = $r[2] = 5; + } + else { + $r[0] = 6; + $r[1] = ($gr[$k] / 6); + $r[2] = $gr[$k]% 6; + } + } + } + } + return 16 + $r[0]*36 + $r[1] * 6 + $r[2]; + }; + $ansi_table{z} = sub { + my ($r, $g, $b) = map { hex } unpack '(A2)*', $_[0]; + $vars{tc} eq 'ON' ? Terminfo::setabrgb($r, $g, $b) : Terminfo::setab256($cc->($r, $g, $b)); + }; + $ansi_table{Z} = sub { + my ($r, $g, $b) = map { hex } unpack '(A2)*', $_[0]; + $vars{tc} eq 'ON' ? Terminfo::setafrgb($r, $g, $b) : Terminfo::setaf256($cc->($r, $g, $b)); + }; sub formats_to_ansi_basic { my $o = shift; - $o =~ s/(%(X..|x..|.))/exists $ansi_table{$2} ? $ansi_table{$2}->() : $1/gex; + $o =~ s{(%((Z|z)(......)|X..|x..|.))}{ + if ($ansi_table{$2}) { $ansi_table{$2}->() } + elsif ($ansi_table{$3}) { $ansi_table{$3}->($4) } + else { $1 } + }gex; $o } } sub _header { my $str = $vars{title} // uc ::setc(); - my $ccs = qr/%(?:X(?:[1-6][0-9A-Z]|7[A-X])|[0-9BCFGIKMNRUWY_])/i; + my $ccs = qr/%(?:Z(?:[0-9A-F]{6})|X(?:[1-6][0-9A-Z]|7[A-X])|[0-9BCFGIKMNRUWY_])/i; (my $stripstr = $str) =~ s/($ccs)//g; my $space = int( ((abs $vars{block}) - length $stripstr) / (1 + length $stripstr)); if ($space > 0) { @@ -2739,6 +2811,9 @@ UNITCHECK # Changelog # ========= +# 1.9 +# - add %Z support to viewer +# # 1.8 # - use string_width in Irssi 1.2.0 #