From 573bc14c91fd1ffde4caa6a9ece5139802c16855 Mon Sep 17 00:00:00 2001 From: Massimo Mund Date: Mon, 30 Sep 2024 12:46:16 +0200 Subject: [PATCH] Do not filter Ctrl+Alt in non-rune cases Ctrl+Alt seems to be the same as AltGr and AltGr usually switches the keyboard layout to level 3. This is not true for keys combos like: Ctrl + Alt + [Up, Down, Left, Right, Home, End, PageUp, PageDown, Delete, Backspace] or mouse clicks. --- console_win.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/console_win.go b/console_win.go index 78077175..a5fab9a9 100644 --- a/console_win.go +++ b/console_win.go @@ -666,14 +666,14 @@ func geti16(v []byte) int16 { } // Convert windows dwControlKeyState to modifier mask -func mod2mask(cks uint32) ModMask { +func mod2mask(cks uint32, filter_ctrl_alt bool) ModMask { mm := ModNone // Left or right control ctrl := (cks & (0x0008 | 0x0004)) != 0 // Left or right alt alt := (cks & (0x0002 | 0x0001)) != 0 // Filter out ctrl+alt (it means AltGr) - if !(ctrl && alt) { + if !filter_ctrl_alt || !(ctrl && alt) { if ctrl { mm |= ModCtrl } @@ -788,10 +788,10 @@ func (s *cScreen) getConsoleInput() error { // synthesized key code for krec.repeat > 0 { // convert shift+tab to backtab - if mod2mask(krec.mod) == ModShift && krec.ch == vkTab { + if mod2mask(krec.mod, false) == ModShift && krec.ch == vkTab { s.postEvent(NewEventKey(KeyBacktab, 0, ModNone)) } else { - s.postEvent(NewEventKey(KeyRune, rune(krec.ch), mod2mask(krec.mod))) + s.postEvent(NewEventKey(KeyRune, rune(krec.ch), mod2mask(krec.mod, true))) } krec.repeat-- } @@ -803,7 +803,7 @@ func (s *cScreen) getConsoleInput() error { return nil } for krec.repeat > 0 { - s.postEvent(NewEventKey(key, rune(krec.ch), mod2mask(krec.mod))) + s.postEvent(NewEventKey(key, rune(krec.ch), mod2mask(krec.mod, false))) krec.repeat-- } @@ -816,7 +816,7 @@ func (s *cScreen) getConsoleInput() error { mrec.flags = getu32(rec.data[12:]) btns := mrec2btns(mrec.btns, mrec.flags) // we ignore double click, events are delivered normally - s.postEvent(NewEventMouse(int(mrec.x), int(mrec.y), btns, mod2mask(mrec.mod))) + s.postEvent(NewEventMouse(int(mrec.x), int(mrec.y), btns, mod2mask(mrec.mod, false))) case resizeEvent: var rrec resizeRecord