diff --git a/genkeys.go b/genkeys.go index eea260a2f..84800a17e 100644 --- a/genkeys.go +++ b/genkeys.go @@ -579,6 +579,11 @@ var uiKeyToGLFWKey = map[Key]glfw.Key{ {{range $dname, $gname := .UIKeyNameToGLFWKeyName}}Key{{$dname}}: glfw.Key{{$gname}}, {{end}} } + +var glfwKeyToUIKey = map[glfw.Key]Key{ +{{range $dname, $gname := .UIKeyNameToGLFWKeyName}}glfw.Key{{$gname}}: Key{{$dname}}, +{{end}} +} ` const uiJSKeysTmpl = `{{.License}} diff --git a/internal/ui/input_glfw.go b/internal/ui/input_glfw.go index 41ead8e88..30f238475 100644 --- a/internal/ui/input_glfw.go +++ b/internal/ui/input_glfw.go @@ -32,6 +32,34 @@ var glfwMouseButtonToMouseButton = map[glfw.MouseButton]MouseButton{ } func (u *UserInterface) registerInputCallbacks() error { + if _, err := u.window.SetKeyCallback(func(w *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) { + // As this function is called from GLFW callbacks, the current thread is main. + u.m.Lock() + defer u.m.Unlock() + + uk, ok := glfwKeyToUIKey[key] + if !ok { + return + } + u.inputState.KeyPressed[uk] = action == glfw.Press + }); err != nil { + return err + } + + if _, err := u.window.SetMouseButtonCallback(func(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mods glfw.ModifierKey) { + // As this function is called from GLFW callbacks, the current thread is main. + u.m.Lock() + defer u.m.Unlock() + + ub, ok := glfwMouseButtonToMouseButton[button] + if !ok { + return + } + u.inputState.MouseButtonPressed[ub] = action == glfw.Press + }); err != nil { + return err + } + if _, err := u.window.SetCharModsCallback(func(w *glfw.Window, char rune, mods glfw.ModifierKey) { // As this function is called from GLFW callbacks, the current thread is main. u.m.Lock() @@ -67,21 +95,6 @@ func (u *UserInterface) updateInputStateImpl() error { u.m.Lock() defer u.m.Unlock() - for uk, gk := range uiKeyToGLFWKey { - s, err := u.window.GetKey(gk) - if err != nil { - return err - } - u.inputState.KeyPressed[uk] = s == glfw.Press - } - for gb, ub := range glfwMouseButtonToMouseButton { - s, err := u.window.GetMouseButton(gb) - if err != nil { - return err - } - u.inputState.MouseButtonPressed[ub] = s == glfw.Press - } - m, err := u.currentMonitor() if err != nil { return err diff --git a/internal/ui/keys_glfw.go b/internal/ui/keys_glfw.go index 37af13b49..abcfb910d 100644 --- a/internal/ui/keys_glfw.go +++ b/internal/ui/keys_glfw.go @@ -142,3 +142,124 @@ var uiKeyToGLFWKey = map[Key]glfw.Key{ KeyY: glfw.KeyY, KeyZ: glfw.KeyZ, } + +var glfwKeyToUIKey = map[glfw.Key]Key{ + glfw.KeyA: KeyA, + glfw.KeyLeftAlt: KeyAltLeft, + glfw.KeyRightAlt: KeyAltRight, + glfw.KeyDown: KeyArrowDown, + glfw.KeyLeft: KeyArrowLeft, + glfw.KeyRight: KeyArrowRight, + glfw.KeyUp: KeyArrowUp, + glfw.KeyB: KeyB, + glfw.KeyGraveAccent: KeyBackquote, + glfw.KeyBackslash: KeyBackslash, + glfw.KeyBackspace: KeyBackspace, + glfw.KeyLeftBracket: KeyBracketLeft, + glfw.KeyRightBracket: KeyBracketRight, + glfw.KeyC: KeyC, + glfw.KeyCapsLock: KeyCapsLock, + glfw.KeyComma: KeyComma, + glfw.KeyMenu: KeyContextMenu, + glfw.KeyLeftControl: KeyControlLeft, + glfw.KeyRightControl: KeyControlRight, + glfw.KeyD: KeyD, + glfw.KeyDelete: KeyDelete, + glfw.Key0: KeyDigit0, + glfw.Key1: KeyDigit1, + glfw.Key2: KeyDigit2, + glfw.Key3: KeyDigit3, + glfw.Key4: KeyDigit4, + glfw.Key5: KeyDigit5, + glfw.Key6: KeyDigit6, + glfw.Key7: KeyDigit7, + glfw.Key8: KeyDigit8, + glfw.Key9: KeyDigit9, + glfw.KeyE: KeyE, + glfw.KeyEnd: KeyEnd, + glfw.KeyEnter: KeyEnter, + glfw.KeyEqual: KeyEqual, + glfw.KeyEscape: KeyEscape, + glfw.KeyF: KeyF, + glfw.KeyF1: KeyF1, + glfw.KeyF10: KeyF10, + glfw.KeyF11: KeyF11, + glfw.KeyF12: KeyF12, + glfw.KeyF13: KeyF13, + glfw.KeyF14: KeyF14, + glfw.KeyF15: KeyF15, + glfw.KeyF16: KeyF16, + glfw.KeyF17: KeyF17, + glfw.KeyF18: KeyF18, + glfw.KeyF19: KeyF19, + glfw.KeyF2: KeyF2, + glfw.KeyF20: KeyF20, + glfw.KeyF21: KeyF21, + glfw.KeyF22: KeyF22, + glfw.KeyF23: KeyF23, + glfw.KeyF24: KeyF24, + glfw.KeyF3: KeyF3, + glfw.KeyF4: KeyF4, + glfw.KeyF5: KeyF5, + glfw.KeyF6: KeyF6, + glfw.KeyF7: KeyF7, + glfw.KeyF8: KeyF8, + glfw.KeyF9: KeyF9, + glfw.KeyG: KeyG, + glfw.KeyH: KeyH, + glfw.KeyHome: KeyHome, + glfw.KeyI: KeyI, + glfw.KeyInsert: KeyInsert, + glfw.KeyWorld1: KeyIntlBackslash, + glfw.KeyJ: KeyJ, + glfw.KeyK: KeyK, + glfw.KeyL: KeyL, + glfw.KeyM: KeyM, + glfw.KeyLeftSuper: KeyMetaLeft, + glfw.KeyRightSuper: KeyMetaRight, + glfw.KeyMinus: KeyMinus, + glfw.KeyN: KeyN, + glfw.KeyNumLock: KeyNumLock, + glfw.KeyKP0: KeyNumpad0, + glfw.KeyKP1: KeyNumpad1, + glfw.KeyKP2: KeyNumpad2, + glfw.KeyKP3: KeyNumpad3, + glfw.KeyKP4: KeyNumpad4, + glfw.KeyKP5: KeyNumpad5, + glfw.KeyKP6: KeyNumpad6, + glfw.KeyKP7: KeyNumpad7, + glfw.KeyKP8: KeyNumpad8, + glfw.KeyKP9: KeyNumpad9, + glfw.KeyKPAdd: KeyNumpadAdd, + glfw.KeyKPDecimal: KeyNumpadDecimal, + glfw.KeyKPDivide: KeyNumpadDivide, + glfw.KeyKPEnter: KeyNumpadEnter, + glfw.KeyKPEqual: KeyNumpadEqual, + glfw.KeyKPMultiply: KeyNumpadMultiply, + glfw.KeyKPSubtract: KeyNumpadSubtract, + glfw.KeyO: KeyO, + glfw.KeyP: KeyP, + glfw.KeyPageDown: KeyPageDown, + glfw.KeyPageUp: KeyPageUp, + glfw.KeyPause: KeyPause, + glfw.KeyPeriod: KeyPeriod, + glfw.KeyPrintScreen: KeyPrintScreen, + glfw.KeyQ: KeyQ, + glfw.KeyApostrophe: KeyQuote, + glfw.KeyR: KeyR, + glfw.KeyS: KeyS, + glfw.KeyScrollLock: KeyScrollLock, + glfw.KeySemicolon: KeySemicolon, + glfw.KeyLeftShift: KeyShiftLeft, + glfw.KeyRightShift: KeyShiftRight, + glfw.KeySlash: KeySlash, + glfw.KeySpace: KeySpace, + glfw.KeyT: KeyT, + glfw.KeyTab: KeyTab, + glfw.KeyU: KeyU, + glfw.KeyV: KeyV, + glfw.KeyW: KeyW, + glfw.KeyX: KeyX, + glfw.KeyY: KeyY, + glfw.KeyZ: KeyZ, +}