reflexion 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/application.cpp +37 -6
  3. data/.doc/ext/reflex/capture_event.cpp +1 -1
  4. data/.doc/ext/reflex/chase_constraint.cpp +1 -1
  5. data/.doc/ext/reflex/clipboard.cpp +1 -1
  6. data/.doc/ext/reflex/color_event.cpp +76 -0
  7. data/.doc/ext/reflex/color_picker.cpp +113 -0
  8. data/.doc/ext/reflex/constraint.cpp +1 -1
  9. data/.doc/ext/reflex/contact_event.cpp +1 -1
  10. data/.doc/ext/reflex/control_change_event.cpp +1 -1
  11. data/.doc/ext/reflex/device.cpp +1 -1
  12. data/.doc/ext/reflex/device_event.cpp +1 -1
  13. data/.doc/ext/reflex/draw_event.cpp +1 -1
  14. data/.doc/ext/reflex/ellipse_shape.cpp +1 -1
  15. data/.doc/ext/reflex/event.cpp +1 -1
  16. data/.doc/ext/reflex/file_dialog.cpp +181 -0
  17. data/.doc/ext/reflex/file_event.cpp +103 -0
  18. data/.doc/ext/reflex/filter.cpp +1 -1
  19. data/.doc/ext/reflex/focus_event.cpp +1 -1
  20. data/.doc/ext/reflex/frame_event.cpp +1 -1
  21. data/.doc/ext/reflex/gamepad.cpp +48 -0
  22. data/.doc/ext/reflex/image_view.cpp +1 -1
  23. data/.doc/ext/reflex/key_event.cpp +1 -274
  24. data/.doc/ext/reflex/line_shape.cpp +1 -1
  25. data/.doc/ext/reflex/link_constraint.cpp +1 -1
  26. data/.doc/ext/reflex/menu.cpp +6 -5
  27. data/.doc/ext/reflex/midi.cpp +9 -2
  28. data/.doc/ext/reflex/midi_event.cpp +1 -1
  29. data/.doc/ext/reflex/motion_event.cpp +1 -1
  30. data/.doc/ext/reflex/native.cpp +18 -6
  31. data/.doc/ext/reflex/note_event.cpp +1 -1
  32. data/.doc/ext/reflex/pin.cpp +1 -1
  33. data/.doc/ext/reflex/pointer.cpp +1 -1
  34. data/.doc/ext/reflex/pointer_event.cpp +2 -2
  35. data/.doc/ext/reflex/polygon_shape.cpp +1 -1
  36. data/.doc/ext/reflex/rect_shape.cpp +1 -1
  37. data/.doc/ext/reflex/reflex.cpp +566 -232
  38. data/.doc/ext/reflex/screen.cpp +27 -1
  39. data/.doc/ext/reflex/scroll_event.cpp +1 -1
  40. data/.doc/ext/reflex/selector.cpp +1 -1
  41. data/.doc/ext/reflex/shape.cpp +1 -1
  42. data/.doc/ext/reflex/snap_constraint.cpp +1 -1
  43. data/.doc/ext/reflex/style.cpp +1 -1
  44. data/.doc/ext/reflex/style_length.cpp +1 -1
  45. data/.doc/ext/reflex/text_event.cpp +104 -0
  46. data/.doc/ext/reflex/timer.cpp +1 -1
  47. data/.doc/ext/reflex/timer_event.cpp +1 -1
  48. data/.doc/ext/reflex/update_event.cpp +1 -1
  49. data/.doc/ext/reflex/view.cpp +110 -56
  50. data/.doc/ext/reflex/wheel_constraint.cpp +1 -1
  51. data/.doc/ext/reflex/wheel_event.cpp +1 -1
  52. data/.doc/ext/reflex/window.cpp +226 -17
  53. data/.github/workflows/release-gem.yml +2 -49
  54. data/.github/workflows/tag.yml +5 -28
  55. data/.github/workflows/test.yml +1 -37
  56. data/ChangeLog.md +54 -0
  57. data/Gemfile.lock +13 -8
  58. data/Rakefile +13 -2
  59. data/Reflex.podspec +2 -2
  60. data/VERSION +1 -1
  61. data/ext/reflex/application.cpp +41 -6
  62. data/ext/reflex/capture_event.cpp +1 -1
  63. data/ext/reflex/chase_constraint.cpp +1 -1
  64. data/ext/reflex/clipboard.cpp +1 -1
  65. data/ext/reflex/color_event.cpp +80 -0
  66. data/ext/reflex/color_picker.cpp +121 -0
  67. data/ext/reflex/constraint.cpp +1 -1
  68. data/ext/reflex/contact_event.cpp +1 -1
  69. data/ext/reflex/control_change_event.cpp +1 -1
  70. data/ext/reflex/device.cpp +1 -1
  71. data/ext/reflex/device_event.cpp +1 -1
  72. data/ext/reflex/draw_event.cpp +1 -1
  73. data/ext/reflex/ellipse_shape.cpp +1 -1
  74. data/ext/reflex/event.cpp +1 -1
  75. data/ext/reflex/extconf.rb +4 -2
  76. data/ext/reflex/file_dialog.cpp +194 -0
  77. data/ext/reflex/file_event.cpp +108 -0
  78. data/ext/reflex/filter.cpp +1 -1
  79. data/ext/reflex/focus_event.cpp +1 -1
  80. data/ext/reflex/frame_event.cpp +1 -1
  81. data/ext/reflex/gamepad.cpp +50 -0
  82. data/ext/reflex/image_view.cpp +1 -1
  83. data/ext/reflex/key_event.cpp +1 -275
  84. data/ext/reflex/line_shape.cpp +1 -1
  85. data/ext/reflex/link_constraint.cpp +1 -1
  86. data/ext/reflex/menu.cpp +8 -7
  87. data/ext/reflex/midi.cpp +11 -3
  88. data/ext/reflex/midi_event.cpp +1 -1
  89. data/ext/reflex/motion_event.cpp +1 -1
  90. data/ext/reflex/native.cpp +18 -6
  91. data/ext/reflex/note_event.cpp +1 -1
  92. data/ext/reflex/pin.cpp +1 -1
  93. data/ext/reflex/pointer.cpp +1 -1
  94. data/ext/reflex/pointer_event.cpp +2 -2
  95. data/ext/reflex/polygon_shape.cpp +1 -1
  96. data/ext/reflex/rect_shape.cpp +1 -1
  97. data/ext/reflex/reflex.cpp +568 -232
  98. data/ext/reflex/screen.cpp +31 -2
  99. data/ext/reflex/scroll_event.cpp +1 -1
  100. data/ext/reflex/selector.cpp +1 -1
  101. data/ext/reflex/selector.h +9 -9
  102. data/ext/reflex/shape.cpp +1 -1
  103. data/ext/reflex/snap_constraint.cpp +1 -1
  104. data/ext/reflex/style.cpp +1 -1
  105. data/ext/reflex/style_length.cpp +1 -1
  106. data/ext/reflex/text_event.cpp +111 -0
  107. data/ext/reflex/timer.cpp +1 -1
  108. data/ext/reflex/timer_event.cpp +1 -1
  109. data/ext/reflex/update_event.cpp +1 -1
  110. data/ext/reflex/view.cpp +121 -61
  111. data/ext/reflex/wheel_constraint.cpp +1 -1
  112. data/ext/reflex/wheel_event.cpp +1 -1
  113. data/ext/reflex/window.cpp +256 -25
  114. data/include/reflex/application.h +10 -0
  115. data/include/reflex/color_picker.h +65 -0
  116. data/include/reflex/event.h +178 -88
  117. data/include/reflex/file_dialog.h +73 -0
  118. data/include/reflex/gamepad.h +3 -0
  119. data/include/reflex/menu.h +3 -3
  120. data/include/reflex/midi.h +3 -0
  121. data/include/reflex/reflex.h +2 -0
  122. data/include/reflex/ruby/application.h +6 -1
  123. data/include/reflex/ruby/color_picker.h +89 -0
  124. data/include/reflex/ruby/event.h +62 -29
  125. data/include/reflex/ruby/file_dialog.h +89 -0
  126. data/include/reflex/ruby/gamepad.h +46 -0
  127. data/include/reflex/ruby/reflex.h +3 -0
  128. data/include/reflex/ruby/view.h +92 -44
  129. data/include/reflex/ruby/window.h +60 -1
  130. data/include/reflex/ruby.h +3 -0
  131. data/include/reflex/screen.h +11 -2
  132. data/include/reflex/view.h +28 -16
  133. data/include/reflex/window.h +40 -8
  134. data/include/reflex.h +3 -0
  135. data/lib/reflex/application.rb +5 -5
  136. data/lib/reflex/autoinit.rb +3 -1
  137. data/lib/reflex/button.rb +3 -3
  138. data/lib/reflex/color_event.rb +16 -0
  139. data/lib/reflex/color_picker.rb +45 -0
  140. data/lib/reflex/control_change_event.rb +17 -0
  141. data/lib/reflex/file_dialog.rb +70 -0
  142. data/lib/reflex/file_event.rb +37 -0
  143. data/lib/reflex/helper.rb +58 -7
  144. data/lib/reflex/key_event.rb +9 -4
  145. data/lib/reflex/menu.rb +17 -1
  146. data/lib/reflex/model.rb +19 -19
  147. data/lib/reflex/note_event.rb +1 -1
  148. data/lib/reflex/pointer.rb +14 -3
  149. data/lib/reflex/pointer_event.rb +12 -1
  150. data/lib/reflex/reflex.rb +5 -0
  151. data/lib/reflex/shape.rb +14 -14
  152. data/lib/reflex/style.rb +16 -16
  153. data/lib/reflex/text_event.rb +40 -0
  154. data/lib/reflex/timer.rb +3 -3
  155. data/lib/reflex/view.rb +29 -14
  156. data/lib/reflex/wheel_event.rb +12 -3
  157. data/lib/reflex/window.rb +25 -13
  158. data/lib/reflex.rb +8 -2
  159. data/reflex.gemspec +4 -4
  160. data/samples/ime.rb +100 -0
  161. data/samples/ios/hello/hello.xcodeproj/project.pbxproj +236 -224
  162. data/samples/menu.rb +4 -1
  163. data/samples/model.rb +3 -3
  164. data/samples/test/alert.rb +93 -0
  165. data/samples/test/always_on.rb +76 -0
  166. data/samples/test/app_background.rb +51 -0
  167. data/samples/test/boundary.rb +75 -0
  168. data/samples/test/callback_exception.rb +101 -0
  169. data/samples/test/cancel.rb +53 -0
  170. data/samples/test/color_picker.rb +63 -0
  171. data/samples/test/file_dialog.rb +102 -0
  172. data/samples/window_style.rb +156 -0
  173. data/src/application.cpp +159 -18
  174. data/src/application.h +92 -7
  175. data/src/color_picker.cpp +113 -0
  176. data/src/color_picker.h +36 -0
  177. data/src/event.cpp +410 -252
  178. data/src/event.h +12 -0
  179. data/src/file_dialog.cpp +163 -0
  180. data/src/file_dialog.h +52 -0
  181. data/src/gamepad.cpp +42 -5
  182. data/src/gamepad.h +4 -0
  183. data/src/ios/app_delegate.mm +5 -3
  184. data/src/ios/application.mm +24 -0
  185. data/src/ios/color_picker.mm +19 -0
  186. data/src/ios/file_dialog.mm +21 -0
  187. data/src/ios/gamepad.mm +4 -4
  188. data/src/ios/menu.mm +5 -0
  189. data/src/ios/reflex.mm +8 -0
  190. data/src/ios/screen.mm +26 -0
  191. data/src/ios/view_controller.mm +2 -30
  192. data/src/ios/window.mm +38 -9
  193. data/src/menu.cpp +66 -4
  194. data/src/menu.h +17 -1
  195. data/src/midi.cpp +61 -31
  196. data/src/osx/app_delegate.h +4 -0
  197. data/src/osx/app_delegate.mm +102 -22
  198. data/src/osx/application.mm +88 -6
  199. data/src/osx/color_picker.mm +112 -0
  200. data/src/osx/event.h +10 -0
  201. data/src/osx/event.mm +84 -30
  202. data/src/osx/file_dialog.mm +168 -0
  203. data/src/osx/gamepad.mm +2 -2
  204. data/src/osx/gamepad_hid.mm +1 -1
  205. data/src/osx/menu.mm +177 -33
  206. data/src/osx/native_window.h +16 -2
  207. data/src/osx/native_window.mm +114 -57
  208. data/src/osx/opengl_view.h +2 -1
  209. data/src/osx/opengl_view.mm +184 -43
  210. data/src/osx/reflex.mm +38 -0
  211. data/src/osx/screen.mm +36 -0
  212. data/src/osx/window.mm +106 -24
  213. data/src/pointer.cpp +13 -4
  214. data/src/pointer.h +4 -0
  215. data/src/rays.h +46 -0
  216. data/src/sdl/application.cpp +68 -8
  217. data/src/sdl/color_picker.cpp +18 -0
  218. data/src/sdl/event.cpp +24 -3
  219. data/src/sdl/event.h +12 -0
  220. data/src/sdl/file_dialog.cpp +20 -0
  221. data/src/sdl/gamepad.cpp +3 -7
  222. data/src/sdl/menu.cpp +5 -0
  223. data/src/sdl/reflex.cpp +20 -0
  224. data/src/sdl/screen.cpp +36 -0
  225. data/src/sdl/window.cpp +142 -29
  226. data/src/shape.cpp +15 -10
  227. data/src/view.cpp +287 -198
  228. data/src/view.h +4 -2
  229. data/src/vk.h +416 -0
  230. data/src/win32/application.cpp +162 -12
  231. data/src/win32/application.h +20 -0
  232. data/src/win32/color_picker.cpp +82 -0
  233. data/src/win32/event.cpp +114 -12
  234. data/src/win32/event.h +21 -4
  235. data/src/win32/file_dialog.cpp +226 -0
  236. data/src/win32/gamepad.cpp +9 -2
  237. data/src/win32/menu.cpp +191 -53
  238. data/src/win32/menu.h +9 -1
  239. data/src/win32/opengl.cpp +2 -9
  240. data/src/win32/reflex.cpp +44 -3
  241. data/src/win32/screen.cpp +164 -3
  242. data/src/win32/screen.h +8 -0
  243. data/src/win32/tray.cpp +191 -0
  244. data/src/win32/tray.h +22 -0
  245. data/src/win32/vk.cpp +11 -0
  246. data/src/win32/window.cpp +809 -148
  247. data/src/win32/window.h +6 -0
  248. data/src/window.cpp +718 -185
  249. data/src/window.h +66 -33
  250. data/src/world.cpp +9 -1
  251. data/test/helper.rb +17 -0
  252. data/test/test_application.rb +90 -1
  253. data/test/test_chase_constraint.rb +1 -3
  254. data/test/test_color_event.rb +36 -0
  255. data/test/test_color_picker.rb +62 -0
  256. data/test/test_constraint.rb +2 -4
  257. data/test/test_event.rb +1 -1
  258. data/test/test_file_dialog.rb +48 -0
  259. data/test/test_file_event.rb +43 -0
  260. data/test/test_has_text_preedit.rb +54 -0
  261. data/test/test_key_event.rb +20 -5
  262. data/test/test_link_constraint.rb +1 -3
  263. data/test/test_menu.rb +40 -10
  264. data/test/test_pointer.rb +33 -23
  265. data/test/test_pointer_event.rb +24 -9
  266. data/test/test_reflex.rb +36 -0
  267. data/test/test_screen.rb +24 -2
  268. data/test/test_snap_constraint.rb +1 -3
  269. data/test/test_text_event.rb +54 -0
  270. data/test/test_view.rb +41 -4
  271. data/test/test_wheel_constraint.rb +1 -3
  272. data/test/test_wheel_event.rb +13 -5
  273. data/test/test_window.rb +196 -44
  274. metadata +80 -10
  275. data/.github/workflows/utils.rb +0 -127
