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