File: dump-xkb-config

package info (click to toggle)
keyd 2.5.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,524 kB
  • sloc: ansic: 5,206; python: 1,121; makefile: 114; javascript: 105; perl: 95; sh: 80
file content (112 lines) | stat: -rwxr-xr-x 2,216 bytes parent folder | download | duplicates (2)
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);
}