data/src/view.h CHANGED
@@ -54,18 +54,20 @@ namespace Reflex
54
54
 
55
55
  void View_call_key_event (View* view, KeyEvent* event);
56
56
 
57
+ void View_call_text_event (View* view, TextEvent* event);
58
+
57
59
  void View_call_pointer_event (View* view, PointerEvent* event);
58
60
 
59
61
  void View_call_wheel_event (View* view, WheelEvent* event);
60
62
 
63
+ void View_call_contact_event (View* view, ContactEvent* event);
64
+
61
65
  void View_call_midi_event (View* view, MIDIEvent* event);
62
66
 
63
67
  void View_call_note_event (View* view, NoteEvent* event);
64
68
 
65
69
  void View_call_control_change_event (View* view, ControlChangeEvent* event);
66
70
 
67
- void View_call_contact_event (View* view, ContactEvent* event);
68
-
69
71
 
70
72
  }// Reflex
71
73
 
data/src/vk.h ADDED
@@ -0,0 +1,416 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __REFLEX_SRC_VK_H__
4
+ #define __REFLEX_SRC_VK_H__
5
+
6
+
7
+ #include <limits.h>
8
+ #include "reflex/defs.h"
9
+
10
+ #if defined(OSX)
11
+ #include <Carbon/Carbon.h>
12
+ #elif defined(IOS)
13
+ #import <UIKit/UIKit.h>
14
+ #elif defined(WIN32)
15
+ #include <windows.h>
16
+ #else
17
+ #include <SDL.h>
18
+ #endif
19
+
20
+
21
+ namespace Reflex
22
+ {
23
+
24
+
25
+ #define _NONE (INT_MIN + 0)
26
+ #define _SKIP (INT_MIN + 1)
27
+
28
+
29
+ struct NativeVK
30
+ {
31
+
32
+ int code;
33
+
34
+ friend constexpr bool operator == (int key, NativeVK native)
35
+ {
36
+ if (native.code == _SKIP) return true;
37
+ return native.code == _NONE ? key < 0 : key == native.code;
38
+ }
39
+
40
+ };// NativeVK
41
+
42
+
43
+ enum
44
+ {
45
+ kVK__NONE = _NONE,
46
+ UIKeyboardHIDUsage_NONE = _NONE,
47
+ UIKeyboardHIDUsage_SKIP = _SKIP,
48
+ VK__NONE = _NONE,
49
+ SDL_SCANCODE__NONE = _NONE,
50
+ };
51
+
52
+
53
+ #if defined(OSX)
54
+ #define VK(darwin, ios, win32, sdl) NativeVK {kVK_##darwin}
55
+ #elif defined(IOS)
56
+ #define VK(darwin, ios, win32, sdl) NativeVK {UIKeyboardHIDUsage##ios}
57
+ #elif defined(LINUX) || defined(WASM)
58
+ #define VK(darwin, ios, win32, sdl) NativeVK {SDL_SCANCODE_##sdl}
59
+ #elif defined(WIN32)
60
+ #define VK(darwin, ios, win32, sdl) NativeVK {VK_##win32}
61
+ #define VK_A 'A'
62
+ #define VK_B 'B'
63
+ #define VK_C 'C'
64
+ #define VK_D 'D'
65
+ #define VK_E 'E'
66
+ #define VK_F 'F'
67
+ #define VK_G 'G'
68
+ #define VK_H 'H'
69
+ #define VK_I 'I'
70
+ #define VK_J 'J'
71
+ #define VK_K 'K'
72
+ #define VK_L 'L'
73
+ #define VK_M 'M'
74
+ #define VK_N 'N'
75
+ #define VK_O 'O'
76
+ #define VK_P 'P'
77
+ #define VK_Q 'Q'
78
+ #define VK_R 'R'
79
+ #define VK_S 'S'
80
+ #define VK_T 'T'
81
+ #define VK_U 'U'
82
+ #define VK_V 'V'
83
+ #define VK_W 'W'
84
+ #define VK_X 'X'
85
+ #define VK_Y 'Y'
86
+ #define VK_Z 'Z'
87
+ #define VK_0 '0'
88
+ #define VK_1 '1'
89
+ #define VK_2 '2'
90
+ #define VK_3 '3'
91
+ #define VK_4 '4'
92
+ #define VK_5 '5'
93
+ #define VK_6 '6'
94
+ #define VK_7 '7'
95
+ #define VK_8 '8'
96
+ #define VK_9 '9'
97
+ #else
98
+ #error unknown platform
99
+ #endif
100
+
101
+ static_assert(KEY_A == VK(ANSI_A, KeyboardA, A, A));
102
+ static_assert(KEY_B == VK(ANSI_B, KeyboardB, B, B));
103
+ static_assert(KEY_C == VK(ANSI_C, KeyboardC, C, C));
104
+ static_assert(KEY_D == VK(ANSI_D, KeyboardD, D, D));
105
+ static_assert(KEY_E == VK(ANSI_E, KeyboardE, E, E));
106
+ static_assert(KEY_F == VK(ANSI_F, KeyboardF, F, F));
107
+ static_assert(KEY_G == VK(ANSI_G, KeyboardG, G, G));
108
+ static_assert(KEY_H == VK(ANSI_H, KeyboardH, H, H));
109
+ static_assert(KEY_I == VK(ANSI_I, KeyboardI, I, I));
110
+ static_assert(KEY_J == VK(ANSI_J, KeyboardJ, J, J));
111
+ static_assert(KEY_K == VK(ANSI_K, KeyboardK, K, K));
112
+ static_assert(KEY_L == VK(ANSI_L, KeyboardL, L, L));
113
+ static_assert(KEY_M == VK(ANSI_M, KeyboardM, M, M));
114
+ static_assert(KEY_N == VK(ANSI_N, KeyboardN, N, N));
115
+ static_assert(KEY_O == VK(ANSI_O, KeyboardO, O, O));
116
+ static_assert(KEY_P == VK(ANSI_P, KeyboardP, P, P));
117
+ static_assert(KEY_Q == VK(ANSI_Q, KeyboardQ, Q, Q));
118
+ static_assert(KEY_R == VK(ANSI_R, KeyboardR, R, R));
119
+ static_assert(KEY_S == VK(ANSI_S, KeyboardS, S, S));
120
+ static_assert(KEY_T == VK(ANSI_T, KeyboardT, T, T));
121
+ static_assert(KEY_U == VK(ANSI_U, KeyboardU, U, U));
122
+ static_assert(KEY_V == VK(ANSI_V, KeyboardV, V, V));
123
+ static_assert(KEY_W == VK(ANSI_W, KeyboardW, W, W));
124
+ static_assert(KEY_X == VK(ANSI_X, KeyboardX, X, X));
125
+ static_assert(KEY_Y == VK(ANSI_Y, KeyboardY, Y, Y));
126
+ static_assert(KEY_Z == VK(ANSI_Z, KeyboardZ, Z, Z));
127
+
128
+ static_assert(KEY_0 == VK(ANSI_0, Keyboard0, 0, 0));
129
+ static_assert(KEY_1 == VK(ANSI_1, Keyboard1, 1, 1));
130
+ static_assert(KEY_2 == VK(ANSI_2, Keyboard2, 2, 2));
131
+ static_assert(KEY_3 == VK(ANSI_3, Keyboard3, 3, 3));
132
+ static_assert(KEY_4 == VK(ANSI_4, Keyboard4, 4, 4));
133
+ static_assert(KEY_5 == VK(ANSI_5, Keyboard5, 5, 5));
134
+ static_assert(KEY_6 == VK(ANSI_6, Keyboard6, 6, 6));
135
+ static_assert(KEY_7 == VK(ANSI_7, Keyboard7, 7, 7));
136
+ static_assert(KEY_8 == VK(ANSI_8, Keyboard8, 8, 8));
137
+ static_assert(KEY_9 == VK(ANSI_9, Keyboard9, 9, 9));
138
+
139
+ static_assert(KEY_MINUS == VK(ANSI_Minus, KeyboardHyphen, OEM_MINUS, MINUS));
140
+ static_assert(KEY_EQUAL == VK(ANSI_Equal, KeyboardEqualSign, OEM_PLUS, EQUALS));
141
+ static_assert(KEY_COMMA == VK(ANSI_Comma, KeyboardComma, OEM_COMMA, COMMA));
142
+ static_assert(KEY_PERIOD == VK(ANSI_Period, KeyboardPeriod, OEM_PERIOD, PERIOD));
143
+ static_assert(KEY_SEMICOLON == VK(ANSI_Semicolon, KeyboardSemicolon, OEM_1, SEMICOLON));
144
+ static_assert(KEY_QUOTE == VK(ANSI_Quote, KeyboardQuote, OEM_7, APOSTROPHE));
145
+ static_assert(KEY_SLASH == VK(ANSI_Slash, KeyboardSlash, OEM_2, SLASH));
146
+ static_assert(KEY_BACKSLASH == VK(ANSI_Backslash, KeyboardBackslash, OEM_5, BACKSLASH));
147
+ static_assert(KEY_UNDERSCORE == VK(JIS_Underscore, KeyboardInternational1, _NONE, INTERNATIONAL1));
148
+ static_assert(KEY_GRAVE == VK(ANSI_Grave, KeyboardGraveAccentAndTilde, OEM_3, GRAVE));
149
+ static_assert(KEY_YEN == VK(JIS_Yen, KeyboardInternational3, _NONE, INTERNATIONAL3));
150
+ static_assert(KEY_LBRACKET == VK(ANSI_LeftBracket, KeyboardOpenBracket, OEM_4, LEFTBRACKET));
151
+ static_assert(KEY_RBRACKET == VK(ANSI_RightBracket, KeyboardCloseBracket, OEM_6, RIGHTBRACKET));
152
+
153
+ static_assert(KEY_ENTER == VK(Return, KeyboardReturnOrEnter, RETURN, RETURN));
154
+ static_assert(KEY_RETURN == VK(Return, KeyboardReturnOrEnter, RETURN, RETURN));
155
+ static_assert(KEY_SPACE == VK(Space, KeyboardSpacebar, SPACE, SPACE));
156
+ static_assert(KEY_TAB == VK(Tab, KeyboardTab, TAB, TAB));
157
+ static_assert(KEY_DELETE == VK(ForwardDelete, KeyboardDeleteForward, DELETE, DELETE));
158
+ static_assert(KEY_BACKSPACE == VK(Delete, KeyboardDeleteOrBackspace, BACK, BACKSPACE));
159
+ static_assert(KEY_INSERT == VK(_NONE, KeyboardInsert, INSERT, INSERT));
160
+ static_assert(KEY_ESCAPE == VK(Escape, KeyboardEscape, ESCAPE, ESCAPE));
161
+
162
+ static_assert(KEY_LEFT == VK(LeftArrow, KeyboardLeftArrow, LEFT, LEFT));
163
+ static_assert(KEY_RIGHT == VK(RightArrow, KeyboardRightArrow, RIGHT, RIGHT));
164
+ static_assert(KEY_UP == VK(UpArrow, KeyboardUpArrow, UP, UP));
165
+ static_assert(KEY_DOWN == VK(DownArrow, KeyboardDownArrow, DOWN, DOWN));
166
+ static_assert(KEY_HOME == VK(Home, KeyboardHome, HOME, HOME));
167
+ static_assert(KEY_END == VK(End, KeyboardEnd, END, END));
168
+ static_assert(KEY_PAGEUP == VK(PageUp, KeyboardPageUp, PRIOR, PAGEUP));
169
+ static_assert(KEY_PAGEDOWN == VK(PageDown, KeyboardPageDown, NEXT, PAGEDOWN));
170
+
171
+ static_assert(KEY_SHIFT == VK(Shift, KeyboardLeftShift, SHIFT, LSHIFT));
172
+ static_assert(KEY_LSHIFT == VK(Shift, KeyboardLeftShift, LSHIFT, LSHIFT));
173
+ static_assert(KEY_RSHIFT == VK(RightShift, KeyboardRightShift, RSHIFT, RSHIFT));
174
+ static_assert(KEY_CONTROL == VK(Control, KeyboardLeftControl, CONTROL, LCTRL));
175
+ static_assert(KEY_LCONTROL == VK(Control, KeyboardLeftControl, LCONTROL, LCTRL));
176
+ static_assert(KEY_RCONTROL == VK(RightControl, KeyboardRightControl, RCONTROL, RCTRL));
177
+ static_assert(KEY_ALT == VK(_NONE, KeyboardLeftAlt, MENU, LALT));
178
+ static_assert(KEY_LALT == VK(_NONE, KeyboardLeftAlt, LMENU, LALT));
179
+ static_assert(KEY_RALT == VK(_NONE, KeyboardRightAlt, RMENU, RALT));
180
+ static_assert(KEY_LWIN == VK(_NONE, KeyboardLeftGUI, LWIN, LGUI));
181
+ static_assert(KEY_RWIN == VK(_NONE, KeyboardRightGUI, RWIN, RGUI));
182
+ static_assert(KEY_COMMAND == VK(Command, KeyboardLeftGUI, _NONE, LGUI));
183
+ static_assert(KEY_LCOMMAND == VK(Command, KeyboardLeftGUI, _NONE, LGUI));
184
+ static_assert(KEY_RCOMMAND == VK(RightCommand, KeyboardRightGUI, _NONE, RGUI));
185
+ static_assert(KEY_OPTION == VK(Option, KeyboardLeftAlt, _NONE, LALT));
186
+ static_assert(KEY_LOPTION == VK(Option, KeyboardLeftAlt, _NONE, LALT));
187
+ static_assert(KEY_ROPTION == VK(RightOption, KeyboardRightAlt, _NONE, RALT));
188
+ static_assert(KEY_FUNCTION == VK(Function, _NONE, _NONE, _NONE));
189
+
190
+ static_assert(KEY_F1 == VK(F1, KeyboardF1, F1, F1));
191
+ static_assert(KEY_F2 == VK(F2, KeyboardF2, F2, F2));
192
+ static_assert(KEY_F3 == VK(F3, KeyboardF3, F3, F3));
193
+ static_assert(KEY_F4 == VK(F4, KeyboardF4, F4, F4));
194
+ static_assert(KEY_F5 == VK(F5, KeyboardF5, F5, F5));
195
+ static_assert(KEY_F6 == VK(F6, KeyboardF6, F6, F6));
196
+ static_assert(KEY_F7 == VK(F7, KeyboardF7, F7, F7));
197
+ static_assert(KEY_F8 == VK(F8, KeyboardF8, F8, F8));
198
+ static_assert(KEY_F9 == VK(F9, KeyboardF9, F9, F9));
199
+ static_assert(KEY_F10 == VK(F10, KeyboardF10, F10, F10));
200
+ static_assert(KEY_F11 == VK(F11, KeyboardF11, F11, F11));
201
+ static_assert(KEY_F12 == VK(F12, KeyboardF12, F12, F12));
202
+ static_assert(KEY_F13 == VK(F13, KeyboardF13, F13, F13));
203
+ static_assert(KEY_F14 == VK(F14, KeyboardF14, F14, F14));
204
+ static_assert(KEY_F15 == VK(F15, KeyboardF15, F15, F15));
205
+ static_assert(KEY_F16 == VK(F16, KeyboardF16, F16, F16));
206
+ static_assert(KEY_F17 == VK(F17, KeyboardF17, F17, F17));
207
+ static_assert(KEY_F18 == VK(F18, KeyboardF18, F18, F18));
208
+ static_assert(KEY_F19 == VK(F19, KeyboardF19, F19, F19));
209
+ static_assert(KEY_F20 == VK(F20, KeyboardF20, F20, F20));
210
+ static_assert(KEY_F21 == VK(_NONE, KeyboardF21, F21, F21));
211
+ static_assert(KEY_F22 == VK(_NONE, KeyboardF22, F22, F22));
212
+ static_assert(KEY_F23 == VK(_NONE, KeyboardF23, F23, F23));
213
+ static_assert(KEY_F24 == VK(_NONE, KeyboardF24, F24, F24));
214
+
215
+ static_assert(KEY_NUM_0 == VK(ANSI_Keypad0, Keypad0, NUMPAD0, KP_0));
216
+ static_assert(KEY_NUM_1 == VK(ANSI_Keypad1, Keypad1, NUMPAD1, KP_1));
217
+ static_assert(KEY_NUM_2 == VK(ANSI_Keypad2, Keypad2, NUMPAD2, KP_2));
218
+ static_assert(KEY_NUM_3 == VK(ANSI_Keypad3, Keypad3, NUMPAD3, KP_3));
219
+ static_assert(KEY_NUM_4 == VK(ANSI_Keypad4, Keypad4, NUMPAD4, KP_4));
220
+ static_assert(KEY_NUM_5 == VK(ANSI_Keypad5, Keypad5, NUMPAD5, KP_5));
221
+ static_assert(KEY_NUM_6 == VK(ANSI_Keypad6, Keypad6, NUMPAD6, KP_6));
222
+ static_assert(KEY_NUM_7 == VK(ANSI_Keypad7, Keypad7, NUMPAD7, KP_7));
223
+ static_assert(KEY_NUM_8 == VK(ANSI_Keypad8, Keypad8, NUMPAD8, KP_8));
224
+ static_assert(KEY_NUM_9 == VK(ANSI_Keypad9, Keypad9, NUMPAD9, KP_9));
225
+
226
+ static_assert(KEY_NUM_PLUS == VK(ANSI_KeypadPlus, KeypadPlus, ADD, KP_PLUS));
227
+ static_assert(KEY_NUM_MINUS == VK(ANSI_KeypadMinus, KeypadHyphen, SUBTRACT, KP_MINUS));
228
+ static_assert(KEY_NUM_MULTIPLY == VK(ANSI_KeypadMultiply, KeypadAsterisk, MULTIPLY, KP_MULTIPLY));
229
+ static_assert(KEY_NUM_DIVIDE == VK(ANSI_KeypadDivide, KeypadSlash, DIVIDE, KP_DIVIDE));
230
+ static_assert(KEY_NUM_EQUAL == VK(ANSI_KeypadEquals, KeypadEqualSign, _NONE, KP_EQUALS));
231
+ static_assert(KEY_NUM_PERIOD == VK(_NONE, KeypadPeriod, _NONE, KP_PERIOD));
232
+ static_assert(KEY_NUM_COMMA == VK(JIS_KeypadComma, KeypadComma, _NONE, KP_COMMA));
233
+ static_assert(KEY_NUM_DECIMAL == VK(ANSI_KeypadDecimal, _SKIP, DECIMAL, KP_DECIMAL));
234
+ static_assert(KEY_NUM_CLEAR == VK(ANSI_KeypadClear, KeypadNumLock, _NONE, NUMLOCKCLEAR));
235
+ static_assert(KEY_NUM_ENTER == VK(ANSI_KeypadEnter, KeypadEnter, _NONE, KP_ENTER));
236
+
237
+ static_assert(KEY_CAPSLOCK == VK(CapsLock, KeyboardCapsLock, CAPITAL, CAPSLOCK));
238
+ static_assert(KEY_NUMLOCK == VK(_NONE, KeypadNumLock, NUMLOCK, NUMLOCKCLEAR));
239
+ static_assert(KEY_SCROLLLOCK == VK(_NONE, KeyboardScrollLock, SCROLL, SCROLLLOCK));
240
+
241
+ static_assert(KEY_PRINTSCREEN == VK(_NONE, KeyboardPrintScreen, SNAPSHOT, PRINTSCREEN));
242
+ static_assert(KEY_PAUSE == VK(_NONE, KeyboardPause, PAUSE, PAUSE));
243
+ static_assert(KEY_BREAK == VK(_NONE, _NONE, _NONE, _NONE));
244
+ static_assert(KEY_SECTION == VK(ISO_Section, KeyboardNonUSBackslash, OEM_102, NONUSBACKSLASH));
245
+ static_assert(KEY_HELP == VK(Help, KeyboardHelp, HELP, HELP));
246
+
247
+ static_assert(KEY_EISU == VK(JIS_Eisu, KeyboardLANG1, _NONE, LANG1));
248
+ static_assert(KEY_KANA == VK(JIS_Kana, KeyboardLANG2, KANA, LANG2));
249
+ static_assert(KEY_KANJI == VK(_NONE, KeyboardLANG5, KANJI, LANG5));
250
+ static_assert(KEY_IME_ON == VK(_NONE, _NONE, IME_ON, _NONE));
251
+ static_assert(KEY_IME_OFF == VK(_NONE, _NONE, IME_OFF, _NONE));
252
+ static_assert(KEY_IME_MODECHANGE == VK(_NONE, _NONE, MODECHANGE, _NONE));
253
+ static_assert(KEY_CONVERT == VK(_NONE, _NONE, CONVERT, _NONE));
254
+ static_assert(KEY_NONCONVERT == VK(_NONE, _NONE, NONCONVERT, _NONE));
255
+ static_assert(KEY_ACCEPT == VK(_NONE, _NONE, ACCEPT, _NONE));
256
+ static_assert(KEY_PROCESS == VK(_NONE, _NONE, PROCESSKEY, _NONE));
257
+
258
+ static_assert(KEY_VOLUME_UP == VK(VolumeUp, KeyboardVolumeUp, VOLUME_UP, VOLUMEUP));
259
+ static_assert(KEY_VOLUME_DOWN == VK(VolumeDown, KeyboardVolumeDown, VOLUME_DOWN, VOLUMEDOWN));
260
+ static_assert(KEY_MUTE == VK(Mute, KeyboardMute, VOLUME_MUTE, MUTE));
261
+
262
+ static_assert(KEY_SLEEP == VK(_NONE, _SKIP, SLEEP, SLEEP));
263
+ static_assert(KEY_EXEC == VK(_NONE, KeyboardExecute, EXECUTE, EXECUTE));
264
+ static_assert(KEY_PRINT == VK(_NONE, _NONE, PRINT, _NONE));
265
+ static_assert(KEY_CONTEXT_MENU == VK(ContextualMenu, KeyboardApplication, APPS, APPLICATION));
266
+ static_assert(KEY_SELECT == VK(_NONE, KeyboardSelect, SELECT, SELECT));
267
+ static_assert(KEY_CLEAR == VK(_NONE, KeyboardClear, CLEAR, CLEAR));
268
+
269
+ static_assert(KEY_NAVIGATION_VIEW == VK(_NONE, _NONE, NAVIGATION_VIEW, _NONE));
270
+ static_assert(KEY_NAVIGATION_MENU == VK(_NONE, _NONE, NAVIGATION_MENU, _NONE));
271
+ static_assert(KEY_NAVIGATION_UP == VK(_NONE, _NONE, NAVIGATION_UP, _NONE));
272
+ static_assert(KEY_NAVIGATION_DOWN == VK(_NONE, _NONE, NAVIGATION_DOWN, _NONE));
273
+ static_assert(KEY_NAVIGATION_LEFT == VK(_NONE, _NONE, NAVIGATION_LEFT, _NONE));
274
+ static_assert(KEY_NAVIGATION_RIGHT == VK(_NONE, _NONE, NAVIGATION_RIGHT, _NONE));
275
+ static_assert(KEY_NAVIGATION_ACCEPT == VK(_NONE, _NONE, NAVIGATION_ACCEPT, _NONE));
276
+ static_assert(KEY_NAVIGATION_CANCEL == VK(_NONE, _NONE, NAVIGATION_CANCEL, _NONE));
277
+
278
+ static_assert(KEY_BROWSER_BACK == VK(_NONE, _SKIP, BROWSER_BACK, AC_BACK));
279
+ static_assert(KEY_BROWSER_FORWARD == VK(_NONE, _SKIP, BROWSER_FORWARD, AC_FORWARD));
280
+ static_assert(KEY_BROWSER_REFRESH == VK(_NONE, _SKIP, BROWSER_REFRESH, AC_REFRESH));
281
+ static_assert(KEY_BROWSER_STOP == VK(_NONE, _SKIP, BROWSER_STOP, AC_STOP));
282
+ static_assert(KEY_BROWSER_SEARCH == VK(_NONE, _SKIP, BROWSER_SEARCH, AC_SEARCH));
283
+ static_assert(KEY_BROWSER_FAVORITES == VK(_NONE, _SKIP, BROWSER_FAVORITES, AC_BOOKMARKS));
284
+ static_assert(KEY_BROWSER_HOME == VK(_NONE, _SKIP, BROWSER_HOME, AC_HOME));
285
+
286
+ static_assert(KEY_MEDIA_PREV_TRACK == VK(_NONE, _SKIP, MEDIA_PREV_TRACK, AUDIOPREV));
287
+ static_assert(KEY_MEDIA_NEXT_TRACK == VK(_NONE, _SKIP, MEDIA_NEXT_TRACK, AUDIONEXT));
288
+ static_assert(KEY_MEDIA_PLAY_PAUSE == VK(_NONE, _SKIP, MEDIA_PLAY_PAUSE, AUDIOPLAY));
289
+ static_assert(KEY_MEDIA_STOP == VK(_NONE, _SKIP, MEDIA_STOP, AUDIOSTOP));
290
+
291
+ static_assert(KEY_LAUNCH_MAIL == VK(_NONE, _SKIP, LAUNCH_MAIL, MAIL));
292
+ static_assert(KEY_LAUNCH_MEDIA_SELECT == VK(_NONE, _SKIP, LAUNCH_MEDIA_SELECT, MEDIASELECT));
293
+ static_assert(KEY_LAUNCH_APP1 == VK(_NONE, _SKIP, LAUNCH_APP1, APP1));
294
+ static_assert(KEY_LAUNCH_APP2 == VK(_NONE, _SKIP, LAUNCH_APP2, APP2));
295
+
296
+ static_assert(KEY_NONUSHASH == VK(_NONE, KeyboardNonUSPound, _NONE, NONUSHASH));
297
+ static_assert(KEY_POWER == VK(_NONE, KeyboardPower, _NONE, POWER));
298
+ static_assert(KEY_MENU == VK(_NONE, KeyboardMenu, _NONE, MENU));
299
+
300
+ static_assert(KEY_STOP == VK(_NONE, KeyboardStop, _NONE, STOP));
301
+ static_assert(KEY_AGAIN == VK(_NONE, KeyboardAgain, _NONE, AGAIN));
302
+ static_assert(KEY_UNDO == VK(_NONE, KeyboardUndo, _NONE, UNDO));
303
+ static_assert(KEY_CUT == VK(_NONE, KeyboardCut, _NONE, CUT));
304
+ static_assert(KEY_COPY == VK(_NONE, KeyboardCopy, _NONE, COPY));
305
+ static_assert(KEY_PASTE == VK(_NONE, KeyboardPaste, _NONE, PASTE));
306
+ static_assert(KEY_FIND == VK(_NONE, KeyboardFind, _NONE, FIND));
307
+
308
+ static_assert(KEY_NUM_EQUALSAS400 == VK(_NONE, KeypadEqualSignAS400, _NONE, KP_EQUALSAS400));
309
+
310
+ static_assert(KEY_INTERNATIONAL2 == VK(_NONE, KeyboardInternational2, _NONE, INTERNATIONAL2));
311
+ static_assert(KEY_INTERNATIONAL4 == VK(_NONE, KeyboardInternational4, _NONE, INTERNATIONAL4));
312
+ static_assert(KEY_INTERNATIONAL5 == VK(_NONE, KeyboardInternational5, _NONE, INTERNATIONAL5));
313
+ static_assert(KEY_INTERNATIONAL6 == VK(_NONE, KeyboardInternational6, _NONE, INTERNATIONAL6));
314
+ static_assert(KEY_INTERNATIONAL7 == VK(_NONE, KeyboardInternational7, _NONE, INTERNATIONAL7));
315
+ static_assert(KEY_INTERNATIONAL8 == VK(_NONE, KeyboardInternational8, _NONE, INTERNATIONAL8));
316
+ static_assert(KEY_INTERNATIONAL9 == VK(_NONE, KeyboardInternational9, _NONE, INTERNATIONAL9));
317
+
318
+ static_assert(KEY_LANG1 == VK(_NONE, KeyboardLANG1, _NONE, LANG1));
319
+ static_assert(KEY_LANG2 == VK(_NONE, KeyboardLANG2, _NONE, LANG2));
320
+ static_assert(KEY_LANG3 == VK(_NONE, KeyboardLANG3, _NONE, LANG3));
321
+ static_assert(KEY_LANG4 == VK(_NONE, KeyboardLANG4, _NONE, LANG4));
322
+ static_assert(KEY_LANG5 == VK(_NONE, KeyboardLANG5, _NONE, LANG5));
323
+ static_assert(KEY_LANG6 == VK(_NONE, KeyboardLANG6, _NONE, LANG6));
324
+ static_assert(KEY_LANG7 == VK(_NONE, KeyboardLANG7, _NONE, LANG7));
325
+ static_assert(KEY_LANG8 == VK(_NONE, KeyboardLANG8, _NONE, LANG8));
326
+ static_assert(KEY_LANG9 == VK(_NONE, KeyboardLANG9, _NONE, LANG9));
327
+
328
+ static_assert(KEY_ALTERASE == VK(_NONE, KeyboardAlternateErase, _NONE, ALTERASE));
329
+ static_assert(KEY_SYSREQ == VK(_NONE, KeyboardSysReqOrAttention, _NONE, SYSREQ));
330
+ static_assert(KEY_CANCEL == VK(_NONE, KeyboardCancel, _NONE, CANCEL));
331
+ static_assert(KEY_PRIOR == VK(_NONE, KeyboardPrior, _NONE, PRIOR));
332
+ static_assert(KEY_RETURN2 == VK(_NONE, KeyboardReturn, _NONE, RETURN2));
333
+ static_assert(KEY_SEPARATOR == VK(_NONE, KeyboardSeparator, _NONE, SEPARATOR));
334
+ static_assert(KEY_OUT == VK(_NONE, KeyboardOut, _NONE, OUT));
335
+ static_assert(KEY_OPER == VK(_NONE, KeyboardOper, _NONE, OPER));
336
+ static_assert(KEY_CLEARAGAIN == VK(_NONE, KeyboardClearOrAgain, _NONE, CLEARAGAIN));
337
+ static_assert(KEY_CRSEL == VK(_NONE, KeyboardCrSelOrProps, _NONE, CRSEL));
338
+ static_assert(KEY_EXSEL == VK(_NONE, KeyboardExSel, _NONE, EXSEL));
339
+
340
+ static_assert(KEY_NUM_00 == VK(_NONE, _SKIP, _NONE, KP_00));
341
+ static_assert(KEY_NUM_000 == VK(_NONE, _SKIP, _NONE, KP_000));
342
+ static_assert(KEY_THOUSANDSSEP == VK(_NONE, _SKIP, _NONE, THOUSANDSSEPARATOR));
343
+ static_assert(KEY_DECIMALSEP == VK(_NONE, _SKIP, _NONE, DECIMALSEPARATOR));
344
+ static_assert(KEY_CURRENCYUNIT == VK(_NONE, _SKIP, _NONE, CURRENCYUNIT));
345
+ static_assert(KEY_CURRENCYSUBUNIT == VK(_NONE, _SKIP, _NONE, CURRENCYSUBUNIT));
346
+ static_assert(KEY_NUM_LPAREN == VK(_NONE, _SKIP, _NONE, KP_LEFTPAREN));
347
+ static_assert(KEY_NUM_RPAREN == VK(_NONE, _SKIP, _NONE, KP_RIGHTPAREN));
348
+ static_assert(KEY_NUM_LBRACE == VK(_NONE, _SKIP, _NONE, KP_LEFTBRACE));
349
+ static_assert(KEY_NUM_RBRACE == VK(_NONE, _SKIP, _NONE, KP_RIGHTBRACE));
350
+ static_assert(KEY_NUM_TAB == VK(_NONE, _SKIP, _NONE, KP_TAB));
351
+ static_assert(KEY_NUM_BACKSPACE == VK(_NONE, _SKIP, _NONE, KP_BACKSPACE));
352
+ static_assert(KEY_NUM_A == VK(_NONE, _SKIP, _NONE, KP_A));
353
+ static_assert(KEY_NUM_B == VK(_NONE, _SKIP, _NONE, KP_B));
354
+ static_assert(KEY_NUM_C == VK(_NONE, _SKIP, _NONE, KP_C));
355
+ static_assert(KEY_NUM_D == VK(_NONE, _SKIP, _NONE, KP_D));
356
+ static_assert(KEY_NUM_E == VK(_NONE, _SKIP, _NONE, KP_E));
357
+ static_assert(KEY_NUM_F == VK(_NONE, _SKIP, _NONE, KP_F));
358
+ static_assert(KEY_NUM_XOR == VK(_NONE, _SKIP, _NONE, KP_XOR));
359
+ static_assert(KEY_NUM_POWER == VK(_NONE, _SKIP, _NONE, KP_POWER));
360
+ static_assert(KEY_NUM_PERCENT == VK(_NONE, _SKIP, _NONE, KP_PERCENT));
361
+ static_assert(KEY_NUM_LESS == VK(_NONE, _SKIP, _NONE, KP_LESS));
362
+ static_assert(KEY_NUM_GREATER == VK(_NONE, _SKIP, _NONE, KP_GREATER));
363
+ static_assert(KEY_NUM_AMPERSAND == VK(_NONE, _SKIP, _NONE, KP_AMPERSAND));
364
+ static_assert(KEY_NUM_DBLAMPERSAND == VK(_NONE, _SKIP, _NONE, KP_DBLAMPERSAND));
365
+ static_assert(KEY_NUM_VERTICALBAR == VK(_NONE, _SKIP, _NONE, KP_VERTICALBAR));
366
+ static_assert(KEY_NUM_DBLVERTICALBAR == VK(_NONE, _SKIP, _NONE, KP_DBLVERTICALBAR));
367
+ static_assert(KEY_NUM_COLON == VK(_NONE, _SKIP, _NONE, KP_COLON));
368
+ static_assert(KEY_NUM_HASH == VK(_NONE, _SKIP, _NONE, KP_HASH));
369
+ static_assert(KEY_NUM_SPACE == VK(_NONE, _SKIP, _NONE, KP_SPACE));
370
+ static_assert(KEY_NUM_AT == VK(_NONE, _SKIP, _NONE, KP_AT));
371
+ static_assert(KEY_NUM_EXCLAM == VK(_NONE, _SKIP, _NONE, KP_EXCLAM));
372
+ static_assert(KEY_NUM_MEMSTORE == VK(_NONE, _SKIP, _NONE, KP_MEMSTORE));
373
+ static_assert(KEY_NUM_MEMRECALL == VK(_NONE, _SKIP, _NONE, KP_MEMRECALL));
374
+ static_assert(KEY_NUM_MEMCLEAR == VK(_NONE, _SKIP, _NONE, KP_MEMCLEAR));
375
+ static_assert(KEY_NUM_MEMADD == VK(_NONE, _SKIP, _NONE, KP_MEMADD));
376
+ static_assert(KEY_NUM_MEMSUBTRACT == VK(_NONE, _SKIP, _NONE, KP_MEMSUBTRACT));
377
+ static_assert(KEY_NUM_MEMMULTIPLY == VK(_NONE, _SKIP, _NONE, KP_MEMMULTIPLY));
378
+ static_assert(KEY_NUM_MEMDIVIDE == VK(_NONE, _SKIP, _NONE, KP_MEMDIVIDE));
379
+ static_assert(KEY_NUM_PLUSMINUS == VK(_NONE, _SKIP, _NONE, KP_PLUSMINUS));
380
+ static_assert(KEY_NUM_CLEARENTRY == VK(_NONE, _SKIP, _NONE, KP_CLEARENTRY));
381
+ static_assert(KEY_NUM_BINARY == VK(_NONE, _SKIP, _NONE, KP_BINARY));
382
+ static_assert(KEY_NUM_OCTAL == VK(_NONE, _SKIP, _NONE, KP_OCTAL));
383
+ static_assert(KEY_NUM_HEXADECIMAL == VK(_NONE, _SKIP, _NONE, KP_HEXADECIMAL));
384
+
385
+ static_assert(KEY_MODE == VK(_NONE, _SKIP, _NONE, MODE));
386
+
387
+ static_assert(KEY_AUDIOMUTE == VK(_NONE, _SKIP, _NONE, AUDIOMUTE));
388
+ static_assert(KEY_WWW == VK(_NONE, _SKIP, _NONE, WWW));
389
+ static_assert(KEY_CALCULATOR == VK(_NONE, _SKIP, _NONE, CALCULATOR));
390
+ static_assert(KEY_COMPUTER == VK(_NONE, _SKIP, _NONE, COMPUTER));
391
+
392
+ static_assert(KEY_BRIGHTNESSDOWN == VK(_NONE, _SKIP, _NONE, BRIGHTNESSDOWN));
393
+ static_assert(KEY_BRIGHTNESSUP == VK(_NONE, _SKIP, _NONE, BRIGHTNESSUP));
394
+ static_assert(KEY_DISPLAYSWITCH == VK(_NONE, _SKIP, _NONE, DISPLAYSWITCH));
395
+ static_assert(KEY_KBDILLUMTOGGLE == VK(_NONE, _SKIP, _NONE, KBDILLUMTOGGLE));
396
+ static_assert(KEY_KBDILLUMDOWN == VK(_NONE, _SKIP, _NONE, KBDILLUMDOWN));
397
+ static_assert(KEY_KBDILLUMUP == VK(_NONE, _SKIP, _NONE, KBDILLUMUP));
398
+ static_assert(KEY_EJECT == VK(_NONE, _SKIP, _NONE, EJECT));
399
+
400
+ static_assert(KEY_AUDIOREWIND == VK(_NONE, _SKIP, _NONE, AUDIOREWIND));
401
+ static_assert(KEY_AUDIOFASTFORWARD == VK(_NONE, _SKIP, _NONE, AUDIOFASTFORWARD));
402
+
403
+ static_assert(KEY_SOFTLEFT == VK(_NONE, _SKIP, _NONE, SOFTLEFT));
404
+ static_assert(KEY_SOFTRIGHT == VK(_NONE, _SKIP, _NONE, SOFTRIGHT));
405
+ static_assert(KEY_CALL == VK(_NONE, _SKIP, _NONE, CALL));
406
+ static_assert(KEY_ENDCALL == VK(_NONE, _SKIP, _NONE, ENDCALL));
407
+
408
+ #undef VK
409
+ #undef _NONE
410
+ #undef _SKIP
411
+
412
+
413
+ }// Reflex
414
+
415
+
416
+ #endif//EOH
@@ -1,24 +1,151 @@
1
- #include "../application.h"
1
+ #include "application.h"
2
2
 
