wezterm icon indicating copy to clipboard operation
wezterm copied to clipboard

On french keyboard layout, `Alt-²` wrongly sends `Alt-bquote`

Open bew opened this issue 1 year ago • 5 comments

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

bew avatar Sep 09 '23 19:09 bew

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

wez avatar Feb 04 '24 00:02 wez

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 }

bew avatar Feb 04 '24 10:02 bew

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?

wez avatar Feb 04 '24 17:02 wez