mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 05:31:37 -04:00
vt: add KT_CSI keysym type for modifier-aware CSI sequences
Add a new keysym type KT_CSI that generates CSI tilde sequences with automatic modifier encoding. The keysym value encodes the CSI parameter number, producing sequences like ESC [ <value> ~ or ESC [ <value> ; <mod> ~ when Shift, Alt, or Ctrl modifiers are held. This allows navigation keys (Home, End, Insert, Delete, PgUp, PgDn) and function keys to generate modifier-aware escape sequences without consuming string table entries for each modifier combination. Define key symbols for navigation keys (K_CSI_HOME, K_CSI_END, etc.) and function keys (K_CSI_F1 through K_CSI_F20) using standard xterm CSI parameter values. The modifier encoding follows the xterm convention: mod = 1 + (shift ? 1 : 0) + (alt ? 2 : 0) + (ctrl ? 4 : 0) Allowed CSI parameter values range from 0 to 99. Note: The Linux console historically uses a non-standard double-bracket format for F1-F5 (ESC [ [ A through ESC [ [ E) rather than the xterm tilde format (ESC [ 11 ~ through ESC [ 15 ~). The K_CSI_F1 through K_CSI_F5 definitions use the xterm format. Converting F1-F5 to KT_CSI would require updating the "linux" terminfo entry to match. Navigation keys and F6-F20 already use the tilde format and are fully compatible. Signed-off-by: Nicolas Pitre <npitre@baylibre.com> Link: https://patch.msgid.link/20260203045457.1049793-3-nico@fluxnic.net Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
4af70f1516
commit
5cba06c71c
@@ -74,7 +74,7 @@ static inline int kbd_defleds(void)
|
||||
k_self, k_fn, k_spec, k_pad,\
|
||||
k_dead, k_cons, k_cur, k_shift,\
|
||||
k_meta, k_ascii, k_lock, k_lowercase,\
|
||||
k_slock, k_dead2, k_brl, k_ignore
|
||||
k_slock, k_dead2, k_brl, k_csi
|
||||
|
||||
typedef void (k_handler_fn)(struct vc_data *vc, unsigned char value,
|
||||
char up_flag);
|
||||
@@ -127,6 +127,7 @@ static const unsigned char max_vals[] = {
|
||||
[ KT_SLOCK ] = NR_LOCK - 1,
|
||||
[ KT_DEAD2 ] = 255,
|
||||
[ KT_BRL ] = NR_BRL - 1,
|
||||
[ KT_CSI ] = 99,
|
||||
};
|
||||
|
||||
static const int NR_TYPES = ARRAY_SIZE(max_vals);
|
||||
@@ -644,10 +645,6 @@ static void fn_null(struct vc_data *vc)
|
||||
/*
|
||||
* Special key handlers
|
||||
*/
|
||||
static void k_ignore(struct vc_data *vc, unsigned char value, char up_flag)
|
||||
{
|
||||
}
|
||||
|
||||
static void k_spec(struct vc_data *vc, unsigned char value, char up_flag)
|
||||
{
|
||||
if (up_flag)
|
||||
@@ -1029,6 +1026,37 @@ static void k_brl(struct vc_data *vc, unsigned char value, char up_flag)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle KT_CSI keysym type: generate CSI tilde sequences with modifier
|
||||
* support. The value encodes the CSI parameter number, producing sequences
|
||||
* like ESC [ <value> ~ or ESC [ <value> ; <mod> ~ when modifiers are held.
|
||||
*/
|
||||
static void k_csi(struct vc_data *vc, unsigned char value, char up_flag)
|
||||
{
|
||||
char buf[10];
|
||||
int i = 0;
|
||||
int mod;
|
||||
|
||||
if (up_flag)
|
||||
return;
|
||||
|
||||
mod = csi_modifier_param();
|
||||
|
||||
buf[i++] = 0x1b;
|
||||
buf[i++] = '[';
|
||||
if (value >= 10)
|
||||
buf[i++] = '0' + value / 10;
|
||||
buf[i++] = '0' + value % 10;
|
||||
if (mod > 1) {
|
||||
buf[i++] = ';';
|
||||
buf[i++] = '0' + mod;
|
||||
}
|
||||
buf[i++] = '~';
|
||||
buf[i] = 0x00;
|
||||
|
||||
puts_queue(vc, buf);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_INPUT_LEDS) && IS_ENABLED(CONFIG_LEDS_TRIGGERS)
|
||||
|
||||
struct kbd_led_trigger {
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#define KT_SLOCK 12
|
||||
#define KT_DEAD2 13
|
||||
#define KT_BRL 14
|
||||
#define KT_CSI 15 /* CSI sequences with modifier support */
|
||||
|
||||
#define K(t,v) (((t)<<8)|(v))
|
||||
#define KTYP(x) ((x) >> 8)
|
||||
@@ -461,5 +462,33 @@
|
||||
|
||||
#define NR_BRL 11
|
||||
|
||||
/* KT_CSI keys: value is the CSI parameter number for ESC [ <value> ~ */
|
||||
#define K_CSI_HOME K(KT_CSI, 1) /* ESC [ 1 ~ */
|
||||
#define K_CSI_INSERT K(KT_CSI, 2) /* ESC [ 2 ~ */
|
||||
#define K_CSI_DELETE K(KT_CSI, 3) /* ESC [ 3 ~ */
|
||||
#define K_CSI_END K(KT_CSI, 4) /* ESC [ 4 ~ */
|
||||
#define K_CSI_PGUP K(KT_CSI, 5) /* ESC [ 5 ~ */
|
||||
#define K_CSI_PGDN K(KT_CSI, 6) /* ESC [ 6 ~ */
|
||||
#define K_CSI_F1 K(KT_CSI, 11) /* ESC [ 11 ~ */
|
||||
#define K_CSI_F2 K(KT_CSI, 12) /* ESC [ 12 ~ */
|
||||
#define K_CSI_F3 K(KT_CSI, 13) /* ESC [ 13 ~ */
|
||||
#define K_CSI_F4 K(KT_CSI, 14) /* ESC [ 14 ~ */
|
||||
#define K_CSI_F5 K(KT_CSI, 15) /* ESC [ 15 ~ */
|
||||
#define K_CSI_F6 K(KT_CSI, 17) /* ESC [ 17 ~ */
|
||||
#define K_CSI_F7 K(KT_CSI, 18) /* ESC [ 18 ~ */
|
||||
#define K_CSI_F8 K(KT_CSI, 19) /* ESC [ 19 ~ */
|
||||
#define K_CSI_F9 K(KT_CSI, 20) /* ESC [ 20 ~ */
|
||||
#define K_CSI_F10 K(KT_CSI, 21) /* ESC [ 21 ~ */
|
||||
#define K_CSI_F11 K(KT_CSI, 23) /* ESC [ 23 ~ */
|
||||
#define K_CSI_F12 K(KT_CSI, 24) /* ESC [ 24 ~ */
|
||||
#define K_CSI_F13 K(KT_CSI, 25) /* ESC [ 25 ~ */
|
||||
#define K_CSI_F14 K(KT_CSI, 26) /* ESC [ 26 ~ */
|
||||
#define K_CSI_F15 K(KT_CSI, 28) /* ESC [ 28 ~ */
|
||||
#define K_CSI_F16 K(KT_CSI, 29) /* ESC [ 29 ~ */
|
||||
#define K_CSI_F17 K(KT_CSI, 31) /* ESC [ 31 ~ */
|
||||
#define K_CSI_F18 K(KT_CSI, 32) /* ESC [ 32 ~ */
|
||||
#define K_CSI_F19 K(KT_CSI, 33) /* ESC [ 33 ~ */
|
||||
#define K_CSI_F20 K(KT_CSI, 34) /* ESC [ 34 ~ */
|
||||
|
||||
#define MAX_DIACR 256
|
||||
#endif /* _UAPI__LINUX_KEYBOARD_H */
|
||||
|
||||
Reference in New Issue
Block a user