|
@@ -0,0 +1,172 @@
|
|
|
|
|
+package application
|
|
|
|
|
+
|
|
|
|
|
+import (
|
|
|
|
|
+ "github.com/g3n/engine/window"
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+// KeyState keeps track of the state of all keys.
|
|
|
|
|
+type KeyState struct {
|
|
|
|
|
+ win window.IWindow
|
|
|
|
|
+ states map[window.Key]bool
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// NewKeyState returns a new KeyState object.
|
|
|
|
|
+func NewKeyState(win window.IWindow) *KeyState {
|
|
|
|
|
+
|
|
|
|
|
+ ks := new(KeyState)
|
|
|
|
|
+ ks.win = win
|
|
|
|
|
+ ks.states = map[window.Key]bool{
|
|
|
|
|
+ window.KeyUnknown : false,
|
|
|
|
|
+ window.KeySpace : false,
|
|
|
|
|
+ window.KeyApostrophe : false,
|
|
|
|
|
+ window.KeyComma : false,
|
|
|
|
|
+ window.KeyMinus : false,
|
|
|
|
|
+ window.KeyPeriod : false,
|
|
|
|
|
+ window.KeySlash : false,
|
|
|
|
|
+ window.Key0 : false,
|
|
|
|
|
+ window.Key1 : false,
|
|
|
|
|
+ window.Key2 : false,
|
|
|
|
|
+ window.Key3 : false,
|
|
|
|
|
+ window.Key4 : false,
|
|
|
|
|
+ window.Key5 : false,
|
|
|
|
|
+ window.Key6 : false,
|
|
|
|
|
+ window.Key7 : false,
|
|
|
|
|
+ window.Key8 : false,
|
|
|
|
|
+ window.Key9 : false,
|
|
|
|
|
+ window.KeySemicolon : false,
|
|
|
|
|
+ window.KeyEqual : false,
|
|
|
|
|
+ window.KeyA : false,
|
|
|
|
|
+ window.KeyB : false,
|
|
|
|
|
+ window.KeyC : false,
|
|
|
|
|
+ window.KeyD : false,
|
|
|
|
|
+ window.KeyE : false,
|
|
|
|
|
+ window.KeyF : false,
|
|
|
|
|
+ window.KeyG : false,
|
|
|
|
|
+ window.KeyH : false,
|
|
|
|
|
+ window.KeyI : false,
|
|
|
|
|
+ window.KeyJ : false,
|
|
|
|
|
+ window.KeyK : false,
|
|
|
|
|
+ window.KeyL : false,
|
|
|
|
|
+ window.KeyM : false,
|
|
|
|
|
+ window.KeyN : false,
|
|
|
|
|
+ window.KeyO : false,
|
|
|
|
|
+ window.KeyP : false,
|
|
|
|
|
+ window.KeyQ : false,
|
|
|
|
|
+ window.KeyR : false,
|
|
|
|
|
+ window.KeyS : false,
|
|
|
|
|
+ window.KeyT : false,
|
|
|
|
|
+ window.KeyU : false,
|
|
|
|
|
+ window.KeyV : false,
|
|
|
|
|
+ window.KeyW : false,
|
|
|
|
|
+ window.KeyX : false,
|
|
|
|
|
+ window.KeyY : false,
|
|
|
|
|
+ window.KeyZ : false,
|
|
|
|
|
+ window.KeyLeftBracket : false,
|
|
|
|
|
+ window.KeyBackslash : false,
|
|
|
|
|
+ window.KeyRightBracket : false,
|
|
|
|
|
+ window.KeyGraveAccent : false,
|
|
|
|
|
+ window.KeyWorld1 : false,
|
|
|
|
|
+ window.KeyWorld2 : false,
|
|
|
|
|
+ window.KeyEscape : false,
|
|
|
|
|
+ window.KeyEnter : false,
|
|
|
|
|
+ window.KeyTab : false,
|
|
|
|
|
+ window.KeyBackspace : false,
|
|
|
|
|
+ window.KeyInsert : false,
|
|
|
|
|
+ window.KeyDelete : false,
|
|
|
|
|
+ window.KeyRight : false,
|
|
|
|
|
+ window.KeyLeft : false,
|
|
|
|
|
+ window.KeyDown : false,
|
|
|
|
|
+ window.KeyUp : false,
|
|
|
|
|
+ window.KeyPageUp : false,
|
|
|
|
|
+ window.KeyPageDown : false,
|
|
|
|
|
+ window.KeyHome : false,
|
|
|
|
|
+ window.KeyEnd : false,
|
|
|
|
|
+ window.KeyCapsLock : false,
|
|
|
|
|
+ window.KeyScrollLock : false,
|
|
|
|
|
+ window.KeyNumLock : false,
|
|
|
|
|
+ window.KeyPrintScreen : false,
|
|
|
|
|
+ window.KeyPause : false,
|
|
|
|
|
+ window.KeyF1 : false,
|
|
|
|
|
+ window.KeyF2 : false,
|
|
|
|
|
+ window.KeyF3 : false,
|
|
|
|
|
+ window.KeyF4 : false,
|
|
|
|
|
+ window.KeyF5 : false,
|
|
|
|
|
+ window.KeyF6 : false,
|
|
|
|
|
+ window.KeyF7 : false,
|
|
|
|
|
+ window.KeyF8 : false,
|
|
|
|
|
+ window.KeyF9 : false,
|
|
|
|
|
+ window.KeyF10 : false,
|
|
|
|
|
+ window.KeyF11 : false,
|
|
|
|
|
+ window.KeyF12 : false,
|
|
|
|
|
+ window.KeyF13 : false,
|
|
|
|
|
+ window.KeyF14 : false,
|
|
|
|
|
+ window.KeyF15 : false,
|
|
|
|
|
+ window.KeyF16 : false,
|
|
|
|
|
+ window.KeyF17 : false,
|
|
|
|
|
+ window.KeyF18 : false,
|
|
|
|
|
+ window.KeyF19 : false,
|
|
|
|
|
+ window.KeyF20 : false,
|
|
|
|
|
+ window.KeyF21 : false,
|
|
|
|
|
+ window.KeyF22 : false,
|
|
|
|
|
+ window.KeyF23 : false,
|
|
|
|
|
+ window.KeyF24 : false,
|
|
|
|
|
+ window.KeyF25 : false,
|
|
|
|
|
+ window.KeyKP0 : false,
|
|
|
|
|
+ window.KeyKP1 : false,
|
|
|
|
|
+ window.KeyKP2 : false,
|
|
|
|
|
+ window.KeyKP3 : false,
|
|
|
|
|
+ window.KeyKP4 : false,
|
|
|
|
|
+ window.KeyKP5 : false,
|
|
|
|
|
+ window.KeyKP6 : false,
|
|
|
|
|
+ window.KeyKP7 : false,
|
|
|
|
|
+ window.KeyKP8 : false,
|
|
|
|
|
+ window.KeyKP9 : false,
|
|
|
|
|
+ window.KeyKPDecimal : false,
|
|
|
|
|
+ window.KeyKPDivide : false,
|
|
|
|
|
+ window.KeyKPMultiply : false,
|
|
|
|
|
+ window.KeyKPSubtract : false,
|
|
|
|
|
+ window.KeyKPAdd : false,
|
|
|
|
|
+ window.KeyKPEnter : false,
|
|
|
|
|
+ window.KeyKPEqual : false,
|
|
|
|
|
+ window.KeyLeftShift : false,
|
|
|
|
|
+ window.KeyLeftControl : false,
|
|
|
|
|
+ window.KeyLeftAlt : false,
|
|
|
|
|
+ window.KeyLeftSuper : false,
|
|
|
|
|
+ window.KeyRightShift : false,
|
|
|
|
|
+ window.KeyRightControl : false,
|
|
|
|
|
+ window.KeyRightAlt : false,
|
|
|
|
|
+ window.KeyRightSuper : false,
|
|
|
|
|
+ window.KeyMenu : false,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Subscribe to window key events
|
|
|
|
|
+ ks.win.SubscribeID(window.OnKeyUp, &ks, ks.onKey)
|
|
|
|
|
+ ks.win.SubscribeID(window.OnKeyDown, &ks, ks.onKey)
|
|
|
|
|
+
|
|
|
|
|
+ return ks
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Dispose unsubscribes from the window events.
|
|
|
|
|
+func (ks *KeyState) Dispose() {
|
|
|
|
|
+
|
|
|
|
|
+ ks.win.UnsubscribeID(window.OnKeyUp, &ks)
|
|
|
|
|
+ ks.win.UnsubscribeID(window.OnKeyDown, &ks)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Pressed returns whether the specified key is currently pressed.
|
|
|
|
|
+func (ks *KeyState) Pressed(k window.Key) bool {
|
|
|
|
|
+
|
|
|
|
|
+ return ks.states[k]
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// onKey receives key events and updates the internal map of states.
|
|
|
|
|
+func (ks *KeyState) onKey(evname string, ev interface{}) {
|
|
|
|
|
+
|
|
|
|
|
+ kev := ev.(*window.KeyEvent)
|
|
|
|
|
+ switch evname {
|
|
|
|
|
+ case window.OnKeyUp:
|
|
|
|
|
+ ks.states[kev.Keycode] = false
|
|
|
|
|
+ case window.OnKeyDown:
|
|
|
|
|
+ ks.states[kev.Keycode] = true
|
|
|
|
|
+ }
|
|
|
|
|
+}
|