[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