keystate.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Copyright 2016 The G3N Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package window
  5. import "github.com/g3n/engine/core"
  6. // KeyState keeps track of the state of all keys.
  7. type KeyState struct {
  8. win core.IDispatcher
  9. states map[Key]bool
  10. }
  11. // NewKeyState returns a new KeyState object.
  12. func NewKeyState(win core.IDispatcher) *KeyState {
  13. ks := new(KeyState)
  14. ks.win = win
  15. ks.states = map[Key]bool{
  16. KeyUnknown: false,
  17. KeySpace: false,
  18. KeyApostrophe: false,
  19. KeyComma: false,
  20. KeyMinus: false,
  21. KeyPeriod: false,
  22. KeySlash: false,
  23. Key0: false,
  24. Key1: false,
  25. Key2: false,
  26. Key3: false,
  27. Key4: false,
  28. Key5: false,
  29. Key6: false,
  30. Key7: false,
  31. Key8: false,
  32. Key9: false,
  33. KeySemicolon: false,
  34. KeyEqual: false,
  35. KeyA: false,
  36. KeyB: false,
  37. KeyC: false,
  38. KeyD: false,
  39. KeyE: false,
  40. KeyF: false,
  41. KeyG: false,
  42. KeyH: false,
  43. KeyI: false,
  44. KeyJ: false,
  45. KeyK: false,
  46. KeyL: false,
  47. KeyM: false,
  48. KeyN: false,
  49. KeyO: false,
  50. KeyP: false,
  51. KeyQ: false,
  52. KeyR: false,
  53. KeyS: false,
  54. KeyT: false,
  55. KeyU: false,
  56. KeyV: false,
  57. KeyW: false,
  58. KeyX: false,
  59. KeyY: false,
  60. KeyZ: false,
  61. KeyLeftBracket: false,
  62. KeyBackslash: false,
  63. KeyRightBracket: false,
  64. KeyGraveAccent: false,
  65. KeyWorld1: false,
  66. KeyWorld2: false,
  67. KeyEscape: false,
  68. KeyEnter: false,
  69. KeyTab: false,
  70. KeyBackspace: false,
  71. KeyInsert: false,
  72. KeyDelete: false,
  73. KeyRight: false,
  74. KeyLeft: false,
  75. KeyDown: false,
  76. KeyUp: false,
  77. KeyPageUp: false,
  78. KeyPageDown: false,
  79. KeyHome: false,
  80. KeyEnd: false,
  81. KeyCapsLock: false,
  82. KeyScrollLock: false,
  83. KeyNumLock: false,
  84. KeyPrintScreen: false,
  85. KeyPause: false,
  86. KeyF1: false,
  87. KeyF2: false,
  88. KeyF3: false,
  89. KeyF4: false,
  90. KeyF5: false,
  91. KeyF6: false,
  92. KeyF7: false,
  93. KeyF8: false,
  94. KeyF9: false,
  95. KeyF10: false,
  96. KeyF11: false,
  97. KeyF12: false,
  98. KeyF13: false,
  99. KeyF14: false,
  100. KeyF15: false,
  101. KeyF16: false,
  102. KeyF17: false,
  103. KeyF18: false,
  104. KeyF19: false,
  105. KeyF20: false,
  106. KeyF21: false,
  107. KeyF22: false,
  108. KeyF23: false,
  109. KeyF24: false,
  110. KeyF25: false,
  111. KeyKP0: false,
  112. KeyKP1: false,
  113. KeyKP2: false,
  114. KeyKP3: false,
  115. KeyKP4: false,
  116. KeyKP5: false,
  117. KeyKP6: false,
  118. KeyKP7: false,
  119. KeyKP8: false,
  120. KeyKP9: false,
  121. KeyKPDecimal: false,
  122. KeyKPDivide: false,
  123. KeyKPMultiply: false,
  124. KeyKPSubtract: false,
  125. KeyKPAdd: false,
  126. KeyKPEnter: false,
  127. KeyKPEqual: false,
  128. KeyLeftShift: false,
  129. KeyLeftControl: false,
  130. KeyLeftAlt: false,
  131. KeyLeftSuper: false,
  132. KeyRightShift: false,
  133. KeyRightControl: false,
  134. KeyRightAlt: false,
  135. KeyRightSuper: false,
  136. KeyMenu: false,
  137. }
  138. // Subscribe to window key events
  139. ks.win.SubscribeID(OnKeyUp, &ks, ks.onKey)
  140. ks.win.SubscribeID(OnKeyDown, &ks, ks.onKey)
  141. return ks
  142. }
  143. // Dispose unsubscribes from the window events.
  144. func (ks *KeyState) Dispose() {
  145. ks.win.UnsubscribeID(OnKeyUp, &ks)
  146. ks.win.UnsubscribeID(OnKeyDown, &ks)
  147. }
  148. // Pressed returns whether the specified key is currently pressed.
  149. func (ks *KeyState) Pressed(k Key) bool {
  150. return ks.states[k]
  151. }
  152. // onKey receives key events and updates the internal map of states.
  153. func (ks *KeyState) onKey(evname string, ev interface{}) {
  154. kev := ev.(*KeyEvent)
  155. switch evname {
  156. case OnKeyUp:
  157. ks.states[kev.Key] = false
  158. case OnKeyDown:
  159. ks.states[kev.Key] = true
  160. }
  161. }