#!/bin/bash # # cursescheck Test ACS/UTF-8 Line Graphics and REP capability # of a terminal line described by variable TERM. # # Written in bash code to show and test capabilities of an terminal # or terminal emulator without the `magic' of a binary program using # libncurses(w) as many users do belive that ncurses defines the # behaviour of a terminal. Here we show that the terminfo database # given by the TERM variable simply describes the capabilities of # a terminal. For this `infocmp(1)' and `tput(1)' is used as well # the helpers `tty(1)', `grep(1), and `od(1)' are used herein. # # Author: Werner Fink # typeset -i rep=0 line=0 color=0 hpa=0 ech=0 for s in 0 1 2 do test -c /proc/$$/fd/$s || { echo "Missing /proc/$$/fd/$s" 1>&2; exit 1; } done for d in null tty do test -c /dev/$d || { echo "Missing /dev/$d" 1>&2; exit 1; } done for d in pts fd do test -d /dev/$d || { echo "Missing /dev/$d/" 1>&2; exit 1; } done for p in tput infocmp tty grep od do type -p $p 1> /dev/null 2>&1 || { echo "Missing $p in path" 1>&2; exit 1; } done typeset -r tty=$(tty) || { echo "Not on a terminal line" 1>&2; exit 1; } typeset -i width=$(tput cols) || { echo "No terminal size" 1>&2; exit 1; } typeset -i height=$(tput lines) || { echo "No terminal size" 1>&2; exit 1; } # # There are terminal type which uses non printable characters for # Line Graphic. Therefore store them as numbers or sequences within # arrays used later on. # typeset -i c typeset -A acsc acsn typeset -a tmp="($(tput acsc | od -A none -tx1))" for ((c=0;c<${#tmp[@]};c+=2)) do acsc[0x${tmp[c]}]="0x${tmp[c+1]}" acsn[0x${tmp[c]}]=\\x${tmp[c+1]} done unset tmp c # # Init terminal # tput init || { echo "Not a terminal" 1>&2; exit 1; } if test -n "$(infocmp -T $TERM -1 | grep "colors#")" then let color++ fi if test -n "$(infocmp -T $TERM -1 | grep "hpa=")" then let hpa++ fi if test -n "$(infocmp -T $TERM -1 | grep "ech=")" then let ech++ fi # # Restore screen at exit # trap 'tput cup 0 0; tput sgr0; tput cvvis; tput rmcup; exit' EXIT HUP INT TERM # # Save screen, make curse invisible, and goto upper left # tput smcup tput civis tput cup 0 0 if ((color > 0)) then tput -S <<-! setab 4 setaf 7 ! fi tput ed echo Checking for Line Graphics on $tty with TERM=$TERM let line++ echo Found ${#acsc[@]} ACSC characters, check used Font and its Mapping let line++ tput cup $((line + 2)) 0 typeset -i row=$((line+2)) col=4 typeset smacs=$(tput enacs; tput smacs) typeset rmacs=$(tput rmacs) for sub in ${!acsc[@]} do tput cup $row $col printf "$sub\t\x${sub//0x/}\t${smacs}${acsn[$sub]}${rmacs}" if ((row++ > height-4)) then let col=width/2-4 let row=line+2 fi done unset sub smacs rmacs tput cup $line 0 tput cvvis echo -n "OK> " read -t 5 yesno # # Could use clear # tput -S <<-! civis cup 0 0 ed ! let line=0 echo Checking for UTF-8 Line Graphics on $tty with TERM=$TERM let line++ echo Use U+2500 upto U+25FF glyps, check used Font and its Mapping let line++ tput cup $((line+2)) 0 typeset -i row=$((line+2)) col=4 for x in 94 95 96 97 do x=\\x$x for ((c=128;c<=191;c++)) do y=\\x$(printf '%x\n' $c) tput cup $row $col printf "\xe2${x}${y}" if ((row++ > height-4)) then let col+=2 let row=line+2 fi done done unset sub smacs rmacs tput cup $line 0 tput cvvis echo -n "OK> " read -t 5 yesno tput civis # # Could use clear # tput -S <<-! civis cup 0 0 ed ! let line=0 if ((${#acsc[@]} > 0)) then typeset -i cx=20 echo Terminal TERM=$TERM has ASC Line Graphics let line++ echo Use them to draw a simple box let line++ let row=height/2-4 let col=8 tput cup $row $col tput -S <<-! enacs civis smacs ! if ((color > 0)) then tput -S <<-! setab 7 setaf 0 ! fi echo -ne ${acsn[0x6c]} for ((c=0;c 0 && ech > 0)) && tput ech $cx ((hpa > 0)) && tput hpa $((col+cx+1)) || tput cup $((row+c)) $((col+cx+1)) echo -ne ${acsn[0x78]} done tput cup $((row+c)) $col echo -ne ${acsn[0x6d]} for ((c=0;c 0 && ech > 0)) then tput -S <<-! setab 0 setaf 0 cup $((row+1)) $((col+cx+2)) ech 2 cup $((row+2)) $((col+cx+2)) ech 2 cup $((row+3)) $((col+cx+2)) ech 2 cup $((row+4)) $((col+cx+2)) ech 2 cup $((row+5)) $((col+2)) ech $((cx+2)) setab 4 setaf 7 ! else tput rev for ((c=1;c<5;c++)) do tput cup $((row+c)) $((col+cx+2)) echo -n " " done tput cup $((row+c)) $((col+2)) printf ' %.0s' $(eval echo {1..$((cx+2))}) tput sgr0 fi tput -S <<-! rmacs ! tput cup $((row+2)) $((col+4)) echo -n "" tput cup $line 0 tput cvvis echo -n "OK> " read -t 5 yesno tput civis else echo Terminal TERM=$TERM has no ASC Line Graphics. tput cvvis echo -n "OK> " read -t 5 yesno tput civis fi # # Could use clear # tput -S <<-! civis cup 0 0 ed ! let line=0 if ((1)) then # # UTF-8 wide character line glyphs # ul=\\xe2\\x94\\x8c ur=\\xe2\\x94\\x90 hl=\\xe2\\x94\\x80 vl=\\xe2\\x94\\x82 dl=\\xe2\\x94\\x94 dr=\\xe2\\x94\\x98 typeset -i cx=20 echo Terminal TERM=$TERM with UTF-8 Line Graphics let line++ echo Use them to draw a simple box let line++ let row=height/2-4 let col=8 tput cup $row $col if ((color > 0)) then tput -S <<-! setab 7 setaf 0 ! fi tput enacs tput civis echo -ne ${ul} for ((c=0;c<$cx;c++)); do echo -ne ${hl}; done echo -ne ${ur} for ((c=1;c<4;c++)) do tput cup $((row+c)) $col echo -ne ${vl} ((color > 0 && ech > 0)) && tput ech $cx ((hpa > 0)) && tput hpa $((col+cx+1)) || tput cup $((row+c)) $((col+cx+1)) echo -ne ${vl} done tput cup $((row+c)) $col echo -ne ${dl} for ((c=0;c<$cx;c++)); do echo -ne ${hl}; done echo -ne ${dr} if ((color > 0 && ech > 0)) then tput -S <<-! setab 0 setaf 0 cup $((row+1)) $((col+cx+2)) ech 2 cup $((row+2)) $((col+cx+2)) ech 2 cup $((row+3)) $((col+cx+2)) ech 2 cup $((row+4)) $((col+cx+2)) ech 2 cup $((row+5)) $((col+2)) ech $((cx+2)) setab 4 setaf 7 ! else tput rev for ((c=1;c<5;c++)) do tput cup $((row+c)) $((col+cx+2)) echo -n " " done tput cup $((row+c)) $((col+2)) printf ' %.0s' $(eval echo {1..$((cx+2))}) tput sgr0 fi tput cup $((row+2)) $((col+4)) echo -n "" tput cup $line 0 tput cvvis echo -n "OK> " read -t 5 yesno tput civis else echo Terminal TERM=$TERM has no UTF-8 Line Graphics. tput cvvis echo -n "OK> " read -t 5 yesno tput civis fi # # Could use clear # tput -S <<-! civis cup 0 0 ed ! let line=0 if test -n "$(infocmp -T $TERM -1 | grep rep=)" then echo Found rep capability in terminfo database for TERM=$TERM let rep++ let line++ else echo No rep capability given in terminfo database for TERM=$TERM tput cvvis echo -n "OK> " read -t 5 yesno tput -S <<-! cup 0 0 sgr0 ed rmcup ! exit 0 fi if ((${#acsc[@]} > 0 && rep > 0)) then typeset -i cx=20 echo Testing rep capability of TERM=$TERM let line++ let row=height/2-4 let col=8 if ((color > 0)) then tput -S <<-! setab 7 setaf 0 ! fi tput -S <<-! enacs civis smacs cup $row $col ! echo -ne ${acsn[0x6c]} tput rep ${acsc[0x71]} $cx echo -ne ${acsn[0x6b]} for ((c=1;c<4;c++)) do tput cup $((row+c)) $col echo -ne ${acsn[0x78]} ((hpa > 0)) && tput hpa $((col+cx+1)) || tput cup $((row+c)) $((col+cx+1)) echo -ne ${acsn[0x78]} done tput cup $((row+c)) $col echo -ne ${acsn[0x6d]} tput rep ${acsc[0x71]} $cx echo -ne ${acsn[0x6a]} tput -S <<-! rmacs ! if ((color > 0 && ech > 0)) then tput -S <<-! cup $((row+1)) $((col+1)) ech $cx cup $((row+2)) $((col+1)) ech $cx cup $((row+3)) $((col+1)) ech $cx setab 0 setaf 0 cup $((row+1)) $((col+cx+2)) ech 2 cup $((row+2)) $((col+cx+2)) ech 2 cup $((row+3)) $((col+cx+2)) ech 2 cup $((row+4)) $((col+cx+2)) ech 2 cup $((row+5)) $((col+2)) ech $((cx+2)) setab 4 setaf 7 ! else tput rev for ((c=1;c<5;c++)) do tput cup $((row+c)) $((col+cx+2)) echo -n " " done tput cup $((row+c)) $((col+2)) printf ' %.0s' $(eval echo {1..$((cx+2))}) tput sgr0 fi tput cup $((row+2)) $((col+4)) echo -n "" tput cup $line 0 tput cvvis echo -n "OK> " read -t 5 yesno fi