3
3
 
4
+ #include <vector>
4
5
  #include <xot/windows.h>
5
6
  #include "reflex/exception.h"
6
7
  #include "window.h"
8
+ #include "tray.h"
7
9
 
8
10
 
9
11
  namespace Reflex
10
12
  {
11
13
 
12
14
 
15
+ struct ApplicationData : public Application::Data
16
+ {
17
+
18
+ bool quit = false;
19
+
20
+ };// ApplicationData
21
+
22
+
23
+ static ApplicationData*
24
+ get_data (Application* app)
25
+ {
26
+ return (ApplicationData*) app->self.get();
27
+ }
28
+
13
29
  Application::Data*
14
30
  Application_create_data ()
15
31
  {
16
- return new Application::Data();
32
+ return new ApplicationData();
33
+ }
34
+
35
+ static std::wstring
36
+ get_app_executable_path ()
37
+ {
38
+ std::wstring path(MAX_PATH, L'\0');
39
+ while (true)
40
+ {
41
+ DWORD len = GetModuleFileNameW(NULL, &path[0], (DWORD) path.size());
42
+ if (len < path.size())
43
+ {
44
+ path.resize(len);
45
+ break;
46
+ }
47
+ path.resize(path.size() * 2);
48
+ }
49
+ return path;
50
+ }
51
+
52
+ static String
53
+ get_product_name (const wchar_t* path)
54
+ {
55
+ DWORD size = GetFileVersionInfoSizeW(path, NULL);
56
+ if (size == 0) return "";
57
+
58
+ std::vector<BYTE> info(size);
59
+ if (!GetFileVersionInfoW(path, 0, size, &info[0]))
60
+ return "";
61
+
62
+ struct Translation {WORD lang, codepage;};
63
+ Translation* translations = NULL;
64
+ UINT bytes = 0;
65
+ if (
66
+ !VerQueryValueW(
67
+ &info[0], L"\\VarFileInfo\\Translation", (void**) &translations, &bytes) ||
68
+ bytes < sizeof(Translation))
69
+ {
70
+ return "";
71
+ }
72
+
73
+ LANGID deflang = GetUserDefaultUILanguage();
74
+ const Translation* found = &translations[0];
75
+ for (size_t i = 0; i < bytes / sizeof(Translation); ++i)
76
+ {
77
+ const Translation& t = translations[i];
78
+ if (t.lang == deflang)
79
+ {
80
+ found = &t;
81
+ break;
82
+ }
83
+ if (
84
+ PRIMARYLANGID(t.lang) == PRIMARYLANGID(deflang) &&
85
+ found == &translations[0])
86
+ {
87
+ found = &t;
88
+ }
89
+ }
90
+
91
+ wchar_t key[64];
92
+ swprintf(
93
+ key, 64, L"\\StringFileInfo\\%04x%04x\\ProductName",
94
+ found->lang, found->codepage);
95
+
96
+ wchar_t* name = NULL;
97
+ if (!VerQueryValueW(&info[0], key, (void**) &name, &bytes) || bytes <= 1)
98
+ return "";
99
+
100
+ return String(name, wcslen(name));
101
+ }
102
+
103
+ String
104
+ Application_get_default_name ()
105
+ {
106
+ std::wstring path = get_app_executable_path();
107
+ if (path.empty())
108
+ return "";
109
+
110
+ String name = get_product_name(path.c_str());
111
+ if (!name.empty())
112
+ return name;
113
+
114
+ std::wstring file = path.substr(path.find_last_of(L"\\/") + 1);
115
+ size_t dot = file.find_last_of(L'.');
116
+ if (dot != std::wstring::npos) file.resize(dot);
117
+ return String(file.c_str(), file.size());
118
+ }
119
+
120
+ void
121
+ Application_stop (Application* app)
122
+ {
123
+ get_data(app)->quit = true;
17
124
  }
18
125
 
19
126
  void
20
127
  Application_set_menu (Application* app, Menu* menu)
21
128
  {
129
+ Tray_update_icon(app);
130
+ }
131
+
132
+ void
133
+ Application_set_background (Application* app, bool state)
134
+ {
135
+ Tray_update_icon(app);
136
+ }
137
+
138
+ void
139
+ Application_set_background_menu (Application* app, Menu* menu)
140
+ {
141
+ Tray_update_icon(app);
142
+ }
143
+
144
+ void
145
+ Application_quit_if_should ()
146
+ {
147
+ if (Application_should_quit(app()))
148
+ Application_call_quit(app());
22
149
  }
23
150
 
24
151
 
@@ -46,21 +173,34 @@ namespace Reflex
46
173
  void
47
174
  Application::start ()
48
175
  {
176
+ ApplicationData* self = get_data(this);
177
+ self->quit = false;
178
+ self->quitting = false;
179
+ self->started = false;
180
+ self->running = true;
181
+
182
+ Tray_update_icon(this);
183
+
49
184
  Event e;
50
- Application_call_start(this, &e);
185
+ Application_call_start_event(this, &e);
51
186
 
52
187
  timeBeginPeriod(1);
53
188
 
54
189
  double prev = get_time();
55
190
 
56
- MSG msg;
57
- while (true)
191
+ MSG msg = {0};
192
+ while (!self->quit)
58
193
  {
59
- if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
194
+ if (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE))
60
195
  {
61
- if (msg.message == WM_QUIT) break;
196
+ if (msg.message == WM_QUIT)
197
+ break;
198
+
199
+ if (Window_translate_accelerator(&msg))
200
+ continue;
201
+
62
202
  TranslateMessage(&msg);
63
- DispatchMessage(&msg);
203
+ DispatchMessageW(&msg);
64
204
  }
65
205
  else
66
206
  {
@@ -75,14 +215,24 @@ namespace Reflex
75
215
  continue;
76
216
  }
77
217
 
78
- update_all_windows(this);
218
+ // guarded here too, since rays can throw while drawing
219
+ Application_guard([&]()
220
+ {
221
+ update_all_windows(this);
222
+ });
79
223
  prev = now;
80
224
  }
81
225
  }
