rickyzhang82 / keycode.linux
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
# /usr/share/BasiliskII/keycodes |
# |
# Basilisk II (C) 1997-2005 Christian Bauer |
# |
# This file is used to translate the (server-specific) scancodes to |
# Mac keycodes depending on the window server being used. |
# |
# The format of this file is as follows: |
# |
# sdl |
# |
# |
# |
# . |
# sdl |
# |
# |
# . |
# |
# The «driver string» must match the first part of the SDL driver vendor |
# description as reported by SDL_VideoDriverName(). If a match is found, |
# the keycode translation table is constructed from the following |
# lines. Each line contains an SDL scancode followed by its associated |
# Mac keycode. Both keycodes have to be given in decimal. Lines |
# beginning with «#» or «;» are treated as comments and ignored. |
# |
# |
# X11 server |
# |
sdl x11 |
sdl dga |
9 53 # Esc |
67 122 # F1 |
68 120 # F2 |
69 99 # F3 |
70 118 # F4 |
71 96 # F5 |
72 97 # F6 |
73 98 # F7 |
74 100 # F8 |
75 101 # F9 |
76 109 # F10 |
95 103 # F11 |
96 127 # F12 |
111 105 # PrintScrn |
78 107 # Scroll Lock |
110 113 # Pause |
49 50 # ` |
10 18 # 1 |
11 19 # 2 |
12 20 # 3 |
13 21 # 4 |
14 23 # 5 |
15 22 # 6 |
16 26 # 7 |
17 28 # 8 |
18 25 # 9 |
19 29 # 0 |
20 27 # — |
21 24 # = |
22 51 # Backspace |
106 114 # Insert |
97 115 # Home |
99 116 # Page Up |
77 71 # Num Lock |
112 75 # KP / |
63 67 # KP * |
82 78 # KP — |
23 48 # Tab |
24 12 # Q |
25 13 # W |
26 14 # E |
27 15 # R |
28 17 # T |
29 16 # Y |
30 32 # U |
31 34 # I |
32 31 # O |
33 35 # P |
34 33 # [ |
35 30 # ] |
36 36 # Return |
107 117 # Delete |
103 119 # End |
105 121 # Page Down |
79 89 # KP 7 |
80 91 # KP 8 |
81 92 # KP 9 |
86 69 # KP + |
66 57 # Caps Lock |
38 0 # A |
39 1 # S |
40 2 # D |
41 3 # F |
42 5 # G |
43 4 # H |
44 38 # J |
45 40 # K |
46 37 # L |
47 41 # ; |
48 39 # ‘ |
83 86 # KP 4 |
84 87 # KP 5 |
85 88 # KP 6 |
50 56 # Shift Left |
94 50 # International |
52 6 # Z |
53 7 # X |
54 8 # C |
55 9 # V |
56 11 # B |
57 45 # N |
58 46 # M |
59 43 # , |
60 47 # . |
61 44 # / |
62 56 # Shift Right |
51 42 # \ |
98 62 # Cursor Up |
87 83 # KP 1 |
88 84 # KP 2 |
89 85 # KP 3 |
108 76 # KP Enter |
37 54 # Ctrl Left |
115 58 # Logo Left (-> Option) |
64 55 # Alt Left (-> Command) |
65 49 # Space |
113 55 # Alt Right (-> Command) |
116 58 # Logo Right (-> Option) |
117 50 # Menu (-> International) |
109 54 # Ctrl Right |
100 59 # Cursor Left |
104 61 # Cursor Down |
102 60 # Cursor Right |
90 82 # KP 0 |
91 65 # KP . |
# |
# Linux Framebuffer Console |
# |
sdl fbcon |
1 53 # Esc |
59 122 # F1 |
60 120 # F2 |
61 99 # F3 |
62 118 # F4 |
63 96 # F5 |
64 97 # F6 |
65 98 # F7 |
66 100 # F8 |
67 101 # F9 |
68 109 # F10 |
87 103 # F11 |
88 111 # F12 |
99 105 # PrintScrn |
70 107 # Scroll Lock |
119 113 # Pause |
41 50 # ` |
2 18 # 1 |
3 19 # 2 |
4 20 # 3 |
5 21 # 4 |
6 23 # 5 |
7 22 # 6 |
8 26 # 7 |
9 28 # 8 |
10 25 # 9 |
11 29 # 0 |
12 27 # — |
13 24 # = |
14 51 # Backspace |
110 114 # Insert |
102 115 # Home |
104 116 # Page Up |
69 71 # Num Lock |
98 75 # KP / |
55 67 # KP * |
74 78 # KP — |
15 48 # Tab |
16 12 # Q |
17 13 # W |
18 14 # E |
19 15 # R |
20 17 # T |
21 16 # Y |
22 32 # U |
23 34 # I |
24 31 # O |
25 35 # P |
26 33 # [ |
27 30 # ] |
28 36 # Return |
111 117 # Delete |
107 119 # End |
109 121 # Page Down |
71 89 # KP 7 |
72 91 # KP 8 |
73 92 # KP 9 |
78 69 # KP + |
58 57 # Caps Lock |
30 0 # A |
31 1 # S |
32 2 # D |
33 3 # F |
34 5 # G |
35 4 # H |
36 38 # J |
37 40 # K |
38 37 # L |
39 41 # ; |
40 39 # ‘ |
75 86 # KP 4 |
76 87 # KP 5 |
77 88 # KP 6 |
42 56 # Shift Left |
86 50 # International |
44 6 # Z |
45 7 # X |
46 8 # C |
47 9 # V |
48 11 # B |
49 45 # N |
50 46 # M |
51 43 # , |
52 47 # . |
53 44 # / |
54 56 # Shift Right |
43 42 # \ |
103 62 # Cursor Up |
79 83 # KP 1 |
80 84 # KP 2 |
81 85 # KP 3 |
96 76 # KP Enter |
29 54 # Ctrl Left |
125 58 # Logo Left (-> Option) |
56 55 # Alt Left (-> Command) |
57 49 # Space |
100 55 # Alt Right (-> Command) |
126 58 # Logo Right (-> Option) |
97 54 # Ctrl Right |
105 59 # Cursor Left |
108 61 # Cursor Down |
106 60 # Cursor Right |
82 82 # KP 0 |
83 65 # KP . |
# |
# Quartz (1:1 translation actually) |
# |
sdl Quartz |
53 53 # Esc |
122 122 # F1 |
120 120 # F2 |
99 99 # F3 |
118 118 # F4 |
96 96 # F5 |
97 97 # F6 |
98 98 # F7 |
100 100 # F8 |
101 101 # F9 |
109 109 # F10 |
103 103 # F11 |
111 111 # F12 |
105 105 # F13/PrintScrn |
107 107 # F14/Scroll Lock |
113 113 # F15/Pause |
10 10 # ` |
18 18 # 1 |
19 19 # 2 |
20 20 # 3 |
21 21 # 4 |
23 23 # 5 |
22 22 # 6 |
26 26 # 7 |
28 28 # 8 |
25 25 # 9 |
29 29 # 0 |
27 27 # — |
24 24 # = |
51 51 # Backspace |
114 114 # Help/Insert |
115 115 # Home |
116 116 # Page Up |
71 71 # Num Lock |
81 81 # KP = |
75 75 # KP / |
67 67 # KP * |
48 48 # Tab |
12 12 # Q |
13 13 # W |
14 14 # E |
15 15 # R |
17 17 # T |
16 16 # Y |
32 32 # U |
34 34 # I |
31 31 # O |
35 35 # P |
33 33 # [ |
30 30 # ] |
36 36 # Return |
117 117 # Delete |
119 119 # End |
121 121 # Page Down |
89 89 # KP 7 |
91 91 # KP 8 |
92 92 # KP 9 |
78 78 # KP — |
57 57 # Caps Lock |
0 0 # A |
1 1 # S |
2 2 # D |
3 3 # F |
5 5 # G |
4 4 # H |
38 38 # J |
40 40 # K |
37 37 # L |
41 41 # ; |
39 39 # ‘ |
42 42 # \ |
86 86 # KP 4 |
87 87 # KP 5 |
88 88 # KP 6 |
69 69 # KP + |
56 56 # Shift |
50 50 # International |
6 6 # Z |
7 7 # X |
8 8 # C |
9 9 # V |
11 11 # B |
45 45 # N |
46 46 # M |
43 43 # , |
47 47 # . |
44 44 # / |
126 62 # Cursor Up |
123 59 # Cursor Left |
125 61 # Cursor Down |
124 60 # Cursor Right |
83 83 # KP 1 |
84 84 # KP 2 |
85 85 # KP 3 |
76 76 # KP Enter |
54 54 # Ctrl |
58 58 # Option |
55 55 # Command |
54 54 # Ctrl Left |
49 49 # Space |
82 82 # KP 0 |
65 65 # KP . |
# |
# Windows |
# |
sdl windib |
sdl directx |
1 53 # Esc |
59 122 # F1 |
60 120 # F2 |
61 99 # F3 |
62 118 # F4 |
63 96 # F5 |
64 97 # F6 |
65 98 # F7 |
66 100 # F8 |
67 101 # F9 |
68 109 # F10 |
87 103 # F11 |
88 111 # F12 |
183 105 # PrintScrn |
70 107 # Scroll Lock |
197 113 # Pause |
41 50 # ` |
2 18 # 1 |
3 19 # 2 |
4 20 # 3 |
5 21 # 4 |
6 23 # 5 |
7 22 # 6 |
8 26 # 7 |
9 28 # 8 |
10 25 # 9 |
11 29 # 0 |
12 27 # — |
13 24 # = |
14 51 # Backspace |
210 114 # Insert |
199 115 # Home |
201 116 # Page Up |
69 71 # Num Lock |
181 75 # KP / |
55 67 # KP * |
74 78 # KP — |
15 48 # Tab |
16 12 # Q |
17 13 # W |
18 14 # E |
19 15 # R |
20 17 # T |
21 16 # Y |
22 32 # U |
23 34 # I |
24 31 # O |
25 35 # P |
26 33 # [ |
27 30 # ] |
28 36 # Return |
211 117 # Delete |
207 119 # End |
209 121 # Page Down |
71 89 # KP 7 |
72 91 # KP 8 |
73 92 # KP 9 |
78 69 # KP + |
58 57 # Caps Lock |
30 0 # A |
31 1 # S |
32 2 # D |
33 3 # F |
34 5 # G |
35 4 # H |
36 38 # J |
37 40 # K |
38 37 # L |
39 41 # ; |
40 39 # ‘ |
75 86 # KP 4 |
76 87 # KP 5 |
77 88 # KP 6 |
42 56 # Shift Left |
86 50 # International |
44 6 # Z |
45 7 # X |
46 8 # C |
47 9 # V |
48 11 # B |
49 45 # N |
50 46 # M |
51 43 # , |
52 47 # . |
53 44 # / |
54 56 # Shift Right |
43 42 # \ |
200 62 # Cursor Up |
79 83 # KP 1 |
80 84 # KP 2 |
81 85 # KP 3 |
156 76 # KP Enter |
29 54 # Ctrl Left |
219 58 # Logo Left (-> Option) |
56 55 # Alt Left (-> Command) |
57 49 # Space |
184 55 # Alt Right (-> Command) |
220 58 # Logo Right (-> Option) |
221 50 # Menu (-> International) |
157 54 # Ctrl Right |
203 59 # Cursor Left |
208 61 # Cursor Down |
205 60 # Cursor Right |
82 82 # KP 0 |
83 65 # KP . |
Keyboard input
Prerequisite for modifying the key mapping is knowing how a key press results in a symbol:
- The keyboard sends a scancode to the computer.
- The Linux kernel maps the scancode to a keycode, see Map scancodes to keycodes.
- The keyboard layout maps the keycode to a symbol or keysym, depending on what modifier keys are pressed.
- For the Linux console, see Linux console/Keyboard configuration.
- For Xorg and Wayland, see Xorg/Keyboard configuration.
Most of your keys should already have a keycode, or at least a scancode. Keys without a scancode are not recognized by the kernel; these can include additional keys from «gaming» keyboards, etc.
In Xorg, some keysyms (e.g. XF86AudioPlay , XF86AudioRaiseVolume etc.) can be mapped to actions (i.e. launching an external application). See Keyboard shortcuts#Xorg for details.
In Linux console, some keysyms (e.g. F1 to F246 ) can be mapped to certain actions (e.g. switch to other console or print some sequence of characters). See Console keyboard configuration#Creating a custom keymap for details.
Identifying scancodes
Using showkey
The traditional way to get a scancode is to use the showkey(1) utility. showkey waits for a key to be pressed, or exits if no keys are pressed within 10 seconds. For showkey to work you need to be in a virtual console, not in a graphical environment or logged in via a network connection. Run the following command:
and try to push keyboard keys; you should see scancodes being printed to the output.
Using evtest
For USB keyboards, it is apparently necessary to use evtest(1) from the evtest package instead of showkey [1]:
. Event: time 1434666536.001123, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70053 Event: time 1434666536.001123, type 1 (EV_KEY), code 69 (KEY_NUMLOCK), value 0 Event: time 1434666536.001123, -------------- EV_SYN ------------
Tip: If you do not know which event number has device of your interest, you can run evtest without parameters and it will show you list of devices with their event numbers, then you can enter needed number.
Use the «value» field of MSC_SCAN . This example shows that NumLock has scancode 70053 and keycode 69.
Using dmesg
You can get the scancode of a key by pressing the desired key and looking at the output of dmesg. For example, if you get:
Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0
then the scancode you need is 0xa0 .
Identifying keycodes
The Linux keycodes are defined in /usr/include/linux/input-event-codes.h (see the KEY_ variables).
Identifying keycodes in console
The keycodes for virtual console are reported by the showkey(1) utility. showkey waits for a key to be pressed and if none are, in a span of 10 seconds, it quits. To execute showkey, you need to be in a virtual console, not in a graphical environment. Run the following command:
and try to push keyboard keys; you should see keycodes being printed to the output.
Identifying keycodes in Xorg
This article or section needs expansion.
Reason: xev also reports keysyms. Mention that you need to focus the «Event Tester» window. (Discuss in Talk:Keyboard input)
The keycodes used by Xorg are reported by a utility called xev(1) , which is provided by the xorg-xev package. Of course to execute xev, you need to be in a graphical environment, not in the console.
With the following command you can start xev and show only the relevant parts:
$ xev | awk -F'[ )]+' '/^KeyPress/ < a[NR+2] >NR in a < printf "%-3s %s\n", $5, $8 >'
Here is an example output:
38 a 55 v 54 c 50 Shift_L 133 Super_L 135 Menu
Xbindkeys is another wrapper to xev that reports keycodes.
If you press a key and nothing appears in the terminal, it means that either the key does not have a scancode, the scancode is not mapped to a keycode, or some other process is capturing the keypress. If you suspect that a process listening to X server is capturing the keypress, you can try running xev from a clean X session:
Configuration of VIA compatible keyboards
VIA is a program to remap keys directly into compatible keyboards. In case you have one of those, in order for the keyboard to be picked up by the browser and configure it online, you need to add a custom udev rule changing the permissions of devices accessed through the hidraw driver.
Write this text to /etc/udev/rules.d/99-viia.rules in a text editor:
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0666", TAG+="uaccess", TAG+="udev-acl"
In order for this to take effect you need to reload udev with:
See also
- kbd-project — official website of the showkeys utility
- wev — wayland event viewer similar to xorg’s xev
- interception-tools — a set of utilities to control and customize the behavior of keyboard input mappings
- kmonad — an advanced key rebinding and remapping daemon
- Hawck — another key rebinding daemon
- keyd — simplistic key rebinding daemon
- Vial — VIA standalone program