[PATCH 3/3] keymaps: convert include files to use CSI keysyms
Nicolas Pitre <[email protected]> Thu, 11 Jun 2026 21:48:57 -0400
| Newsgroups | dev.linux.lists.kbd |
|---|---|
| Message-ID | <[email protected]> |
Convert the shared keymap include files to use the new Csi_* keysyms for function keys (F1-F12) and navigation keys (Home, End, Insert, Delete, PageUp, PageDown). This fixes the long-standing discrepancy where F1-F5 used non-standard sequences (\e[[A through \e[[E) while F6 and above used standard CSI sequences. The Csi_* keysyms automatically encode modifier state into the output sequence, so explicit shift/control bindings for F13-F36 are no longer needed and have been removed. The alt/control-alt bindings for console switching (Console_1 through Console_24) and other special actions (Scroll_Backward, Scroll_Forward, Boot) are preserved. Updated files: - linux-keys-bare.inc - linux-keys-extd.inc - linux-with-modeshift-altgr.inc Legacy versions of these files are preserved as *-legacy.inc for keymaps that need the old F1-F246 keysym behavior. Note: Standalone keymaps that don't use these include files (such as defkeymap.map and various language-specific keymaps) are not updated and will continue to use the legacy keysyms. Note: The Csi_* keysyms require Linux kernel 7.1 or later. Keymaps built from these include files will leave the function and navigation keys inoperative on older kernels (and loadkeys additionally reports errors for them on non-Unicode consoles). Systems that must run pre-7.1 kernels should use the *-legacy.inc include files instead. Signed-off-by: Nicolas Pitre <[email protected]> --- .../i386/include/linux-keys-bare-legacy.inc | 170 ++++++++++++++++++ data/keymaps/i386/include/linux-keys-bare.inc | 76 +++----- .../i386/include/linux-keys-extd-legacy.inc | 37 ++++ data/keymaps/i386/include/linux-keys-extd.inc | 23 +-- .../linux-with-modeshift-altgr-legacy.inc | 101 +++++++++++ .../include/linux-with-modeshift-altgr.inc | 52 ++---- 6 files changed, 356 insertions(+), 103 deletions(-) create mode 100644 data/keymaps/i386/include/linux-keys-bare-legacy.inc create mode 100644 data/keymaps/i386/include/linux-keys-extd-legacy.inc create mode 100644 data/keymaps/i386/include/linux-with-modeshift-altgr-legacy.inc diff --git a/data/keymaps/i386/include/linux-keys-bare-legacy.inc b/data/keymaps/i386/include/linux-keys-bare-legacy.inc new file mode 100644 index 0000000..30379aa --- /dev/null +++ b/data/keymaps/i386/include/linux-keys-bare-legacy.inc @@ -0,0 +1,170 @@ +# Linux-specific (and language-independent) keys +# +# This file describes function keys, console switching keys, +# keypad, cursor keys, and SysRq, ScrollLock, Pause +# +# It does not use the AltGr modifier, so that the user can opt +# to have both Alt keys produce the same effect. +# As a consequence, the Hex_* keys are missing, as are +# control altgr keycode 83 = Boot +# control altgr keycode 111 = Boot +# +# One culture-specific item that will be overridden in many keymaps +# is the KP_Period: many countries have a KP_Comma instead. +# +# One user-preference item will be the function of the Delete key. +# +# Old keyboards have 10 function keys, and keymaps have +# sometimes used shift+F1 = F11, and sometimes shift+F1 = F13. +# Here we assume an enhanced keyboard (with 12 function keys). +# +plain keycode 59 = F1 +plain keycode 60 = F2 +plain keycode 61 = F3 +plain keycode 62 = F4 +plain keycode 63 = F5 +plain keycode 64 = F6 +plain keycode 65 = F7 +plain keycode 66 = F8 +plain keycode 67 = F9 +plain keycode 68 = F10 +plain keycode 87 = F11 +plain keycode 88 = F12 +shift keycode 59 = F13 +shift keycode 60 = F14 +shift keycode 61 = F15 +shift keycode 62 = F16 +shift keycode 63 = F17 +shift keycode 64 = F18 +shift keycode 65 = F19 +shift keycode 66 = F20 +shift keycode 67 = F21 +shift keycode 68 = F22 +shift keycode 87 = F23 +shift keycode 88 = F24 +control keycode 59 = F25 +control keycode 60 = F26 +control keycode 61 = F27 +control keycode 62 = F28 +control keycode 63 = F29 +control keycode 64 = F30 +control keycode 65 = F31 +control keycode 66 = F32 +control keycode 67 = F33 +control keycode 68 = F34 +control keycode 87 = F35 +control keycode 88 = F36 +# +# The canonical assignment for F37-F48 uses +# control shift keycode 59 = F37 +# etc. If you want that, load linux-keys-extd.inc +# +# Both Alt+Fn and Control+Alt+Fn switch to Console n +# (in order to please Linux / dosemu / X). +# Here Consoles 1..12. For 13..24 load linux-keys-extd.inc +# +alt keycode 59 = Console_1 +alt keycode 60 = Console_2 +alt keycode 61 = Console_3 +alt keycode 62 = Console_4 +alt keycode 63 = Console_5 +alt keycode 64 = Console_6 +alt keycode 65 = Console_7 +alt keycode 66 = Console_8 +alt keycode 67 = Console_9 +alt keycode 68 = Console_10 +alt keycode 87 = Console_11 +alt keycode 88 = Console_12 +control alt keycode 59 = Console_1 +control alt keycode 60 = Console_2 +control alt keycode 61 = Console_3 +control alt keycode 62 = Console_4 +control alt keycode 63 = Console_5 +control alt keycode 64 = Console_6 +control alt keycode 65 = Console_7 +control alt keycode 66 = Console_8 +control alt keycode 67 = Console_9 +control alt keycode 68 = Console_10 +control alt keycode 87 = Console_11 +control alt keycode 88 = Console_12 + +# +# Tab and Backtab +# +keycode 15 = Tab +shift keycode 15 = Backtab +alt keycode 15 = Meta_Tab + +# +# Keypad keys +# +keycode 69 = Num_Lock +keycode 98 = KP_Divide +keycode 55 = KP_Multiply +keycode 74 = KP_Subtract +keycode 78 = KP_Add +keycode 96 = KP_Enter +# +keycode 71 = KP_7 +keycode 72 = KP_8 +keycode 73 = KP_9 +keycode 75 = KP_4 +keycode 76 = KP_5 +keycode 77 = KP_6 +keycode 79 = KP_1 +keycode 80 = KP_2 +keycode 81 = KP_3 +keycode 82 = KP_0 +# +keycode 83 = KP_Period # or KP_Comma +control alt keycode 83 = Boot +# +alt keycode 71 = Ascii_7 +alt keycode 72 = Ascii_8 +alt keycode 73 = Ascii_9 +alt keycode 75 = Ascii_4 +alt keycode 76 = Ascii_5 +alt keycode 77 = Ascii_6 +alt keycode 79 = Ascii_1 +alt keycode 80 = Ascii_2 +alt keycode 81 = Ascii_3 +alt keycode 82 = Ascii_0 +# +# The four cursor keys +# +keycode 103 = Up +keycode 105 = Left +keycode 106 = Right +keycode 108 = Down +alt keycode 103 = KeyboardSignal +alt keycode 105 = Decr_Console +alt keycode 106 = Incr_Console +# +# The six edit keys +# +keycode 110 = Insert +keycode 102 = Home # Find +keycode 104 = PageUp # Prior +keycode 111 = Remove +keycode 107 = End # Select +keycode 109 = PageDown # Next +shift keycode 104 = Scroll_Backward +shift keycode 109 = Scroll_Forward +control alt keycode 111 = Boot +# +# The three system keys +# +keycode 84 = Last_Console # Alt+SysRq/PrintScrn +#keycode 99 = VoidSymbol # SysRq/PrintScrn +keycode 99 = Compose # SysRq/PrintScrn +alt keycode 99 = Control_backslash +control keycode 99 = Control_backslash + +plain keycode 70 = Scroll_Lock +shift keycode 70 = Show_Memory +control keycode 70 = Show_State +alt keycode 70 = Show_Registers + +keycode 101 = Break # Ctrl+Break/Pause +keycode 119 = Pause # Break/Pause + diff --git a/data/keymaps/i386/include/linux-keys-bare.inc b/data/keymaps/i386/include/linux-keys-bare.inc index 30379aa..998b7bf 100644 --- a/data/keymaps/i386/include/linux-keys-bare.inc +++ b/data/keymaps/i386/include/linux-keys-bare.inc @@ -14,50 +14,25 @@ # # One user-preference item will be the function of the Delete key. # -# Old keyboards have 10 function keys, and keymaps have -# sometimes used shift+F1 = F11, and sometimes shift+F1 = F13. -# Here we assume an enhanced keyboard (with 12 function keys). -# -plain keycode 59 = F1 -plain keycode 60 = F2 -plain keycode 61 = F3 -plain keycode 62 = F4 -plain keycode 63 = F5 -plain keycode 64 = F6 -plain keycode 65 = F7 -plain keycode 66 = F8 -plain keycode 67 = F9 -plain keycode 68 = F10 -plain keycode 87 = F11 -plain keycode 88 = F12 -shift keycode 59 = F13 -shift keycode 60 = F14 -shift keycode 61 = F15 -shift keycode 62 = F16 -shift keycode 63 = F17 -shift keycode 64 = F18 -shift keycode 65 = F19 -shift keycode 66 = F20 -shift keycode 67 = F21 -shift keycode 68 = F22 -shift keycode 87 = F23 -shift keycode 88 = F24 -control keycode 59 = F25 -control keycode 60 = F26 -control keycode 61 = F27 -control keycode 62 = F28 -control keycode 63 = F29 -control keycode 64 = F30 -control keycode 65 = F31 -control keycode 66 = F32 -control keycode 67 = F33 -control keycode 68 = F34 -control keycode 87 = F35 -control keycode 88 = F36 -# -# The canonical assignment for F37-F48 uses -# control shift keycode 59 = F37 -# etc. If you want that, load linux-keys-extd.inc +# Function keys use Csi_* keysyms which generate standard CSI sequences +# and automatically encode modifier state. This fixes the long-standing +# discrepancy where F1-F5 used non-standard sequences (\e[[A through +# \e[[E) while F6 and above used standard CSI sequences. +# +# For the legacy F1-F246 keysyms, use linux-keys-bare-legacy.inc instead. +# +keycode 59 = Csi_F1 +keycode 60 = Csi_F2 +keycode 61 = Csi_F3 +keycode 62 = Csi_F4 +keycode 63 = Csi_F5 +keycode 64 = Csi_F6 +keycode 65 = Csi_F7 +keycode 66 = Csi_F8 +keycode 67 = Csi_F9 +keycode 68 = Csi_F10 +keycode 87 = Csi_F11 +keycode 88 = Csi_F12 # # Both Alt+Fn and Control+Alt+Fn switch to Console n # (in order to please Linux / dosemu / X). @@ -142,12 +117,12 @@ alt keycode 106 = Incr_Console # # The six edit keys # -keycode 110 = Insert -keycode 102 = Home # Find -keycode 104 = PageUp # Prior -keycode 111 = Remove -keycode 107 = End # Select -keycode 109 = PageDown # Next +keycode 110 = Csi_Insert +keycode 102 = Csi_Home # Find +keycode 104 = Csi_PgUp # Prior +keycode 111 = Csi_Delete +keycode 107 = Csi_End # Select +keycode 109 = Csi_PgDn # Next shift keycode 104 = Scroll_Backward shift keycode 109 = Scroll_Forward control alt keycode 111 = Boot @@ -167,4 +142,3 @@ alt keycode 70 = Show_Registers keycode 101 = Break # Ctrl+Break/Pause keycode 119 = Pause # Break/Pause - diff --git a/data/keymaps/i386/include/linux-keys-extd-legacy.inc b/data/keymaps/i386/include/linux-keys-extd-legacy.inc new file mode 100644 index 0000000..401a456 --- /dev/null +++ b/data/keymaps/i386/include/linux-keys-extd-legacy.inc @@ -0,0 +1,37 @@ +# +# More function keys and console assignments +# These are not in the main map in order to save keymaps +# Load after the main keymap, or include in the main keymap. +# +keymaps 5,9 + +control shift keycode 59 = F37 +control shift keycode 60 = F38 +control shift keycode 61 = F39 +control shift keycode 62 = F40 +control shift keycode 63 = F41 +control shift keycode 64 = F42 +control shift keycode 65 = F43 +control shift keycode 66 = F44 +control shift keycode 67 = F45 +control shift keycode 68 = F46 +control shift keycode 87 = F47 +control shift keycode 88 = F48 +# +alt shift keycode 59 = Console_13 +alt shift keycode 60 = Console_14 +alt shift keycode 61 = Console_15 +alt shift keycode 62 = Console_16 +alt shift keycode 63 = Console_17 +alt shift keycode 64 = Console_18 +alt shift keycode 65 = Console_19 +alt shift keycode 66 = Console_20 +alt shift keycode 67 = Console_21 +alt shift keycode 68 = Console_22 +alt shift keycode 87 = Console_23 +alt shift keycode 88 = Console_24 +# +# It would be reasonable to add lines like +# control alt shift keycode 59 = Console_13 +# but that would again require an extra key map, and is not worth it. +# diff --git a/data/keymaps/i386/include/linux-keys-extd.inc b/data/keymaps/i386/include/linux-keys-extd.inc index 401a456..79a7019 100644 --- a/data/keymaps/i386/include/linux-keys-extd.inc +++ b/data/keymaps/i386/include/linux-keys-extd.inc @@ -1,23 +1,14 @@ # -# More function keys and console assignments -# These are not in the main map in order to save keymaps +# Extended console assignments +# +# These are not in the main map in order to save keymaps. # Load after the main keymap, or include in the main keymap. # -keymaps 5,9 - -control shift keycode 59 = F37 -control shift keycode 60 = F38 -control shift keycode 61 = F39 -control shift keycode 62 = F40 -control shift keycode 63 = F41 -control shift keycode 64 = F42 -control shift keycode 65 = F43 -control shift keycode 66 = F44 -control shift keycode 67 = F45 -control shift keycode 68 = F46 -control shift keycode 87 = F47 -control shift keycode 88 = F48 +# Note: F37-F48 bindings have been removed as CSI keysyms automatically +# encode modifier state. For the legacy bindings, use linux-keys-extd-legacy.inc # +keymaps 9 + alt shift keycode 59 = Console_13 alt shift keycode 60 = Console_14 alt shift keycode 61 = Console_15 diff --git a/data/keymaps/i386/include/linux-with-modeshift-altgr-legacy.inc b/data/keymaps/i386/include/linux-with-modeshift-altgr-legacy.inc new file mode 100644 index 0000000..29012ba --- /dev/null +++ b/data/keymaps/i386/include/linux-with-modeshift-altgr-legacy.inc @@ -0,0 +1,101 @@ +# For keymaps in which AltGr_Lock is used to switch between two alphabets. +# +# A common construction is +# alt keycode 42 = AltGr_Lock +# altgr alt keycode 42 = AltGr_Lock +# +# All Linux keys have the same meaning with or without AltGr. +# No convention for Hex_* has been established. + +include "linux-keys-bare" + +keycode 100 = AltGr + +altgr keycode 59 = F1 +altgr keycode 60 = F2 +altgr keycode 61 = F3 +altgr keycode 62 = F4 +altgr keycode 63 = F5 +altgr keycode 64 = F6 +altgr keycode 65 = F7 +altgr keycode 66 = F8 +altgr keycode 67 = F9 +altgr keycode 68 = F10 +altgr keycode 87 = F11 +altgr keycode 88 = F12 +altgr shift keycode 59 = F13 +altgr shift keycode 60 = F14 +altgr shift keycode 61 = F15 +altgr shift keycode 62 = F16 +altgr shift keycode 63 = F17 +altgr shift keycode 64 = F18 +altgr shift keycode 65 = F19 +altgr shift keycode 66 = F20 +altgr shift keycode 67 = F21 +altgr shift keycode 68 = F22 +altgr shift keycode 87 = F23 +altgr shift keycode 88 = F24 +altgr control keycode 59 = F25 +altgr control keycode 60 = F26 +altgr control keycode 61 = F27 +altgr control keycode 62 = F28 +altgr control keycode 63 = F29 +altgr control keycode 64 = F30 +altgr control keycode 65 = F31 +altgr control keycode 66 = F32 +altgr control keycode 67 = F33 +altgr control keycode 68 = F34 +altgr control keycode 87 = F35 +altgr control keycode 88 = F36 +# +altgr alt keycode 59 = Console_1 +altgr alt keycode 60 = Console_2 +altgr alt keycode 61 = Console_3 +altgr alt keycode 62 = Console_4 +altgr alt keycode 63 = Console_5 +altgr alt keycode 64 = Console_6 +altgr alt keycode 65 = Console_7 +altgr alt keycode 66 = Console_8 +altgr alt keycode 67 = Console_9 +altgr alt keycode 68 = Console_10 +altgr alt keycode 87 = Console_11 +altgr alt keycode 88 = Console_12 +altgr control alt keycode 59 = Console_1 +altgr control alt keycode 60 = Console_2 +altgr control alt keycode 61 = Console_3 +altgr control alt keycode 62 = Console_4 +altgr control alt keycode 63 = Console_5 +altgr control alt keycode 64 = Console_6 +altgr control alt keycode 65 = Console_7 +altgr control alt keycode 66 = Console_8 +altgr control alt keycode 67 = Console_9 +altgr control alt keycode 68 = Console_10 +altgr control alt keycode 87 = Console_11 +altgr control alt keycode 88 = Console_12 +# +altgr alt keycode 71 = Ascii_7 +altgr alt keycode 72 = Ascii_8 +altgr alt keycode 73 = Ascii_9 +altgr alt keycode 75 = Ascii_4 +altgr alt keycode 76 = Ascii_5 +altgr alt keycode 77 = Ascii_6 +altgr alt keycode 79 = Ascii_1 +altgr alt keycode 80 = Ascii_2 +altgr alt keycode 81 = Ascii_3 +altgr alt keycode 82 = Ascii_0 +# +altgr alt keycode 103 = KeyboardSignal +altgr alt keycode 105 = Decr_Console +altgr alt keycode 106 = Incr_Console +# +altgr shift keycode 104 = Scroll_Backward +altgr shift keycode 109 = Scroll_Forward +# +# altgr control keycode 83 = Boot +altgr control alt keycode 83 = Boot +# altgr control keycode 111 = Boot +altgr control alt keycode 111 = Boot +# +# an exception - altgr changes the function +# +altgr keycode 70 = Show_Registers diff --git a/data/keymaps/i386/include/linux-with-modeshift-altgr.inc b/data/keymaps/i386/include/linux-with-modeshift-altgr.inc index 29012ba..2a00681 100644 --- a/data/keymaps/i386/include/linux-with-modeshift-altgr.inc +++ b/data/keymaps/i386/include/linux-with-modeshift-altgr.inc @@ -6,47 +6,27 @@ # # All Linux keys have the same meaning with or without AltGr. # No convention for Hex_* has been established. +# +# Note: shift/control altgr F-key bindings have been removed as CSI keysyms +# automatically encode modifier state. For legacy bindings, use +# linux-with-modeshift-altgr-legacy.inc instead. include "linux-keys-bare" keycode 100 = AltGr -altgr keycode 59 = F1 -altgr keycode 60 = F2 -altgr keycode 61 = F3 -altgr keycode 62 = F4 -altgr keycode 63 = F5 -altgr keycode 64 = F6 -altgr keycode 65 = F7 -altgr keycode 66 = F8 -altgr keycode 67 = F9 -altgr keycode 68 = F10 -altgr keycode 87 = F11 -altgr keycode 88 = F12 -altgr shift keycode 59 = F13 -altgr shift keycode 60 = F14 -altgr shift keycode 61 = F15 -altgr shift keycode 62 = F16 -altgr shift keycode 63 = F17 -altgr shift keycode 64 = F18 -altgr shift keycode 65 = F19 -altgr shift keycode 66 = F20 -altgr shift keycode 67 = F21 -altgr shift keycode 68 = F22 -altgr shift keycode 87 = F23 -altgr shift keycode 88 = F24 -altgr control keycode 59 = F25 -altgr control keycode 60 = F26 -altgr control keycode 61 = F27 -altgr control keycode 62 = F28 -altgr control keycode 63 = F29 -altgr control keycode 64 = F30 -altgr control keycode 65 = F31 -altgr control keycode 66 = F32 -altgr control keycode 67 = F33 -altgr control keycode 68 = F34 -altgr control keycode 87 = F35 -altgr control keycode 88 = F36 +altgr keycode 59 = Csi_F1 +altgr keycode 60 = Csi_F2 +altgr keycode 61 = Csi_F3 +altgr keycode 62 = Csi_F4 +altgr keycode 63 = Csi_F5 +altgr keycode 64 = Csi_F6 +altgr keycode 65 = Csi_F7 +altgr keycode 66 = Csi_F8 +altgr keycode 67 = Csi_F9 +altgr keycode 68 = Csi_F10 +altgr keycode 87 = Csi_F11 +altgr keycode 88 = Csi_F12 # altgr alt keycode 59 = Console_1 altgr alt keycode 60 = Console_2 -- 2.54.0