tcapquery.pl revision 2eaa94a1
1d522f475Smrg#!/usr/bin/perl -w 22eaa94a1Schristos# $XTermId: tcapquery.pl,v 1.13 2008/10/05 16:20:14 tom Exp $ 3d522f475Smrg# 4d522f475Smrg# -- Thomas Dickey (2004/3/3) 5d522f475Smrg# Test the tcap-query option of xterm. 6d522f475Smrg 7d522f475Smrguse strict; 8d522f475Smrg 9d522f475Smrguse Getopt::Std; 10d522f475Smrguse IO::Handle; 11d522f475Smrg 12d522f475Smrgour ($opt_a, $opt_b, $opt_c, $opt_e, $opt_f, $opt_i, $opt_k, $opt_m, $opt_x); 13d522f475Smrg&getopts('abcefikmx:') || die("Usage: $0 [options]\n 14d522f475SmrgOptions:\n 15d522f475Smrg -a (same as -c -e -f -k -m) 16d522f475Smrg -b use both terminfo and termcap (default is termcap) 17d522f475Smrg -c cursor-keys 18d522f475Smrg -e editing keypad-keys 19d522f475Smrg -f function-keys 20d522f475Smrg -i use terminfo rather than termcap names 21d522f475Smrg -k numeric keypad-keys 22d522f475Smrg -m miscellaneous (none of -c, -e, -f, -k) 23d522f475Smrg -x KEY extended cursor/editing key (terminfo only) 24d522f475Smrg"); 25d522f475Smrg 26d522f475Smrgif ( not ( defined($opt_c) 27d522f475Smrg or defined($opt_e) 28d522f475Smrg or defined($opt_f) 29d522f475Smrg or defined($opt_k) 30d522f475Smrg or defined($opt_m) 31d522f475Smrg or defined($opt_x) ) ) { 32d522f475Smrg $opt_a=1; 33d522f475Smrg} 34d522f475Smrg 35d522f475Smrgsub get_reply($) { 36d522f475Smrg open TTY, "+</dev/tty" or die("Cannot open /dev/tty\n"); 37d522f475Smrg autoflush TTY 1; 38d522f475Smrg my $old=`stty -g`; 39d522f475Smrg system "stty raw -echo min 0 time 5"; 40d522f475Smrg 41d522f475Smrg print TTY @_; 42d522f475Smrg my $reply=<TTY>; 43d522f475Smrg close TTY; 44d522f475Smrg system "stty $old"; 45d522f475Smrg if ( defined $reply ) { 46d522f475Smrg die("^C received\n") if ( "$reply" eq "\003" ); 47d522f475Smrg } 48d522f475Smrg return $reply; 49d522f475Smrg} 50d522f475Smrg 51d522f475Smrgsub hexified($) { 52d522f475Smrg my $value = $_[0]; 53d522f475Smrg my $result = ""; 54d522f475Smrg my $n; 55d522f475Smrg 56d522f475Smrg for ( $n = 0; $n < length($value); ++$n) { 57d522f475Smrg $result .= sprintf("%02X", ord substr($value,$n,1)); 58d522f475Smrg } 59d522f475Smrg return $result; 60d522f475Smrg} 61d522f475Smrg 62d522f475Smrgsub query_tcap($$) { 63d522f475Smrg my $tcap = $_[0]; 64d522f475Smrg my $tinfo = $_[1]; 65d522f475Smrg my $param1 = hexified($tcap); 66d522f475Smrg my $param2 = hexified($tinfo); 67d522f475Smrg my $reply; 68d522f475Smrg 69d522f475Smrg # uncomment one of the following lines 70d522f475Smrg if ( defined($opt_b) ) { 71d522f475Smrg $reply=get_reply("\x1bP+q" . $param1 . ";" . $param2 . "\x1b\\"); 72d522f475Smrg } elsif ( defined($opt_i) ) { 73d522f475Smrg $reply=get_reply("\x1bP+q" . $param2 . "\x1b\\"); 74d522f475Smrg } else { 75d522f475Smrg $reply=get_reply("\x1bP+q" . $param1 . "\x1b\\"); 76d522f475Smrg } 77d522f475Smrg 78d522f475Smrg return unless defined $reply; 79d522f475Smrg if ( $reply =~ /\x1bP1\+r[[:xdigit:]]+=[[:xdigit:]]*.*/ ) { 80d522f475Smrg my $value = $reply; 81d522f475Smrg my $n; 82d522f475Smrg 83d522f475Smrg $value =~ s/^\x1bP1\+r//; 84d522f475Smrg $value =~ s/\x1b\\//; 85d522f475Smrg 86d522f475Smrg my $result = ""; 87d522f475Smrg for ( $n = 0; $n < length($value); ) { 88d522f475Smrg my $c = substr($value,$n,1); 89d522f475Smrg # handle semicolon and equals 90d522f475Smrg if ( $c =~ /[[:punct:]]/ ) { 91d522f475Smrg $n += 1; 92d522f475Smrg $result .= $c; 93d522f475Smrg } else { 94d522f475Smrg # handle hex-data 95d522f475Smrg my $k = hex substr($value,$n,2); 96d522f475Smrg if ( $k == 0x1b ) { 97d522f475Smrg $result .= "\\E"; 98d522f475Smrg } elsif ( $k == 0x7f ) { 99d522f475Smrg $result .= "^?"; 100d522f475Smrg } elsif ( $k == 32 ) { 101d522f475Smrg $result .= "\\s"; 102d522f475Smrg } elsif ( $k < 32 ) { 103d522f475Smrg $result .= sprintf("^%c", $k + 64); 104d522f475Smrg } elsif ( $k > 128 ) { 105d522f475Smrg $result .= sprintf("\\%03o", $k); 106d522f475Smrg } else { 107d522f475Smrg $result .= chr($k); 108d522f475Smrg } 109d522f475Smrg $n += 2; 110d522f475Smrg } 111d522f475Smrg } 112d522f475Smrg 113d522f475Smrg printf "%s\n", $result; 114d522f475Smrg } 115d522f475Smrg} 116d522f475Smrg 117d522f475Smrgsub query_extended($) { 118d522f475Smrg my $name = $_[0]; 119d522f475Smrg my $n; 120d522f475Smrg 121d522f475Smrg $name = "k" . $name if ( $name !~ /^k/ ); 122d522f475Smrg 123d522f475Smrg for ( $n = 2; $n <= 7; ++$n) { 124d522f475Smrg my $test = $name; 125d522f475Smrg $test = $test . $n if ( $n > 2 ); 126d522f475Smrg query_tcap( $name, $test ); 127d522f475Smrg } 128d522f475Smrg} 129d522f475Smrg 130d522f475Smrg# See xtermcapKeycode() 131d522f475Smrgif ( defined($opt_a) || defined($opt_c) ) { 132d522f475Smrgquery_tcap( "kl", "kcub1"); 133d522f475Smrgquery_tcap( "kd", "kcud1"); 134d522f475Smrgquery_tcap( "ku", "kcuu1"); 135d522f475Smrgquery_tcap( "kr", "kcuf1"); 136d522f475Smrg 137d522f475Smrgquery_tcap( "#4", "kLFT"); 138d522f475Smrgquery_tcap( "%c", "kNXT"); 139d522f475Smrgquery_tcap( "%e", "kPRV"); 140d522f475Smrgquery_tcap( "%i", "kRIT"); 141d522f475Smrg 142d522f475Smrg} 143d522f475Smrg 144d522f475Smrgif ( defined($opt_a) || defined($opt_e) ) { 145d522f475Smrgquery_tcap( "kD", "kdch1"); 146d522f475Smrgquery_tcap( "kI", "kich1"); 147d522f475Smrg 148d522f475Smrgquery_tcap( "kh", "khome"); 149d522f475Smrgquery_tcap( "\@7", "kend"); 150d522f475Smrgquery_tcap( "#2", "kHOM"); 151d522f475Smrgquery_tcap( "*7", "kEND"); 152d522f475Smrg 153d522f475Smrgquery_tcap( "*6", "kslt"); 154d522f475Smrgquery_tcap( "#6", "kSLT"); 155d522f475Smrgquery_tcap( "\@0", "kfnd"); 156d522f475Smrgquery_tcap( "*0", "kFND"); 157d522f475Smrg 158d522f475Smrgquery_tcap( "kN", "knp"); 159d522f475Smrgquery_tcap( "kP", "kpp"); 160d522f475Smrg} 161d522f475Smrg 162d522f475Smrgif ( defined($opt_a) || defined($opt_f) ) { 163d522f475Smrgquery_tcap( "k1", "kf1"); 164d522f475Smrgquery_tcap( "k2", "kf2"); 165d522f475Smrgquery_tcap( "k3", "kf3"); 166d522f475Smrgquery_tcap( "k4", "kf4"); 167d522f475Smrgquery_tcap( "k5", "kf5"); 168d522f475Smrgquery_tcap( "k6", "kf6"); 169d522f475Smrgquery_tcap( "k7", "kf7"); 170d522f475Smrgquery_tcap( "k8", "kf8"); 171d522f475Smrgquery_tcap( "k9", "kf9"); 172d522f475Smrgquery_tcap( "k;", "kf10"); 173d522f475Smrgquery_tcap( "F1", "kf11"); 174d522f475Smrgquery_tcap( "F2", "kf12"); 175d522f475Smrgquery_tcap( "F3", "kf13"); 176d522f475Smrgquery_tcap( "F4", "kf14"); 177d522f475Smrgquery_tcap( "F5", "kf15"); 178d522f475Smrgquery_tcap( "F6", "kf16"); 179d522f475Smrgquery_tcap( "F7", "kf17"); 180d522f475Smrgquery_tcap( "F8", "kf18"); 181d522f475Smrgquery_tcap( "F9", "kf19"); 182d522f475Smrgquery_tcap( "FA", "kf20"); 183d522f475Smrgquery_tcap( "FB", "kf21"); 184d522f475Smrgquery_tcap( "FC", "kf22"); 185d522f475Smrgquery_tcap( "FD", "kf23"); 186d522f475Smrgquery_tcap( "FE", "kf24"); 187d522f475Smrgquery_tcap( "FF", "kf25"); 188d522f475Smrgquery_tcap( "FG", "kf26"); 189d522f475Smrgquery_tcap( "FH", "kf27"); 190d522f475Smrgquery_tcap( "FI", "kf28"); 191d522f475Smrgquery_tcap( "FJ", "kf29"); 192d522f475Smrgquery_tcap( "FK", "kf30"); 193d522f475Smrgquery_tcap( "FL", "kf31"); 194d522f475Smrgquery_tcap( "FM", "kf32"); 195d522f475Smrgquery_tcap( "FN", "kf33"); 196d522f475Smrgquery_tcap( "FO", "kf34"); 197d522f475Smrgquery_tcap( "FP", "kf35"); 198d522f475Smrgquery_tcap( "FQ", "kf36"); 199d522f475Smrgquery_tcap( "FR", "kf37"); 200d522f475Smrgquery_tcap( "FS", "kf38"); 201d522f475Smrgquery_tcap( "FT", "kf39"); 202d522f475Smrgquery_tcap( "FU", "kf40"); 203d522f475Smrgquery_tcap( "FV", "kf41"); 204d522f475Smrgquery_tcap( "FW", "kf42"); 205d522f475Smrgquery_tcap( "FX", "kf43"); 206d522f475Smrgquery_tcap( "FY", "kf44"); 207d522f475Smrgquery_tcap( "FZ", "kf45"); 208d522f475Smrgquery_tcap( "Fa", "kf46"); 209d522f475Smrgquery_tcap( "Fb", "kf47"); 210d522f475Smrgquery_tcap( "Fc", "kf48"); 211d522f475Smrgquery_tcap( "Fd", "kf49"); 212d522f475Smrgquery_tcap( "Fe", "kf50"); 213d522f475Smrgquery_tcap( "Ff", "kf51"); 214d522f475Smrgquery_tcap( "Fg", "kf52"); 215d522f475Smrgquery_tcap( "Fh", "kf53"); 216d522f475Smrgquery_tcap( "Fi", "kf54"); 217d522f475Smrgquery_tcap( "Fj", "kf55"); 218d522f475Smrgquery_tcap( "Fk", "kf56"); 219d522f475Smrgquery_tcap( "Fl", "kf57"); 220d522f475Smrgquery_tcap( "Fm", "kf58"); 221d522f475Smrgquery_tcap( "Fn", "kf59"); 222d522f475Smrgquery_tcap( "Fo", "kf60"); 223d522f475Smrgquery_tcap( "Fp", "kf61"); 224d522f475Smrgquery_tcap( "Fq", "kf62"); 225d522f475Smrgquery_tcap( "Fr", "kf63"); 226d522f475Smrg} 227d522f475Smrg 228d522f475Smrgif ( defined($opt_a) || defined($opt_k) ) { 229d522f475Smrgquery_tcap( "K1", "ka1"); 2302eaa94a1Schristosquery_tcap( "K3", "ka3"); 231d522f475Smrgquery_tcap( "K4", "kc1"); 2322eaa94a1Schristosquery_tcap( "K5", "kc3"); 233d522f475Smrg} 234d522f475Smrg 235d522f475Smrgif ( defined($opt_a) || defined($opt_m) ) { 236d522f475Smrgquery_tcap( "kB", "kcbt"); 237d522f475Smrgquery_tcap( "kC", "kclr"); 2382eaa94a1Schristosquery_tcap( "&8", "kund"); 239d522f475Smrg 240d522f475Smrgquery_tcap( "kb", "kbs"); 241d522f475Smrg 242d522f475Smrgquery_tcap( "%1", "khlp"); 243d522f475Smrgquery_tcap( "#1", "kHLP"); 244d522f475Smrg 245d522f475Smrgquery_tcap( "Co", "colors"); 246d522f475Smrg} 247d522f475Smrg 248d522f475Smrgif ( defined ($opt_x) ) { 249d522f475Smrg query_extended($opt_x); 250d522f475Smrg} 251