From 13183522dd7688edad951da9f37931ed658c1d1a Mon Sep 17 00:00:00 2001 From: Jeff Williams Date: Wed, 12 Jan 2022 08:36:45 -0500 Subject: [PATCH] app: send keypress events for modifier keys This change causes modifier keys (Control, Shift, Alt, Super) to be sent to the application as key.Event events. These will still continue to be used as modifiers for other key and pointer events as they are today. This commit also adds a minor cleanup to use constants for function keys in the OS-specific keypress handling functions. Signed-off-by: Jeff Williams --- app/internal/xkb/xkb_unix.go | 32 ++++++++++++++++++++------------ app/os_android.go | 8 ++++++++ app/os_js.go | 35 +++++++++++++++++++++++++++++++++-- app/os_macos.go | 24 ++++++++++++------------ app/os_windows.go | 33 +++++++++++++++++++++------------ io/key/key.go | 16 ++++++++++++++++ 6 files changed, 110 insertions(+), 38 deletions(-) diff --git a/app/internal/xkb/xkb_unix.go b/app/internal/xkb/xkb_unix.go index 68b13291..eda120d8 100644 --- a/app/internal/xkb/xkb_unix.go +++ b/app/internal/xkb/xkb_unix.go @@ -267,33 +267,41 @@ func convertKeysym(s C.xkb_keysym_t) (string, bool) { case C.XKB_KEY_Page_Down: n = key.NamePageDown case C.XKB_KEY_F1: - n = "F1" + n = key.NameF1 case C.XKB_KEY_F2: - n = "F2" + n = key.NameF2 case C.XKB_KEY_F3: - n = "F3" + n = key.NameF3 case C.XKB_KEY_F4: - n = "F4" + n = key.NameF4 case C.XKB_KEY_F5: - n = "F5" + n = key.NameF5 case C.XKB_KEY_F6: - n = "F6" + n = key.NameF6 case C.XKB_KEY_F7: - n = "F7" + n = key.NameF7 case C.XKB_KEY_F8: - n = "F8" + n = key.NameF8 case C.XKB_KEY_F9: - n = "F9" + n = key.NameF9 case C.XKB_KEY_F10: - n = "F10" + n = key.NameF10 case C.XKB_KEY_F11: - n = "F11" + n = key.NameF11 case C.XKB_KEY_F12: - n = "F12" + n = key.NameF12 case C.XKB_KEY_Tab, C.XKB_KEY_KP_Tab, C.XKB_KEY_ISO_Left_Tab: n = key.NameTab case 0x20, C.XKB_KEY_KP_Space: n = key.NameSpace + case C.XKB_KEY_Control_L, C.XKB_KEY_Control_R: + n = key.NameCtrl + case C.XKB_KEY_Shift_L, C.XKB_KEY_Shift_R: + n = key.NameShift + case C.XKB_KEY_Alt_L, C.XKB_KEY_Alt_R: + n = key.NameAlt + case C.XKB_KEY_Super_L, C.XKB_KEY_Super_R: + n = key.NameSuper default: return "", false } diff --git a/app/os_android.go b/app/os_android.go index 9830f39d..4f46b24f 100644 --- a/app/os_android.go +++ b/app/os_android.go @@ -905,6 +905,14 @@ func convertKeyCode(code C.jint) (string, bool) { n = key.NameEnter case C.AKEYCODE_ENTER: n = key.NameEnter + case C.AKEYCODE_CTRL_LEFT, C.AKEYCODE_CTRL_RIGHT: + n = key.NameCtrl + case C.AKEYCODE_SHIFT_LEFT, C.AKEYCODE_SHIFT_RIGHT: + n = key.NameShift + case C.AKEYCODE_ALT_LEFT, C.AKEYCODE_ALT_RIGHT: + n = key.NameAlt + case C.AKEYCODE_META_LEFT, C.AKEYCODE_META_RIGHT: + n = key.NameSuper default: return "", false } diff --git a/app/os_js.go b/app/os_js.go index 5b1388cf..5debe9b3 100644 --- a/app/os_js.go +++ b/app/os_js.go @@ -677,6 +677,7 @@ func osMain() { func translateKey(k string) (string, bool) { var n string + switch k { case "ArrowUp": n = key.NameUpArrow @@ -706,8 +707,38 @@ func translateKey(k string) (string, bool) { n = key.NameTab case " ": n = key.NameSpace - case "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12": - n = k + case "F1": + n = key.NameF1 + case "F2": + n = key.NameF2 + case "F3": + n = key.NameF3 + case "F4": + n = key.NameF4 + case "F5": + n = key.NameF5 + case "F6": + n = key.NameF6 + case "F7": + n = key.NameF7 + case "F8": + n = key.NameF8 + case "F9": + n = key.NameF9 + case "F10": + n = key.NameF10 + case "F11": + n = key.NameF11 + case "F12": + n = key.NameF12 + case "Control": + n = key.NameCtrl + case "Shift": + n = key.NameShift + case "Alt": + n = key.NameAlt + case "OS": + n = key.NameSuper default: r, s := utf8.DecodeRuneInString(k) // If there is exactly one printable character, return that. diff --git a/app/os_macos.go b/app/os_macos.go index 4c754d62..3cbbcc3c 100644 --- a/app/os_macos.go +++ b/app/os_macos.go @@ -610,29 +610,29 @@ func convertKey(k rune) (string, bool) { case C.NSPageDownFunctionKey: n = key.NamePageDown case C.NSF1FunctionKey: - n = "F1" + n = key.NameF1 case C.NSF2FunctionKey: - n = "F2" + n = key.NameF2 case C.NSF3FunctionKey: - n = "F3" + n = key.NameF3 case C.NSF4FunctionKey: - n = "F4" + n = key.NameF4 case C.NSF5FunctionKey: - n = "F5" + n = key.NameF5 case C.NSF6FunctionKey: - n = "F6" + n = key.NameF6 case C.NSF7FunctionKey: - n = "F7" + n = key.NameF7 case C.NSF8FunctionKey: - n = "F8" + n = key.NameF8 case C.NSF9FunctionKey: - n = "F9" + n = key.NameF9 case C.NSF10FunctionKey: - n = "F10" + n = key.NameF10 case C.NSF11FunctionKey: - n = "F11" + n = key.NameF11 case C.NSF12FunctionKey: - n = "F12" + n = key.NameF12 case 0x09, 0x19: n = key.NameTab case 0x20: diff --git a/app/os_windows.go b/app/os_windows.go index ecbffb4d..50460d3f 100644 --- a/app/os_windows.go +++ b/app/os_windows.go @@ -739,6 +739,7 @@ func convertKeyCode(code uintptr) (string, bool) { return string(rune(code)), true } var r string + switch code { case windows.VK_ESCAPE: r = key.NameEscape @@ -765,29 +766,29 @@ func convertKeyCode(code uintptr) (string, bool) { case windows.VK_NEXT: r = key.NamePageDown case windows.VK_F1: - r = "F1" + r = key.NameF1 case windows.VK_F2: - r = "F2" + r = key.NameF2 case windows.VK_F3: - r = "F3" + r = key.NameF3 case windows.VK_F4: - r = "F4" + r = key.NameF4 case windows.VK_F5: - r = "F5" + r = key.NameF5 case windows.VK_F6: - r = "F6" + r = key.NameF6 case windows.VK_F7: - r = "F7" + r = key.NameF7 case windows.VK_F8: - r = "F8" + r = key.NameF8 case windows.VK_F9: - r = "F9" + r = key.NameF9 case windows.VK_F10: - r = "F10" + r = key.NameF10 case windows.VK_F11: - r = "F11" + r = key.NameF11 case windows.VK_F12: - r = "F12" + r = key.NameF12 case windows.VK_TAB: r = key.NameTab case windows.VK_SPACE: @@ -814,6 +815,14 @@ func convertKeyCode(code uintptr) (string, bool) { r = "]" case windows.VK_OEM_7: r = "'" + case windows.VK_CONTROL: + r = key.NameCtrl + case windows.VK_SHIFT: + r = key.NameShift + case windows.VK_MENU: + r = key.NameAlt + case windows.VK_LWIN, windows.VK_RWIN: + r = key.NameSuper default: return "", false } diff --git a/io/key/key.go b/io/key/key.go index b6af2a4c..ef8f9111 100644 --- a/io/key/key.go +++ b/io/key/key.go @@ -133,6 +133,22 @@ const ( NamePageDown = "⇟" NameTab = "⇥" NameSpace = "Space" + NameCtrl = "⌃" + NameShift = "⇧" + NameAlt = "⎇" + NameSuper = "⊞" + NameF1 = "F1" + NameF2 = "F2" + NameF3 = "F3" + NameF4 = "F4" + NameF5 = "F5" + NameF6 = "F6" + NameF7 = "F7" + NameF8 = "F8" + NameF9 = "F9" + NameF10 = "F10" + NameF11 = "F11" + NameF12 = "F12" ) // Contain reports whether m contains all modifiers