Curses-Simp
view release on metacpan or search on metacpan
if(!$GLBL{'FLAGCOLR'} && has_colors()){ $GLBL{'FLAGCOLR'} = COLOR_PAIRS(); # init all pairs 1st time thru
for( my $i=0; $i<NumC(); $i++){ # COLOR_PAIR index should not init_pair 0 usually && the -1 BkGrnd subst dezign8zUzngDfaltColrz fromNCursesX10shn
for(my $j=0; $j<NumC(); $j++){ init_pair($j*NumC() +$i+1, $i, (($j) ? $j : -1)); } } }
if($GLBL{'FLAGCOLR'}){
if($fgcl eq -1){ $curp = $self->{'_valullsp'} if(defined($self->{'_valullsp'})); $bold = $self->{'_valullsb'}; } # return to last color pair && bold values
else{ $fgcl = $clet{$fgcl} if(exists($clet{$fgcl})); $fgcl = dec($fgcl) % 16 if($fgcl =~ /[A-Z]/i); if($fgcl > 7 ){ $bold = 1; $fgcl -= 8; }
$bgcl = $clet{$bgcl} if(exists($clet{$bgcl})); $bgcl = dec($bgcl) % 8 if($bgcl =~ /[A-Z]/i); if($fgcl > 7 || $fgcl < 0){ $fgcl = 7; }
$bgcl = 0 unless(defined($bgcl) && $bgcl =~ /^\d+$/i); $bgcl %= 8 if($bgcl > 7); $bgcl = 0 if($bgcl < 0); $curp = $bgcl*NumC() +$fgcl+1; }
if(defined($self->{'_wind'})){ if(!defined($self->{'_valulasp'}) || $self->{'_valulasp'} != $curp){
$self->{'_wind'}->attroff(COLOR_PAIR($self->{'_valulasp'})) if(defined($self->{'_valulasp'})); $self->{'_wind'}->attron( COLOR_PAIR($curp)); }
if($bold){ $self->{'_wind'}->attron( $abld); }else{ $self->{'_wind'}->attroff($abld); }
if(!defined($self->{'_valulasp'}) || !defined($self->{'_valulasb'}) || $self->{'_valulasp'} != $curp || $self->{'_valulasb'} != $bold){
$self->{'_valullsp'} = $self->{'_valulasp'};$self->{'_valulasp'} = $curp;$self->{'_valullsb'} = $self->{'_valulasb'};$self->{'_valulasb'} = $bold; } }
} return($curp); }
sub BordChar{ my($self, $loca, $noip)= @_; # return characters for different border types with NoInitPair flag to keep border color the same
unless($noip){ my $fgcl = $self->{'_brfc'}; my $bgcl = $self->{'_brbc'}; $self->InitPair($fgcl, $bgcl) if($self->{'_flagclru'}); }
$self->{'_wind'}->addch( $BORDSETS[($self->{'_btyp'} - 1)]{lc($loca)} ); }
sub CnvAnsCC{ my $self = shift; my $acod = shift; my @alut = @telc; my $bold = 0; my($fgcl, $bgcl)=('w', 'k'); # convert ANSI Escaped Color Codes
$acod =~ s/(^[;0]|;$)//g; # strip all trailing or leading semicolons or zeros
while($acod =~ s/^(\d+);?//){
if ( 1 == $1 ){ $bold = 1; } # Attribute codes: 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
elsif(30 <= $1 && $1 <= 37){ $fgcl = $alut[($1 - 30)]; } # Foreground color codes: 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
elsif(40 <= $1 && $1 <= 47){ $bgcl = $alut[($1 - 40)]; } # Background color codes: 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
} $fgcl = uc($fgcl) if($bold); return($fgcl, $bgcl); }
sub ShokScrn{ my $self = shift; my($ycrs, $xcrs); my $slvl = 0; my($keey, $valu); my $foun; # shock (redraw) the entire screen && all windows in order
while(@_){ ($keey, $valu)=(shift, shift); $foun = 0; # load key/vals like new() # exact match ck belo
if(defined($valu)){ for my $attr ($self->AttrNamz()){ if($attr =~ /$keey/i || $_verbose_attrnamz{$attr} eq $keey){ $self->{$attr} = $valu; $foun = 1; } }
unless($foun){ if($keey =~ /slvl/i){ $slvl = $valu; }else{ croak "!*EROR*! Curses::Simp::ShokScrn key:$keey was not recognized!\n";
# $keey =~ s/^_*/_/; $self->{$keey} = $valu; # auto-add unfound?
} } }else{ $slvl = $keey; } }
if($slvl > 0){ if($slvl > 1){ if($slvl > 2){ clear(); } touchwin(); } refresh(); }
for(@DISPSTAK){ ${$_}->{'_wind'}->touchwin(); # ${$_}->Move(); # just Move()?
if( ${$_}->{'_valudol8'}){ ${$_}->{'_wind'}->refresh(); ${$_}->{'_wind'}->getyx( $ycrs, $xcrs );
print(${$_}->{'_valudol8'}); printf("\e[%d;%dH", $ycrs + 1, $xcrs);
if($ycrs != ${$_}->{'_ycrs'} || $xcrs != ${$_}->{'_xcrs'}){ ${$_}->{'_wind'}->move( $ycrs, $xcrs );
${$_}->{'_wind'}->getyx(${$_}->{'_ycrs'}, ${$_}->{'_xcrs'});
if( ${$_}->{'_btyp' }){ ${$_}->{'_ycrs'}--; ${$_}->{'_xcrs'}--; } } }
${$_}->{'_wind'}->refresh(); } }
sub KNum{ return %knum; }
sub CLet{ return %clet; }
sub OScr{ no strict 'subs'; # Open a new Curses Screen && setup all useful stuff
unless($GLBL{'FLAGOPEN'}){ $GLBL{'FLAGOPEN'} = 1;
if(!$curs && $^O eq 'MSWin32' && $ENV{'COMSPEC'} =~ /4nt\.exe$/i){ $GLBL{'FLAGU4NT'} = 1; # clear 4NT screen && get variables
my $data = `echos _KBHIT %_KBHIT%; &
echos _ROWS %_ROWS%; &
echos _COLUMNS %_COLUMNS%; &
echos _ROW %_ROW%; &
echos _COLUMN %_COLUMN%; &
echos _FG %_FG%; &
echos _BG %_BG%; &
echos _CWD %_CWD%; &
echos _YEAR %_YEAR%; &
echos _MONTH %_MONTH%; &
echos _DAY %_DAY%; &
echos _DOWI %_DOWI%; &
echos _HOUR %_HOUR%; &
echos _MINUTE %_MINUTE%; &
echos _SECOND %_SECOND%;`; while($data =~ s/(_[BCDFHKMRSY][ABEGIOW][ACDHLNUWY]?[IORSTU]?[HMNT]?[DEN]?S?)\s+([^;]*);//){ $SDAT{$1} = $2; }
return; # raw() allows ^C,^S,^Z 2simply pass thru,unlike cbreak(),but raw requirz`reset`from the cmdline,if the app crashes; napms($ms) 2nap millisecs;
} initscr();noecho();nonl();raw();start_color();$GLBL{'FLAGUDCL'} = eval('use_default_colors(); 1') || 0;
# start_color without use_default_colors was making transparent GnomeTerminal BackGround solid blacK; A7QAMqt: ... but since use_default_colors() above is
# not defined in some SunOS/Solaris Curses libraries, I've wrapped it in an eval to hopefully pass their CPAN tests; # below: nodelay()||timeout(-1)...
curs_set(0);keypad(1);meta(1);intrflush(0);notimeout(0);timeout(0);clear();move(getmaxy()-1,getmaxx()-1);refresh(); # ... for non||blocking getch()
@BORDSETS = ( # initscr initializes line-draw chars for my border hash
{ 'ul' => ACS_ULCORNER, 'ur' => ACS_URCORNER,
'rt' => ACS_RTEE, 'lt' => ACS_LTEE,
'tt' => ACS_TTEE, 'bt' => ACS_BTEE,
'hl' => ACS_HLINE, 'vl' => ACS_VLINE,
'll' => ACS_LLCORNER, 'lr' => ACS_LRCORNER, },
{ 'ul' => '+', 'rt' => '{', 'lt' => '}', 'ur' => '+', # 032:20: !"#$%&' 040:28:()*+,-./ 048:30:01234567 056:38:89:;<=>?
'tt' => '+', 'bt' => '+', # 064:40:@ABCDEFG 072:48:HIJKLMNO 080:50:PQRSTUVW 088:58:XYZ[\]^_
'll' => '+', 'hl' => '-', 'vl' => '|', 'lr' => '+', }, # 096:60:`abcdefg 104:68:hijklmno 112:70:pqrstuvw 120:78:xyz{|}~
{ 'ul' => ' ', 'rt' => ' ', 'lt' => ' ', 'ur' => ' ', # 160:A0: ¡¢£¤¥¦§ 168:A8:¨©ª«¬®¯ 176:B0:°±²³´µ¶· 184:B8:¸¹º»¼½¾¿
'tt' => ' ', 'bt' => ' ', # 192:C0:ÀÁÂÃÄÅÆÇ 200:C8:ÈÉÊËÌÍÎÏ 208:D0:ÐÑÒÓÔÕÖ× 216:D8:ØÙÚÛÜÝÞß
'll' => ' ', 'hl' => ' ', 'vl' => ' ', 'lr' => ' ', }, # 224:E0:àáâãäåæç 232:E8:èéêëìíîï 240:F0:ðñòóôõö÷ 248:F8:øùúûüýþÿ
{ 'ul' => ACS_PLUS, 'ur' => ACS_PLUS,
'rt' => ACS_RARROW,'lt' => ACS_LARROW,
'tt' => ACS_UARROW,'bt' => ACS_DARROW,
'hl' => ACS_HLINE, 'vl' => ACS_VLINE,
'll' => ACS_PLUS, 'lr' => ACS_PLUS, },
{ 'ul' => 'X', 'rt' => '[', 'lt' => ']', 'ur' => 'X',
'tt' => '#', 'bt' => '#',
'll' => 'X', 'hl' => '=', 'vl' => 'I', 'lr' => 'X', },
);
@kndx = (
ERR , OK , ACS_BLOCK ,
ACS_BOARD , ACS_BTEE , ACS_BULLET ,
ACS_CKBOARD , ACS_DARROW , ACS_DEGREE ,
ACS_DIAMOND , ACS_HLINE , ACS_LANTERN ,
ACS_LARROW , ACS_LLCORNER , ACS_LRCORNER ,
ACS_LTEE , ACS_PLMINUS , ACS_PLUS ,
ACS_RARROW , ACS_RTEE , ACS_S1 ,
ACS_S9 , ACS_TTEE , ACS_UARROW ,
ACS_ULCORNER , ACS_URCORNER , ACS_VLINE ,
A_ALTCHARSET , A_ATTRIBUTES , A_BLINK ,
A_BOLD , A_CHARTEXT , A_COLOR ,
A_DIM , A_INVIS , A_NORMAL ,
A_PROTECT , A_REVERSE , A_STANDOUT ,
A_UNDERLINE , COLOR_BLACK , COLOR_BLUE ,
COLOR_CYAN , COLOR_GREEN , COLOR_MAGENTA ,
COLOR_RED , COLOR_WHITE , COLOR_YELLOW ,
KEY_A1 , KEY_A3 , KEY_B2 ,
KEY_BACKSPACE , KEY_BEG , KEY_BREAK ,
KEY_BTAB , KEY_C1 , KEY_C3 ,
KEY_CANCEL , KEY_CATAB , KEY_CLEAR ,
KEY_CLOSE , KEY_COMMAND , KEY_COPY ,
KEY_CREATE , KEY_CTAB , KEY_DC ,
KEY_DL , KEY_DOWN , KEY_EIC ,
KEY_END , KEY_ENTER , KEY_EOL ,
KEY_EOS , KEY_EXIT , KEY_F0 ,
KEY_FIND , KEY_HELP , KEY_HOME ,
KEY_IC , KEY_IL , KEY_LEFT ,
KEY_LL , KEY_MARK , KEY_MAX ,
KEY_MESSAGE , KEY_MIN , KEY_MOVE ,
KEY_NEXT , KEY_NPAGE , KEY_OPEN ,
KEY_OPTIONS , KEY_PPAGE , KEY_PREVIOUS ,
KEY_PRINT , KEY_REDO , KEY_REFERENCE ,
KEY_REFRESH , KEY_REPLACE , KEY_RESET ,
KEY_RESTART , KEY_RESUME , KEY_RIGHT ,
KEY_SAVE , KEY_SBEG , KEY_SCANCEL ,
KEY_SCOMMAND , KEY_SCOPY , KEY_SCREATE ,
( run in 0.658 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )