our
$VERSION
=
'0.024'
;
our
@EXPORT_OK
=
qw/term_size USE_GCS USE_TERM_READKEY USE_TERM_SIZE_ANY uni_length/
;
sub
DEFAULT_SIZE() { 80 }
my
$IO
;
BEGIN {
open
(
$IO
,
'>&'
,
*STDOUT
) or
die
"Could not clone STDOUT"
;
}
sub
try
(&) {
my
$code
=
shift
;
local
($@, $?, $!);
my
$ok
=
eval
{
$code
->(); 1 };
my
$err
= $@;
return
(
$ok
,
$err
);
}
my
(
$tsa
) =
try
{
require
Term::Size::Any; Term::Size::Any->
import
(
'chars'
) };
$trk
&&= Term::ReadKey->can(
'GetTerminalSize'
);
if
(!-t
$IO
) {
*USE_TERM_READKEY
=
sub
() { 0 };
*USE_TERM_SIZE_ANY
=
sub
() { 0 };
*term_size
=
sub
{
return
$ENV
{TABLE_TERM_SIZE}
if
$ENV
{TABLE_TERM_SIZE};
return
DEFAULT_SIZE;
};
}
elsif
(
$tsa
) {
*USE_TERM_READKEY
=
sub
() { 0 };
*USE_TERM_SIZE_ANY
=
sub
() { 1 };
*_term_size
=
sub
{
my
$size
= chars(
$IO
);
return
DEFAULT_SIZE
if
!
$size
;
return
DEFAULT_SIZE
if
$size
< DEFAULT_SIZE;
return
$size
;
};
}
elsif
(
$trk
) {
*USE_TERM_READKEY
=
sub
() { 1 };
*USE_TERM_SIZE_ANY
=
sub
() { 0 };
*_term_size
=
sub
{
my
$total
;
try
{
my
@warnings
;
{
local
$SIG
{__WARN__} =
sub
{
push
@warnings
=>
@_
};
(
$total
) = Term::ReadKey::GetTerminalSize(
$IO
);
}
@warnings
=
grep
{
$_
!~ m/Unable to get Terminal Size/ }
@warnings
;
warn
@warnings
if
@warnings
;
};
return
DEFAULT_SIZE
if
!
$total
;
return
DEFAULT_SIZE
if
$total
< DEFAULT_SIZE;
return
$total
;
};
}
else
{
*USE_TERM_READKEY
=
sub
() { 0 };
*USE_TERM_SIZE_ANY
=
sub
() { 0 };
*term_size
=
sub
{
return
$ENV
{TABLE_TERM_SIZE}
if
$ENV
{TABLE_TERM_SIZE};
return
DEFAULT_SIZE;
};
}
if
(USE_TERM_READKEY() || USE_TERM_SIZE_ANY()) {
if
(
index
(
$Config
{sig_name},
'WINCH'
) >= 0) {
my
$changed
= 0;
my
$polled
= -1;
$SIG
{WINCH} =
sub
{
$changed
++ };
my
$size
;
*term_size
=
sub
{
return
$ENV
{TABLE_TERM_SIZE}
if
$ENV
{TABLE_TERM_SIZE};
unless
(
$changed
==
$polled
) {
$polled
=
$changed
;
$size
= _term_size();
}
return
$size
;
}
}
else
{
*term_size
=
sub
{
return
$ENV
{TABLE_TERM_SIZE}
if
$ENV
{TABLE_TERM_SIZE};
_term_size();
};
}
}
if
(
$gcs
) {
*USE_GCS
=
sub
() { 1 };
*uni_length
=
sub
{ Unicode::GCString->new(
$_
[0])->columns };
}
else
{
*USE_GCS
=
sub
() { 0 };
*uni_length
=
sub
{
length
(
$_
[0]) };
}
1;