use strict;
my(@old_keys);
my($min_fkeys,$max_fkeys,$max_modifier,$modify_opt,$terminfo);
$min_fkeys=12; $max_fkeys=64; $max_modifier=8; $modify_opt=2; $terminfo="xterm-new";
my($cur_modifier, $cur_fkey);
sub modify_it {
my $code = $_[0];
my $text = $_[1];
if ($code != 1) {
my $piece = substr $text, 0, length ($text) - 1;
my $final = substr $text, length ($text) - 1;
my $check = substr $piece, length ($piece) - 1;
if ($check =~ /[0-9]/) {
$code = ";" . $code;
}
$text = $piece . $code . $final;
}
return $text;
}
sub next_modifier {
my $code = $_[0];
my $mask = $code - 1;
if ($mask == 0) {
$mask = 1;
} elsif ($mask == 1) {
$mask = 4;
} elsif ($mask == 2) {
$mask = 3; } elsif ($mask == 4) {
$mask = 5;
} elsif ($mask == 5) {
$mask = 2;
}
return $mask + 1;
}
sub readterm() {
my($key,$n,$str);
my(@list) = `infocmp -1 $terminfo`;
for $n (0..$ chop $list[$n];
$list[$n] =~ s/^[[:space:]]//;
if ( $list[$n] =~ /^kf[[:digit:]]+=/ ) {
$key = $list[$n];
$key =~ s/^kf//;
$key =~ s/=.*//;
$str = $list[$n];
$str =~ s/^kf[[:digit:]]+=//;
$str =~ s/,[[:space:]]*$//;
$old_keys[$key] = $str;
}
}
}
readterm();
printf "xterm+pcfkeys|fragment for PC-style keys, \n";
for ($cur_fkey = 1, $cur_modifier = 1; $cur_fkey < $max_fkeys; ++$cur_fkey) {
my $index = (($cur_fkey - 1) % $min_fkeys);
if ($index == 0 && $cur_fkey != 1) {
$cur_modifier = next_modifier($cur_modifier);
}
my $input = $old_keys[$index + 1];
my $result = modify_it($cur_modifier,$input);
printf "\tkf%d=%s, \n", $cur_fkey, $result;
if (defined $old_keys[$cur_fkey]) {
if ($old_keys[$cur_fkey] ne $result) {
printf "# diff %s\n", $old_keys[$cur_fkey];
}
}
}