query-fonts.pl revision 20d2c4d2
120d2c4d2Smrg#!/usr/bin/perl -w
220d2c4d2Smrg# $XTermId: query-fonts.pl,v 1.5 2010/05/24 09:01:30 tom Exp $
320d2c4d2Smrg# -----------------------------------------------------------------------------
420d2c4d2Smrg# this file is part of xterm
520d2c4d2Smrg#
620d2c4d2Smrg# Copyright 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# -----------------------------------------------------------------------------
3420d2c4d2Smrg# Test the font-query features of xterm.
3520d2c4d2Smrg
3620d2c4d2Smrg# TODO:
3720d2c4d2Smrg# test relative vs absolute font numbering
3820d2c4d2Smrg# test all font-slots
3920d2c4d2Smrg# test selection
4020d2c4d2Smrg# test bold / wide / widebold
4120d2c4d2Smrg# test actual fontname vs nominal
4220d2c4d2Smrg# extend "CSI > Ps; Ps T" to query fontname in hex
4320d2c4d2Smrg
4420d2c4d2Smrguse strict;
4520d2c4d2Smrg
4620d2c4d2Smrguse Getopt::Std;
4720d2c4d2Smrguse IO::Handle;
4820d2c4d2Smrg
4920d2c4d2Smrgour ( $opt_a, $opt_r, $opt_s );
5020d2c4d2Smrg&getopts('ars') || die(
5120d2c4d2Smrg    "Usage: $0 [options]\n
5220d2c4d2SmrgOptions:\n
5320d2c4d2Smrg  -a      test using absolute numbers
5420d2c4d2Smrg  -r      test using relative numbers
5520d2c4d2Smrg  -s      use ^G rather than ST
5620d2c4d2Smrg"
5720d2c4d2Smrg);
5820d2c4d2Smrg
5920d2c4d2Smrgour $ST = $opt_s ? "\007" : "\x1b\\";
6020d2c4d2Smrg
6120d2c4d2Smrgsub no_reply($) {
6220d2c4d2Smrg    open TTY, "+</dev/tty" or die("Cannot open /dev/tty\n");
6320d2c4d2Smrg    autoflush TTY 1;
6420d2c4d2Smrg    my $old = `stty -g`;
6520d2c4d2Smrg    system "stty raw -echo min 0 time 5";
6620d2c4d2Smrg
6720d2c4d2Smrg    print TTY @_;
6820d2c4d2Smrg    close TTY;
6920d2c4d2Smrg    system "stty $old";
7020d2c4d2Smrg}
7120d2c4d2Smrg
7220d2c4d2Smrgsub get_reply($) {
7320d2c4d2Smrg    open TTY, "+</dev/tty" or die("Cannot open /dev/tty\n");
7420d2c4d2Smrg    autoflush TTY 1;
7520d2c4d2Smrg    my $old = `stty -g`;
7620d2c4d2Smrg    system "stty raw -echo min 0 time 5";
7720d2c4d2Smrg
7820d2c4d2Smrg    print TTY @_;
7920d2c4d2Smrg    my $reply = <TTY>;
8020d2c4d2Smrg    close TTY;
8120d2c4d2Smrg    system "stty $old";
8220d2c4d2Smrg    if ( defined $reply ) {
8320d2c4d2Smrg        die("^C received\n") if ( "$reply" eq "\003" );
8420d2c4d2Smrg    }
8520d2c4d2Smrg    return $reply;
8620d2c4d2Smrg}
8720d2c4d2Smrg
8820d2c4d2Smrgsub query_font($) {
8920d2c4d2Smrg    my $param = $_[0];
9020d2c4d2Smrg    my $reply;
9120d2c4d2Smrg    my $n;
9220d2c4d2Smrg    my $st    = $opt_s ? qr/\007/ : qr/\x1b\\/;
9320d2c4d2Smrg    my $osc   = qr/\x1b]50/;
9420d2c4d2Smrg    my $match = qr/${osc}.*${st}/;
9520d2c4d2Smrg
9620d2c4d2Smrg    $reply = get_reply( "\x1b]50;?" . $param . $ST );
9720d2c4d2Smrg
9820d2c4d2Smrg    printf "query{%s}%*s", $param, 3 - length($param), " ";
9920d2c4d2Smrg
10020d2c4d2Smrg    if ( defined $reply ) {
10120d2c4d2Smrg        printf "%2d ", length($reply);
10220d2c4d2Smrg        if ( $reply =~ /${match}/ ) {
10320d2c4d2Smrg
10420d2c4d2Smrg            $reply =~ s/^${osc}//;
10520d2c4d2Smrg            $reply =~ s/^;//;
10620d2c4d2Smrg            $reply =~ s/${st}$//;
10720d2c4d2Smrg        }
10820d2c4d2Smrg        else {
10920d2c4d2Smrg            printf "? ";
11020d2c4d2Smrg        }
11120d2c4d2Smrg
11220d2c4d2Smrg        my $result = "";
11320d2c4d2Smrg        for ( $n = 0 ; $n < length($reply) ; ) {
11420d2c4d2Smrg            my $c = substr( $reply, $n, 1 );
11520d2c4d2Smrg            if ( $c =~ /[[:print:]]/ ) {
11620d2c4d2Smrg                $result .= $c;
11720d2c4d2Smrg            }
11820d2c4d2Smrg            else {
11920d2c4d2Smrg                my $k = ord substr( $reply, $n, 1 );
12020d2c4d2Smrg                if ( ord $k == 0x1b ) {
12120d2c4d2Smrg                    $result .= "\\E";
12220d2c4d2Smrg                }
12320d2c4d2Smrg                elsif ( $k == 0x7f ) {
12420d2c4d2Smrg                    $result .= "^?";
12520d2c4d2Smrg                }
12620d2c4d2Smrg                elsif ( $k == 32 ) {
12720d2c4d2Smrg                    $result .= "\\s";
12820d2c4d2Smrg                }
12920d2c4d2Smrg                elsif ( $k < 32 ) {
13020d2c4d2Smrg                    $result .= sprintf( "^%c", $k + 64 );
13120d2c4d2Smrg                }
13220d2c4d2Smrg                elsif ( $k > 128 ) {
13320d2c4d2Smrg                    $result .= sprintf( "\\%03o", $k );
13420d2c4d2Smrg                }
13520d2c4d2Smrg                else {
13620d2c4d2Smrg                    $result .= chr($k);
13720d2c4d2Smrg                }
13820d2c4d2Smrg            }
13920d2c4d2Smrg            $n += 1;
14020d2c4d2Smrg        }
14120d2c4d2Smrg
14220d2c4d2Smrg        printf "{%s}", $result;
14320d2c4d2Smrg    }
14420d2c4d2Smrg    printf "\n";
14520d2c4d2Smrg}
14620d2c4d2Smrg
14720d2c4d2Smrgif ($opt_r) {
14820d2c4d2Smrg    my $n;
14920d2c4d2Smrg    query_font("-");
15020d2c4d2Smrg    foreach $n ( 0 .. 5 ) {
15120d2c4d2Smrg        query_font( sprintf "-%d", $n );
15220d2c4d2Smrg    }
15320d2c4d2Smrg    query_font("+");
15420d2c4d2Smrg    foreach $n ( 0 .. 5 ) {
15520d2c4d2Smrg        query_font( sprintf "+%d", $n );
15620d2c4d2Smrg    }
15720d2c4d2Smrg}
15820d2c4d2Smrgif ($opt_a) {
15920d2c4d2Smrg    my $n;
16020d2c4d2Smrg    foreach $n ( 0 .. 5 ) {
16120d2c4d2Smrg        query_font( sprintf "%d", $n );
16220d2c4d2Smrg    }
16320d2c4d2Smrg}
16420d2c4d2Smrgif ( not $opt_a and not $opt_r ) {
16520d2c4d2Smrg    query_font("");
16620d2c4d2Smrg}
167