82
226
 
83
227
  timeEndPeriod(1);
84
228
 
85
- if (msg.wParam != 0)
229
+ self->running = false;
230
+
231
+ Tray_remove_icon();
232
+ Application_cleanup(this);
233
+ Application_throw_exception(this);
234
+
235
+ if (msg.message == WM_QUIT && msg.wParam != 0)
86
236
  reflex_error(__FILE__, __LINE__, "WM_QUIT with wParam %d.", msg.wParam);
87
237
  }
88
238
 
@@ -90,10 +240,10 @@ namespace Reflex
90
240
  Application::quit ()
91
241
  {
92
242
  Event e;
93
- Application_call_quit(this, &e);
243
+ Application_call_quit_event(this, &e);
94
244
  if (e.is_blocked()) return;
95
245
 
96
- PostQuitMessage(0);
246
+ Application_stop(this);
97
247
  }
98
248
 
99
249
  void
@@ -0,0 +1,20 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __REFLEX_SRC_WIN32_APPLICATION_H__
4
+ #define __REFLEX_SRC_WIN32_APPLICATION_H__
5
+
6
+
7
+ #include "../application.h"
8
+
9
+
10
+ namespace Reflex
11
+ {
12
+
13
+
14
+ void Application_quit_if_should ();
15
+
16
+
17
+ }// Reflex
18
+
19
+
20
+ #endif//EOH