wezterm
wezterm copied to clipboard
On french keyboard layout, `Alt-²` wrongly sends `Alt-bquote`
What Operating System(s) are you seeing this problem on?
Linux X11
Which Wayland compositor or X11 Window manager(s) are you using?
KWin
WezTerm version
20230712-072601-f4abf8fd
Did you try the latest nightly build to see if the issue is better (or worse!) than your current version?
Yes, and I updated the version box above to show the version of the nightly that I tried
Describe the bug
On AZERTY (french) keyboard layout, the ²
key (on the left of number keys) works normally, and pressing it sends ²
.
But when I add Alt modifier: with Alt-²
, Alt-`
is sent instead of Alt-²
(as if I was in qwerty?)
To Reproduce
No response
Configuration
return {}
Expected Behavior
Send Alt-²
when I press Alt-²
Logs
--- Press/Release ²
20:48:21.787 INFO wezterm_gui::termwindow::keyevent > key_event RawKeyEvent { key: Physical(Grave), modifiers: NONE, leds: (empty), phys_code: Some(Grave), raw_code: 49, repeat_count: 1, key_is_down: true, han
dled: Handled(false) }
20:48:21.787 INFO wezterm_gui::termwindow::keyevent > key_event KeyEvent { key: Char('²'), modifiers: NONE, leds: (empty), repeat_count: 1, key_is_down: true, raw: Some(RawKeyEvent { key: Physical(Grave), modi
fiers: NONE, leds: (empty), phys_code: Some(Grave), raw_code: 49, repeat_count: 1, key_is_down: true, handled: Handled(false) }) }
20:48:21.787 INFO wezterm_gui::termwindow::keyevent > send to pane DOWN key=Char('²') mods=NONE
20:48:21.788 INFO wezterm_term::terminalstate::keyboard > key_down: sending "²", Char('²') NONE
20:48:21.897 INFO wezterm_gui::termwindow::keyevent > key_event KeyEvent { key: Char('²'), modifiers: NONE, leds: (empty), repeat_count: 1, key_is_down: false, raw: Some(RawKeyEvent { key: Physical(Grave),
modifiers: NONE, leds: (empty), phys_code: Some(Grave), raw_code: 49, repeat_count: 1, key_is_down: false, handled: Handled(false) }) }
20:48:21.897 INFO wezterm_gui::termwindow::keyevent > send to pane UP key=Char('²') mods=NONE
--- Press Alt
20:48:25.258 INFO wezterm_gui::termwindow::keyevent > key_event RawKeyEvent { key: Physical(LeftAlt), modifiers: NONE, leds: (empty), phys_code: Some(LeftAlt), raw_code: 64, repeat_count: 1, key_is_down: t
rue, handled: Handled(false) }
20:48:25.259 INFO wezterm_gui::termwindow::keyevent > key_event KeyEvent { key: LeftAlt, modifiers: NONE, leds: (empty), repeat_count: 1, key_is_down: true, raw: Some(RawKeyEvent { key: Physical(LeftAlt),
modifiers: NONE, leds: (empty), phys_code: Some(LeftAlt), raw_code: 64, repeat_count: 1, key_is_down: true, handled: Handled(false) }) }
20:48:25.259 INFO wezterm_gui::termwindow::keyevent > send to pane DOWN key=LeftAlt mods=NONE
--- Press/Release ²
20:48:29.856 INFO wezterm_gui::termwindow::keyevent > key_event RawKeyEvent { key: Physical(Grave), modifiers: ALT, leds: (empty), phys_code: Some(Grave), raw_code: 49, repeat_count: 1, key_is_down: true,
handled: Handled(false) }
20:48:29.856 INFO wezterm_gui::termwindow::keyevent > key_event KeyEvent { key: Char('`'), modifiers: ALT, leds: (empty), repeat_count: 1, key_is_down: true, raw: Some(RawKeyEvent { key: Physical(Grave), m
odifiers: ALT, leds: (empty), phys_code: Some(Grave), raw_code: 49, repeat_count: 1, key_is_down: true, handled: Handled(false) }) }
20:48:29.856 INFO wezterm_gui::termwindow::keyevent > send to pane DOWN key=Char('`') mods=ALT
20:48:29.856 INFO wezterm_term::terminalstate::keyboard > key_down: sending "\u{1b}`", Char('`') ALT
20:48:29.955 INFO wezterm_gui::termwindow::keyevent > key_event KeyEvent { key: Char('²'), modifiers: ALT, leds: (empty), repeat_count: 1, key_is_down: false, raw: Some(RawKeyEvent { key: Physical(Grave),
modifiers: ALT, leds: (empty), phys_code: Some(Grave), raw_code: 49, repeat_count: 1, key_is_down: false, handled: Handled(false) }) }
20:48:29.955 INFO wezterm_gui::termwindow::keyevent > send to pane UP key=Char('²') mods=ALT
--- Release Alt
20:48:36.631 INFO wezterm_gui::termwindow::keyevent > key_event KeyEvent { key: LeftAlt, modifiers: ALT, leds: (empty), repeat_count: 1, key_is_down: false, raw: Some(RawKeyEvent { key: Physical(LeftAlt),
modifiers: ALT, leds: (empty), phys_code: Some(LeftAlt), raw_code: 64, repeat_count: 1, key_is_down: false, handled: Handled(false) }) }
20:48:36.631 INFO wezterm_gui::termwindow::keyevent > send to pane UP key=LeftAlt mods=ALT
You can see that for some reason the UP KeyEvent is correct (Alt-²
) but DOWN KeyEvent is incorrect (Alt-`
)
Anything else?
No response
Is this working in the latest release? If not, please update the debug output:
WEZTERM_LOG=window::os::x11::keyboard=trace,info wezterm -n --config debug_key_events=true
Thanks for getting back to this 🙏
It's not working yet, here are the latest logs with 20240203-110809-5046fc22
:
11:51:30.880 TRACE window::os::x11::keyboard > merge_current_xcb_modifiers(selected); state before=StateFromXcbStateNotify { depressed_mods: 0, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }, mods=0
11:51:30.880 TRACE window::os::x11::keyboard > merge_current_xcb_modifiers(fallback); state before=StateFromXcbStateNotify { depressed_mods: 0, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }, mods=0
11:51:30.880 INFO wezterm_gui::termwindow::keyevent > key_event RawKeyEvent { key: Physical(LeftAlt), modifiers: NONE, leds: (empty), phys_code: Some(LeftAlt), raw_code: 64, repeat_count: 1, key_is_down: true, handled: Handled(false) }
11:51:30.880 TRACE window::os::x11::keyboard > Compose::feed(fallback) XK_Alt_L -> result=Ignored status=Nothing
11:51:30.880 TRACE window::os::x11::keyboard > Compose::feed(selected) XK_Alt_L -> result=Ignored status=Nothing
11:51:30.880 TRACE window::os::x11::keyboard > process_key_event: RawKeyEvent FeedResult::Nothing: "", XK_Alt_L. kc -> None fallback_feed=Nothing("", XK_Alt_L)
11:51:30.880 INFO wezterm_gui::termwindow::keyevent > key_event KeyEvent { key: LeftAlt, modifiers: NONE, leds: (empty), repeat_count: 1, key_is_down: true, raw: Some(RawKeyEvent { key: Physical(LeftAlt), modifiers: NONE, leds: (empty), phys_code: Some(LeftAlt), raw_code: 64, repeat_count: 1, key_is_down: true, handled: Handled(false) }) }
11:51:30.880 INFO wezterm_gui::termwindow::keyevent > send to pane DOWN key=LeftAlt mods=NONE
11:51:30.880 TRACE window::os::x11::keyboard > update_state(selected) with StateFromXcbStateNotify { depressed_mods: 8, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }
11:51:30.880 TRACE window::os::x11::keyboard > update_state(fallback) with StateFromXcbStateNotify { depressed_mods: 8, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }
11:51:31.259 TRACE window::os::x11::keyboard > merge_current_xcb_modifiers(selected); state before=StateFromXcbStateNotify { depressed_mods: 8, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }, mods=8
11:51:31.259 TRACE window::os::x11::keyboard > merge_current_xcb_modifiers(fallback); state before=StateFromXcbStateNotify { depressed_mods: 8, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }, mods=8
11:51:31.259 INFO wezterm_gui::termwindow::keyevent > key_event RawKeyEvent { key: Physical(Grave), modifiers: ALT, leds: (empty), phys_code: Some(Grave), raw_code: 49, repeat_count: 1, key_is_down: true, handled: Handled(false) }
11:51:31.259 TRACE window::os::x11::keyboard > Compose::feed(fallback) XK_grave -> result=Accepted status=Nothing
11:51:31.259 TRACE window::os::x11::keyboard > Compose::feed(selected) XK_twosuperior -> result=Accepted status=Nothing
11:51:31.259 TRACE window::os::x11::keyboard > process_key_event: RawKeyEvent FeedResult::Nothing: "²", XK_twosuperior. kc -> None fallback_feed=Nothing("`", XK_grave)
11:51:31.259 TRACE window::os::x11::keyboard > process_key_event: RawKeyEvent using fallback sym XK_grave because layout would expand to non-ascii text '²'
11:51:31.259 INFO wezterm_gui::termwindow::keyevent > key_event KeyEvent { key: Char('`'), modifiers: ALT, leds: (empty), repeat_count: 1, key_is_down: true, raw: Some(RawKeyEvent { key: Physical(Grave), modifiers: ALT, leds: (empty), phys_code: Some(Grave), raw_code: 49, repeat_count: 1, key_is_down: true, handled: Handled(false) }) }
11:51:31.259 INFO wezterm_gui::termwindow::keyevent > send to pane DOWN key=Char('`') mods=ALT
11:51:31.260 INFO wezterm_term::terminalstate::keyboard > key_down: sending "\u{1b}`", Char('`') ALT
11:51:31.353 TRACE window::os::x11::keyboard > merge_current_xcb_modifiers(selected); state before=StateFromXcbStateNotify { depressed_mods: 8, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }, mods=8
11:51:31.353 TRACE window::os::x11::keyboard > merge_current_xcb_modifiers(fallback); state before=StateFromXcbStateNotify { depressed_mods: 8, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }, mods=8
11:51:31.353 INFO wezterm_gui::termwindow::keyevent > key_event KeyEvent { key: Char('²'), modifiers: ALT, leds: (empty), repeat_count: 1, key_is_down: false, raw: Some(RawKeyEvent { key: Physical(Grave), modifiers: ALT, leds: (empty), phys_code: Some(Grave), raw_code: 49, repeat_count: 1, key_is_down: false, handled: Handled(false) }) }
11:51:31.353 INFO wezterm_gui::termwindow::keyevent > send to pane UP key=Char('²') mods=ALT
11:51:31.848 TRACE window::os::x11::keyboard > merge_current_xcb_modifiers(selected); state before=StateFromXcbStateNotify { depressed_mods: 8, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }, mods=8
11:51:31.848 TRACE window::os::x11::keyboard > merge_current_xcb_modifiers(fallback); state before=StateFromXcbStateNotify { depressed_mods: 8, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }, mods=8
11:51:31.848 INFO wezterm_gui::termwindow::keyevent > key_event KeyEvent { key: LeftAlt, modifiers: ALT, leds: (empty), repeat_count: 1, key_is_down: false, raw: Some(RawKeyEvent { key: Physical(LeftAlt), modifiers: ALT, leds: (empty), phys_code: Some(LeftAlt), raw_code: 64, repeat_count: 1, key_is_down: false, handled: Handled(false) }) }
11:51:31.848 INFO wezterm_gui::termwindow::keyevent > send to pane UP key=LeftAlt mods=ALT
11:51:31.848 TRACE window::os::x11::keyboard > update_state(selected) with StateFromXcbStateNotify { depressed_mods: 0, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }
11:51:31.848 TRACE window::os::x11::keyboard > update_state(fallback) with StateFromXcbStateNotify { depressed_mods: 0, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }
11:51:37.126 TRACE window::os::x11::keyboard > update_state(selected) with StateFromXcbStateNotify { depressed_mods: 4, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }
11:51:37.126 TRACE window::os::x11::keyboard > update_state(fallback) with StateFromXcbStateNotify { depressed_mods: 4, latched_mods: 0, locked_mods: 0, depressed_layout: 0, latched_layout: 0, locked_layout: 0 }
I think 15da2e64c27b282d55708d6514dd8aa0040cc7d4 would resolve this, but the scoping of it is tricky; see #4933 for where it unintentionally changes how a keypress is encoded--that particular issue is not really a wezterm encoding issue, but rather a helix configuration issue.
How does xterm/vte/kitty encode that key combination for you?