mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2025-09-26 20:11:28 +08:00
internal/ui: update key/mousebutton states at event handlers instead of updateInputStateImpl
This is a preparation for more precise key state detections and asynchronous event handlers. Updates #1704 Updates #3249
This commit is contained in:
@@ -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}}
|
||||
|
@@ -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
|
||||
|
@@ -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,
|
||||
}
|
||||
|
Reference in New Issue
Block a user