tcapquery.pl revision 20d2c4d2
1d522f475Smrg#!/usr/bin/perl -w 220d2c4d2Smrg# $XTermId: tcapquery.pl,v 1.18 2010/01/04 09:43:46 tom Exp $ 320d2c4d2Smrg# ----------------------------------------------------------------------------- 420d2c4d2Smrg# this file is part of xterm 5d522f475Smrg# 620d2c4d2Smrg# Copyright 2004-2008,2010 by Thomas E. Dickey 720d2c4d2Smrg# 820d2c4d2Smrg# All Rights Reserved 920d2c4d2Smrg# 1020d2c4d2Smrg# Permission is hereby granted, free of charge, to any person obtaining a 1120d2c4d2Smrg# copy of this software and associated documentation files (the 1220d2c4d2Smrg# "Software"), to deal in the Software without restriction, including 1320d2c4d2Smrg# without limitation the rights to use, copy, modify, merge, publish, 1420d2c4d2Smrg# distribute, sublicense, and/or sell copies of the Software, and to 1520d2c4d2Smrg# permit persons to whom the Software is furnished to do so, subject to 1620d2c4d2Smrg# the following conditions: 1720d2c4d2Smrg# 1820d2c4d2Smrg# The above copyright notice and this permission notice shall be included 1920d2c4d2Smrg# in all copies or substantial portions of the Software. 2020d2c4d2Smrg# 2120d2c4d2Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 2220d2c4d2Smrg# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2320d2c4d2Smrg# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 2420d2c4d2Smrg# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY 2520d2c4d2Smrg# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2620d2c4d2Smrg# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2720d2c4d2Smrg# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2820d2c4d2Smrg# 2920d2c4d2Smrg# Except as contained in this notice, the name(s) of the above copyright 3020d2c4d2Smrg# holders shall not be used in advertising or otherwise to promote the 3120d2c4d2Smrg# sale, use or other dealings in this Software without prior written 3220d2c4d2Smrg# authorization. 3320d2c4d2Smrg# ----------------------------------------------------------------------------- 34d522f475Smrg# Test the tcap-query option of xterm. 35d522f475Smrg 36d522f475Smrguse strict; 37d522f475Smrg 38d522f475Smrguse Getopt::Std; 39d522f475Smrguse IO::Handle; 40d522f475Smrg 4120d2c4d2Smrgour ($opt_a, $opt_b, $opt_c, $opt_e, $opt_f, $opt_i, $opt_k, $opt_m, $opt_t, $opt_x, $opt_X); 4220d2c4d2Smrg&getopts('abcefikmt:x:X') || die("Usage: $0 [options]\n 43d522f475SmrgOptions:\n 4420d2c4d2Smrg -a (same as -c -e -f -k -m) 4520d2c4d2Smrg -b use both terminfo and termcap (default is termcap) 4620d2c4d2Smrg -c cursor-keys 4720d2c4d2Smrg -e editing keypad-keys 4820d2c4d2Smrg -f function-keys 4920d2c4d2Smrg -i use terminfo rather than termcap names 5020d2c4d2Smrg -k numeric keypad-keys 5120d2c4d2Smrg -m miscellaneous (none of -c, -e, -f, -k) 5220d2c4d2Smrg -t NAME use given NAME for \$TERM, set that in xterm's tcap keyboard 5320d2c4d2Smrg -x KEY extended cursor/editing key (terminfo only) 5420d2c4d2Smrg -X test all extended cursor- and/or editing-keys (terminfo) 55d522f475Smrg"); 56d522f475Smrg 57d522f475Smrgif ( not ( defined($opt_c) 58d522f475Smrg or defined($opt_e) 59d522f475Smrg or defined($opt_f) 60d522f475Smrg or defined($opt_k) 61d522f475Smrg or defined($opt_m) 62d522f475Smrg or defined($opt_x) ) ) { 63d522f475Smrg $opt_a=1; 64d522f475Smrg} 65d522f475Smrg 6620d2c4d2Smrgsub no_reply($) { 6720d2c4d2Smrg open TTY, "+</dev/tty" or die("Cannot open /dev/tty\n"); 6820d2c4d2Smrg autoflush TTY 1; 6920d2c4d2Smrg my $old=`stty -g`; 7020d2c4d2Smrg system "stty raw -echo min 0 time 5"; 7120d2c4d2Smrg 7220d2c4d2Smrg print TTY @_; 7320d2c4d2Smrg close TTY; 7420d2c4d2Smrg system "stty $old"; 7520d2c4d2Smrg} 7620d2c4d2Smrg 77d522f475Smrgsub get_reply($) { 78d522f475Smrg open TTY, "+</dev/tty" or die("Cannot open /dev/tty\n"); 79d522f475Smrg autoflush TTY 1; 80d522f475Smrg my $old=`stty -g`; 81d522f475Smrg system "stty raw -echo min 0 time 5"; 82d522f475Smrg 83d522f475Smrg print TTY @_; 84d522f475Smrg my $reply=<TTY>; 85d522f475Smrg close TTY; 86d522f475Smrg system "stty $old"; 87d522f475Smrg if ( defined $reply ) { 88d522f475Smrg die("^C received\n") if ( "$reply" eq "\003" ); 89d522f475Smrg } 90d522f475Smrg return $reply; 91d522f475Smrg} 92d522f475Smrg 93d522f475Smrgsub hexified($) { 94d522f475Smrg my $value = $_[0]; 95d522f475Smrg my $result = ""; 96d522f475Smrg my $n; 97d522f475Smrg 98d522f475Smrg for ( $n = 0; $n < length($value); ++$n) { 99d522f475Smrg $result .= sprintf("%02X", ord substr($value,$n,1)); 100d522f475Smrg } 101d522f475Smrg return $result; 102d522f475Smrg} 103d522f475Smrg 10420d2c4d2Smrgsub modify_tcap($) { 10520d2c4d2Smrg my $name = $_[0]; 10620d2c4d2Smrg my $param = hexified($name); 10720d2c4d2Smrg no_reply("\x1bP+p" . $param . "\x1b\\"); 10820d2c4d2Smrg} 10920d2c4d2Smrg 110d522f475Smrgsub query_tcap($$) { 111d522f475Smrg my $tcap = $_[0]; 112d522f475Smrg my $tinfo = $_[1]; 113d522f475Smrg my $param1 = hexified($tcap); 114d522f475Smrg my $param2 = hexified($tinfo); 115d522f475Smrg my $reply; 116d522f475Smrg 117d522f475Smrg # uncomment one of the following lines 118d522f475Smrg if ( defined($opt_b) ) { 119d522f475Smrg $reply=get_reply("\x1bP+q" . $param1 . ";" . $param2 . "\x1b\\"); 120d522f475Smrg } elsif ( defined($opt_i) ) { 121d522f475Smrg $reply=get_reply("\x1bP+q" . $param2 . "\x1b\\"); 122d522f475Smrg } else { 123d522f475Smrg $reply=get_reply("\x1bP+q" . $param1 . "\x1b\\"); 124d522f475Smrg } 125d522f475Smrg 126d522f475Smrg return unless defined $reply; 127d522f475Smrg if ( $reply =~ /\x1bP1\+r[[:xdigit:]]+=[[:xdigit:]]*.*/ ) { 128d522f475Smrg my $value = $reply; 129d522f475Smrg my $n; 130d522f475Smrg 131d522f475Smrg $value =~ s/^\x1bP1\+r//; 132d522f475Smrg $value =~ s/\x1b\\//; 133d522f475Smrg 134d522f475Smrg my $result = ""; 135d522f475Smrg for ( $n = 0; $n < length($value); ) { 136d522f475Smrg my $c = substr($value,$n,1); 137d522f475Smrg # handle semicolon and equals 138d522f475Smrg if ( $c =~ /[[:punct:]]/ ) { 139d522f475Smrg $n += 1; 140d522f475Smrg $result .= $c; 141d522f475Smrg } else { 142d522f475Smrg # handle hex-data 143d522f475Smrg my $k = hex substr($value,$n,2); 144d522f475Smrg if ( $k == 0x1b ) { 145d522f475Smrg $result .= "\\E"; 146d522f475Smrg } elsif ( $k == 0x7f ) { 147d522f475Smrg $result .= "^?"; 148d522f475Smrg } elsif ( $k == 32 ) { 149d522f475Smrg $result .= "\\s"; 150d522f475Smrg } elsif ( $k < 32 ) { 151d522f475Smrg $result .= sprintf("^%c", $k + 64); 152d522f475Smrg } elsif ( $k > 128 ) { 153d522f475Smrg $result .= sprintf("\\%03o", $k); 154d522f475Smrg } else { 155d522f475Smrg $result .= chr($k); 156d522f475Smrg } 157d522f475Smrg $n += 2; 158d522f475Smrg } 159d522f475Smrg } 160d522f475Smrg 161d522f475Smrg printf "%s\n", $result; 162d522f475Smrg } 163d522f475Smrg} 164d522f475Smrg 16520d2c4d2Smrg# extended-keys are a feature of ncurses 5.0 and later 166d522f475Smrgsub query_extended($) { 167d522f475Smrg my $name = $_[0]; 168d522f475Smrg my $n; 169d522f475Smrg 170d522f475Smrg $name = "k" . $name if ( $name !~ /^k/ ); 171d522f475Smrg 172d522f475Smrg for ( $n = 2; $n <= 7; ++$n) { 173d522f475Smrg my $test = $name; 174d522f475Smrg $test = $test . $n if ( $n > 2 ); 175d522f475Smrg query_tcap( $name, $test ); 176d522f475Smrg } 177d522f475Smrg} 178d522f475Smrg 17920d2c4d2Smrgquery_tcap( "TN", "name"); 18020d2c4d2Smrgif ( defined($opt_t) ) { 18120d2c4d2Smrg printf "Setting TERM=%s\n", $opt_t; 18220d2c4d2Smrg modify_tcap($opt_t); 18320d2c4d2Smrg} 18420d2c4d2Smrg 185d522f475Smrg# See xtermcapKeycode() 186d522f475Smrgif ( defined($opt_a) || defined($opt_c) ) { 187d522f475Smrgquery_tcap( "ku", "kcuu1"); 18820d2c4d2Smrgquery_tcap( "kd", "kcud1"); 189d522f475Smrgquery_tcap( "kr", "kcuf1"); 19020d2c4d2Smrgquery_tcap( "kl", "kcub1"); 191d522f475Smrg 19220d2c4d2Smrgquery_tcap( "kF", "kind"); 19320d2c4d2Smrgquery_tcap( "kR", "kri"); 194d522f475Smrgquery_tcap( "%i", "kRIT"); 19520d2c4d2Smrgquery_tcap( "#4", "kLFT"); 196d522f475Smrg} 197d522f475Smrg 198d522f475Smrgif ( defined($opt_a) || defined($opt_e) ) { 199d522f475Smrgquery_tcap( "kD", "kdch1"); 200d522f475Smrgquery_tcap( "kI", "kich1"); 201d522f475Smrg 202d522f475Smrgquery_tcap( "kh", "khome"); 203d522f475Smrgquery_tcap( "\@7", "kend"); 204d522f475Smrgquery_tcap( "#2", "kHOM"); 205d522f475Smrgquery_tcap( "*7", "kEND"); 206d522f475Smrg 207d522f475Smrgquery_tcap( "*6", "kslt"); 208d522f475Smrgquery_tcap( "#6", "kSLT"); 209d522f475Smrgquery_tcap( "\@0", "kfnd"); 210d522f475Smrgquery_tcap( "*0", "kFND"); 211d522f475Smrg 212d522f475Smrgquery_tcap( "kN", "knp"); 213d522f475Smrgquery_tcap( "kP", "kpp"); 21420d2c4d2Smrg 21520d2c4d2Smrgquery_tcap( "%c", "kNXT"); 21620d2c4d2Smrgquery_tcap( "%e", "kPRV"); 217d522f475Smrg} 218d522f475Smrg 219d522f475Smrgif ( defined($opt_a) || defined($opt_f) ) { 220d522f475Smrgquery_tcap( "k1", "kf1"); 221d522f475Smrgquery_tcap( "k2", "kf2"); 222d522f475Smrgquery_tcap( "k3", "kf3"); 223d522f475Smrgquery_tcap( "k4", "kf4"); 224d522f475Smrgquery_tcap( "k5", "kf5"); 225d522f475Smrgquery_tcap( "k6", "kf6"); 226d522f475Smrgquery_tcap( "k7", "kf7"); 227d522f475Smrgquery_tcap( "k8", "kf8"); 228d522f475Smrgquery_tcap( "k9", "kf9"); 229d522f475Smrgquery_tcap( "k;", "kf10"); 230d522f475Smrgquery_tcap( "F1", "kf11"); 231d522f475Smrgquery_tcap( "F2", "kf12"); 232d522f475Smrgquery_tcap( "F3", "kf13"); 233d522f475Smrgquery_tcap( "F4", "kf14"); 234d522f475Smrgquery_tcap( "F5", "kf15"); 235d522f475Smrgquery_tcap( "F6", "kf16"); 236d522f475Smrgquery_tcap( "F7", "kf17"); 237d522f475Smrgquery_tcap( "F8", "kf18"); 238d522f475Smrgquery_tcap( "F9", "kf19"); 239d522f475Smrgquery_tcap( "FA", "kf20"); 240d522f475Smrgquery_tcap( "FB", "kf21"); 241d522f475Smrgquery_tcap( "FC", "kf22"); 242d522f475Smrgquery_tcap( "FD", "kf23"); 243d522f475Smrgquery_tcap( "FE", "kf24"); 244d522f475Smrgquery_tcap( "FF", "kf25"); 245d522f475Smrgquery_tcap( "FG", "kf26"); 246d522f475Smrgquery_tcap( "FH", "kf27"); 247d522f475Smrgquery_tcap( "FI", "kf28"); 248d522f475Smrgquery_tcap( "FJ", "kf29"); 249d522f475Smrgquery_tcap( "FK", "kf30"); 250d522f475Smrgquery_tcap( "FL", "kf31"); 251d522f475Smrgquery_tcap( "FM", "kf32"); 252d522f475Smrgquery_tcap( "FN", "kf33"); 253d522f475Smrgquery_tcap( "FO", "kf34"); 254d522f475Smrgquery_tcap( "FP", "kf35"); 255d522f475Smrgquery_tcap( "FQ", "kf36"); 256d522f475Smrgquery_tcap( "FR", "kf37"); 257d522f475Smrgquery_tcap( "FS", "kf38"); 258d522f475Smrgquery_tcap( "FT", "kf39"); 259d522f475Smrgquery_tcap( "FU", "kf40"); 260d522f475Smrgquery_tcap( "FV", "kf41"); 261d522f475Smrgquery_tcap( "FW", "kf42"); 262d522f475Smrgquery_tcap( "FX", "kf43"); 263d522f475Smrgquery_tcap( "FY", "kf44"); 264d522f475Smrgquery_tcap( "FZ", "kf45"); 265d522f475Smrgquery_tcap( "Fa", "kf46"); 266d522f475Smrgquery_tcap( "Fb", "kf47"); 267d522f475Smrgquery_tcap( "Fc", "kf48"); 268d522f475Smrgquery_tcap( "Fd", "kf49"); 269d522f475Smrgquery_tcap( "Fe", "kf50"); 270d522f475Smrgquery_tcap( "Ff", "kf51"); 271d522f475Smrgquery_tcap( "Fg", "kf52"); 272d522f475Smrgquery_tcap( "Fh", "kf53"); 273d522f475Smrgquery_tcap( "Fi", "kf54"); 274d522f475Smrgquery_tcap( "Fj", "kf55"); 275d522f475Smrgquery_tcap( "Fk", "kf56"); 276d522f475Smrgquery_tcap( "Fl", "kf57"); 277d522f475Smrgquery_tcap( "Fm", "kf58"); 278d522f475Smrgquery_tcap( "Fn", "kf59"); 279d522f475Smrgquery_tcap( "Fo", "kf60"); 280d522f475Smrgquery_tcap( "Fp", "kf61"); 281d522f475Smrgquery_tcap( "Fq", "kf62"); 282d522f475Smrgquery_tcap( "Fr", "kf63"); 283d522f475Smrg} 284d522f475Smrg 285d522f475Smrgif ( defined($opt_a) || defined($opt_k) ) { 286d522f475Smrgquery_tcap( "K1", "ka1"); 2872eaa94a1Schristosquery_tcap( "K3", "ka3"); 288d522f475Smrgquery_tcap( "K4", "kc1"); 2892eaa94a1Schristosquery_tcap( "K5", "kc3"); 290d522f475Smrg} 291d522f475Smrg 292d522f475Smrgif ( defined($opt_a) || defined($opt_m) ) { 293d522f475Smrgquery_tcap( "kB", "kcbt"); 294d522f475Smrgquery_tcap( "kC", "kclr"); 2952eaa94a1Schristosquery_tcap( "&8", "kund"); 296d522f475Smrg 297d522f475Smrgquery_tcap( "kb", "kbs"); 298d522f475Smrg 299d522f475Smrgquery_tcap( "%1", "khlp"); 300d522f475Smrgquery_tcap( "#1", "kHLP"); 301d522f475Smrg 302d522f475Smrgquery_tcap( "Co", "colors"); 303d522f475Smrg} 304d522f475Smrg 305d522f475Smrgif ( defined ($opt_x) ) { 306d522f475Smrg query_extended($opt_x); 307d522f475Smrg} 30820d2c4d2Smrg 30920d2c4d2Smrgif ( defined ($opt_X) ) { 31020d2c4d2Smrg if ( defined($opt_c) ) { 31120d2c4d2Smrg query_extended("DN"); 31220d2c4d2Smrg query_extended("UP"); 31320d2c4d2Smrg query_extended("LFT"); 31420d2c4d2Smrg query_extended("RIT"); 31520d2c4d2Smrg } 31620d2c4d2Smrg if ( defined($opt_e) ) { 31720d2c4d2Smrg query_extended("DC"); 31820d2c4d2Smrg query_extended("END"); 31920d2c4d2Smrg query_extended("HOM"); 32020d2c4d2Smrg query_extended("IC"); 32120d2c4d2Smrg query_extended("NXT"); 32220d2c4d2Smrg query_extended("PRV"); 32320d2c4d2Smrg } 32420d2c4d2Smrg} 325