1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
#!/usr/bin/perl
# Dump the current xkb letter layout as a keyd config.
use warnings;
use File::Basename;
use utf8;
use open ":std", ":encoding(UTF-8)";
# Build a map of X keysyms to unicode chars
open FH, "/usr/include/xkbcommon/xkbcommon-keysyms.h";
while (<FH>) {
$symmap{$1} = chr(hex($2)) if (/XKB_KEY_([^ \t]*)\s.*U\+([0-9a-fA-F]*)/);
}
# Map X keycodes to their corresponding keyd names
%codemap = (
24 => "q",
25 => "w",
26 => "e",
27 => "r",
28 => "t",
29 => "y",
30 => "u",
31 => "i",
32 => "o",
33 => "p",
34 => "[",
35 => "]",
38 => "a",
39 => "s",
40 => "d",
41 => "f",
42 => "g",
43 => "h",
44 => "j",
45 => "k",
46 => "l",
47 => ";",
48 => "'",
52 => "z",
53 => "x",
54 => "c",
55 => "v",
56 => "b",
57 => "n",
58 => "m",
59 => ",",
60 => ".",
61 => "/",
10 => "1",
11 => "2",
12 => "3",
13 => "4",
14 => "5",
15 => "6",
16 => "7",
17 => "8",
18 => "9",
19 => "0",
51 => "\\",
20 => "-",
21 => "=",
);
sub sym_to_char {
$sym = $_[0];
return "" if (!$sym);
if ($sym =~ /U([0-9A-Fa-f]+)/) {
return chr(hex($1));
} elsif ($symmap{$sym}) {
$symmap{$sym};
} else {
print STDERR "Could not resolve sym: $sym\n";
return "";
}
}
for (`xmodmap -pke`) {
if (/keycode\s*([0-9]+)\s*=\s*(.*)/ && $codemap{$1}) {
$key = $codemap{$1};
@syms=split " ", $2;
$keymap{$key} = $sym if ($sym = sym_to_char $syms[0]);
$shifted_keymap{$key} = $sym if ($sym = sym_to_char $syms[1]);
$altgr_keymap{$key} = $sym if ($sym = sym_to_char $syms[4]);
$shifted_altgr_keymap{$key} = $sym if ($sym = sym_to_char $syms[5]);
}
}
`setxkbmap -query` =~ /layout:\s*(\S*)/;
$shift_layer = "$1_shift";
print "[$1:layout]\n\n";
print "$_ = $keymap{$_}\n" foreach (sort keys %keymap);
print "shift = layer(${1}_shift)\n";
print "altgr = layer(${1}_altgr)\n" if (%altgr_keymap);
print "\n";
print "[${1}_shift:S]\n";
print "$_ = $shifted_keymap{$_}\n" foreach (sort keys %shifted_keymap);
if (%altgr_keymap) {
print "\n";
print "[${1}_altgr:G]\n";
print "$_ = $altgr_keymap{$_}\n" foreach (sort keys %altgr_keymap);
print "\n";
print "[${1}_altgr+${1}_shift]\n";
print "$_ = $shifted_altgr_keymap{$_}\n" foreach (sort keys %shifted_altgr_keymap);
}
|