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',
ha => $S{height_adjust},
mc => $S{maxcolumns},
ml => $S{maxlines},
+ tc => $S{true_colour},
);
$viewer{client_settings} = 1;
}
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'),
}
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';
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" }
$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) {
# Changelog
# =========
+# 1.9
+# - add %Z support to viewer
+#
# 1.8
# - use string_width in Irssi 1.2.0
#