reflexion 0.5.3 → 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 (309) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/application.cpp +56 -7
  3. data/.doc/ext/reflex/capture_event.cpp +1 -1
  4. data/.doc/ext/reflex/chase_constraint.cpp +84 -0
  5. data/.doc/ext/reflex/clipboard.cpp +65 -0
  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 +135 -0
  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 +178 -0
  26. data/.doc/ext/reflex/menu.cpp +303 -0
  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 +40 -10
  31. data/.doc/ext/reflex/note_event.cpp +1 -1
  32. data/.doc/ext/reflex/pin.cpp +156 -0
  33. data/.doc/ext/reflex/pointer.cpp +3 -1
  34. data/.doc/ext/reflex/pointer_event.cpp +3 -3
  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 +606 -237
  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 +5 -5
  41. data/.doc/ext/reflex/shape.cpp +1 -1
  42. data/.doc/ext/reflex/snap_constraint.cpp +125 -0
  43. data/.doc/ext/reflex/style.cpp +1 -1
  44. data/.doc/ext/reflex/style_length.cpp +4 -3
  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 +206 -79
  50. data/.doc/ext/reflex/wheel_constraint.cpp +142 -0
  51. data/.doc/ext/reflex/wheel_event.cpp +1 -1
  52. data/.doc/ext/reflex/window.cpp +282 -31
  53. data/.github/workflows/release-gem.yml +2 -40
  54. data/.github/workflows/tag.yml +5 -28
  55. data/.github/workflows/test.yml +1 -28
  56. data/ChangeLog.md +79 -0
  57. data/Gemfile.lock +13 -8
  58. data/README.md +1 -0
  59. data/Rakefile +13 -2
  60. data/Reflex.podspec +2 -2
  61. data/VERSION +1 -1
  62. data/ext/reflex/application.cpp +62 -7
  63. data/ext/reflex/capture_event.cpp +1 -1
  64. data/ext/reflex/chase_constraint.cpp +89 -0
  65. data/ext/reflex/clipboard.cpp +69 -0
  66. data/ext/reflex/color_event.cpp +80 -0
  67. data/ext/reflex/color_picker.cpp +121 -0
  68. data/ext/reflex/constraint.cpp +146 -0
  69. data/ext/reflex/contact_event.cpp +1 -1
  70. data/ext/reflex/control_change_event.cpp +1 -1
  71. data/ext/reflex/device.cpp +1 -1
  72. data/ext/reflex/device_event.cpp +1 -1
  73. data/ext/reflex/draw_event.cpp +1 -1
  74. data/ext/reflex/ellipse_shape.cpp +1 -1
  75. data/ext/reflex/event.cpp +1 -1
  76. data/ext/reflex/extconf.rb +4 -2
  77. data/ext/reflex/file_dialog.cpp +194 -0
  78. data/ext/reflex/file_event.cpp +108 -0
  79. data/ext/reflex/filter.cpp +1 -1
  80. data/ext/reflex/focus_event.cpp +1 -1
  81. data/ext/reflex/frame_event.cpp +1 -1
  82. data/ext/reflex/gamepad.cpp +50 -0
  83. data/ext/reflex/image_view.cpp +1 -1
  84. data/ext/reflex/key_event.cpp +1 -275
  85. data/ext/reflex/line_shape.cpp +1 -1
  86. data/ext/reflex/link_constraint.cpp +194 -0
  87. data/ext/reflex/menu.cpp +331 -0
  88. data/ext/reflex/midi.cpp +11 -3
  89. data/ext/reflex/midi_event.cpp +1 -1
  90. data/ext/reflex/motion_event.cpp +1 -1
  91. data/ext/reflex/native.cpp +40 -10
  92. data/ext/reflex/note_event.cpp +1 -1
  93. data/ext/reflex/pin.cpp +165 -0
  94. data/ext/reflex/pointer.cpp +3 -1
  95. data/ext/reflex/pointer_event.cpp +3 -3
  96. data/ext/reflex/polygon_shape.cpp +1 -1
  97. data/ext/reflex/rect_shape.cpp +1 -1
  98. data/ext/reflex/reflex.cpp +608 -237
  99. data/ext/reflex/screen.cpp +31 -2
  100. data/ext/reflex/scroll_event.cpp +1 -1
  101. data/ext/reflex/selector.cpp +5 -5
  102. data/ext/reflex/selector.h +10 -10
  103. data/ext/reflex/shape.cpp +1 -1
  104. data/ext/reflex/snap_constraint.cpp +135 -0
  105. data/ext/reflex/style.cpp +1 -1
  106. data/ext/reflex/style_length.cpp +4 -3
  107. data/ext/reflex/text_event.cpp +111 -0
  108. data/ext/reflex/timer.cpp +1 -1
  109. data/ext/reflex/timer_event.cpp +1 -1
  110. data/ext/reflex/update_event.cpp +1 -1
  111. data/ext/reflex/view.cpp +236 -96
  112. data/ext/reflex/wheel_constraint.cpp +154 -0
  113. data/ext/reflex/wheel_event.cpp +1 -1
  114. data/ext/reflex/window.cpp +318 -40
  115. data/include/reflex/application.h +19 -0
  116. data/include/reflex/clipboard.h +53 -0
  117. data/include/reflex/color_picker.h +65 -0
  118. data/include/reflex/constraint.h +275 -0
  119. data/include/reflex/defs.h +204 -195
  120. data/include/reflex/event.h +180 -88
  121. data/include/reflex/file_dialog.h +73 -0
  122. data/include/reflex/gamepad.h +3 -0
  123. data/include/reflex/menu.h +120 -0
  124. data/include/reflex/midi.h +3 -0
  125. data/include/reflex/pin.h +68 -0
  126. data/include/reflex/pointer.h +4 -0
  127. data/include/reflex/reflex.h +2 -0
  128. data/include/reflex/ruby/application.h +6 -1
  129. data/include/reflex/ruby/clipboard.h +23 -0
  130. data/include/reflex/ruby/color_picker.h +89 -0
  131. data/include/reflex/ruby/constraint.h +94 -0
  132. data/include/reflex/ruby/event.h +62 -29
  133. data/include/reflex/ruby/file_dialog.h +89 -0
  134. data/include/reflex/ruby/gamepad.h +46 -0
  135. data/include/reflex/ruby/menu.h +103 -0
  136. data/include/reflex/ruby/pin.h +40 -0
  137. data/include/reflex/ruby/reflex.h +3 -0
  138. data/include/reflex/ruby/view.h +123 -39
  139. data/include/reflex/ruby/window.h +96 -19
  140. data/include/reflex/ruby.h +3 -0
  141. data/include/reflex/screen.h +11 -2
  142. data/include/reflex/view.h +66 -27
  143. data/include/reflex/window.h +57 -12
  144. data/include/reflex.h +8 -0
  145. data/lib/reflex/application.rb +5 -5
  146. data/lib/reflex/autoinit.rb +3 -1
  147. data/lib/reflex/button.rb +3 -3
  148. data/lib/reflex/chase_constraint.rb +15 -0
  149. data/lib/reflex/clipboard.rb +19 -0
  150. data/lib/reflex/color_event.rb +16 -0
  151. data/lib/reflex/color_picker.rb +45 -0
  152. data/lib/reflex/constraint.rb +29 -0
  153. data/lib/reflex/control_change_event.rb +17 -0
  154. data/lib/reflex/extension.rb +1 -1
  155. data/lib/reflex/file_dialog.rb +70 -0
  156. data/lib/reflex/file_event.rb +37 -0
  157. data/lib/reflex/helper.rb +79 -0
  158. data/lib/reflex/key_event.rb +14 -14
  159. data/lib/reflex/link_constraint.rb +31 -0
  160. data/lib/reflex/menu.rb +92 -0
  161. data/lib/reflex/model.rb +19 -19
  162. data/lib/reflex/note_event.rb +1 -1
  163. data/lib/reflex/pin.rb +39 -0
  164. data/lib/reflex/pointer.rb +30 -1
  165. data/lib/reflex/pointer_event.rb +13 -2
  166. data/lib/reflex/reflex.rb +5 -0
  167. data/lib/reflex/shape.rb +14 -14
  168. data/lib/reflex/snap_constraint.rb +28 -0
  169. data/lib/reflex/style.rb +16 -16
  170. data/lib/reflex/text_event.rb +40 -0
  171. data/lib/reflex/timer.rb +3 -3
  172. data/lib/reflex/view.rb +85 -18
  173. data/lib/reflex/wheel_constraint.rb +28 -0
  174. data/lib/reflex/wheel_event.rb +19 -1
  175. data/lib/reflex/window.rb +25 -13
  176. data/lib/reflex.rb +23 -8
  177. data/pod.rake +1 -1
  178. data/reflex.gemspec +4 -4
  179. data/samples/constraint.rb +152 -0
  180. data/samples/ime.rb +100 -0
  181. data/samples/ios/hello/hello.xcodeproj/project.pbxproj +236 -224
  182. data/samples/menu.rb +32 -0
  183. data/samples/model.rb +3 -3
  184. data/samples/test/alert.rb +93 -0
  185. data/samples/test/always_on.rb +76 -0
  186. data/samples/test/app_background.rb +51 -0
  187. data/samples/test/boundary.rb +75 -0
  188. data/samples/test/callback_exception.rb +101 -0
  189. data/samples/test/cancel.rb +53 -0
  190. data/samples/test/color_picker.rb +63 -0
  191. data/samples/test/file_dialog.rb +102 -0
  192. data/samples/window_style.rb +156 -0
  193. data/src/application.cpp +180 -20
  194. data/src/application.h +95 -5
  195. data/src/clipboard.cpp +81 -0
  196. data/src/color_picker.cpp +113 -0
  197. data/src/color_picker.h +36 -0
  198. data/src/constraint.cpp +1662 -0
  199. data/src/constraint.h +64 -0
  200. data/src/event.cpp +416 -252
  201. data/src/event.h +13 -2
  202. data/src/file_dialog.cpp +163 -0
  203. data/src/file_dialog.h +52 -0
  204. data/src/gamepad.cpp +42 -5
  205. data/src/gamepad.h +4 -0
  206. data/src/ios/app_delegate.mm +5 -3
  207. data/src/ios/application.mm +29 -0
  208. data/src/ios/clipboard.mm +44 -0
  209. data/src/ios/color_picker.mm +19 -0
  210. data/src/ios/event.h +6 -2
  211. data/src/ios/event.mm +31 -12
  212. data/src/ios/file_dialog.mm +21 -0
  213. data/src/ios/gamepad.mm +4 -4
  214. data/src/ios/menu.mm +41 -0
  215. data/src/ios/reflex.mm +8 -0
  216. data/src/ios/screen.mm +26 -0
  217. data/src/ios/view_controller.mm +47 -42
  218. data/src/ios/window.mm +44 -9
  219. data/src/menu.cpp +387 -0
  220. data/src/menu.h +81 -0
  221. data/src/midi.cpp +61 -31
  222. data/src/osx/app_delegate.h +4 -0
  223. data/src/osx/app_delegate.mm +168 -139
  224. data/src/osx/application.mm +103 -5
  225. data/src/osx/clipboard.mm +45 -0
  226. data/src/osx/color_picker.mm +112 -0
  227. data/src/osx/event.h +10 -0
  228. data/src/osx/event.mm +114 -30
  229. data/src/osx/file_dialog.mm +168 -0
  230. data/src/osx/gamepad.mm +2 -2
  231. data/src/osx/gamepad_hid.mm +1 -1
  232. data/src/osx/menu.h +25 -0
  233. data/src/osx/menu.mm +516 -0
  234. data/src/osx/native_window.h +16 -2
  235. data/src/osx/native_window.mm +141 -57
  236. data/src/osx/opengl_view.h +2 -1
  237. data/src/osx/opengl_view.mm +229 -37
  238. data/src/osx/reflex.mm +38 -0
  239. data/src/osx/screen.mm +36 -0
  240. data/src/osx/window.mm +117 -24
  241. data/src/pin.cpp +137 -0
  242. data/src/pointer.cpp +36 -16
  243. data/src/pointer.h +10 -0
  244. data/src/rays.h +46 -0
  245. data/src/sdl/application.cpp +73 -8
  246. data/src/sdl/clipboard.cpp +39 -0
  247. data/src/sdl/color_picker.cpp +18 -0
  248. data/src/sdl/event.cpp +44 -6
  249. data/src/sdl/event.h +18 -3
  250. data/src/sdl/file_dialog.cpp +20 -0
  251. data/src/sdl/gamepad.cpp +3 -7
  252. data/src/sdl/menu.cpp +40 -0
  253. data/src/sdl/reflex.cpp +20 -0
  254. data/src/sdl/screen.cpp +36 -0
  255. data/src/sdl/window.cpp +168 -37
  256. data/src/shape.cpp +15 -10
  257. data/src/view.cpp +583 -233
  258. data/src/view.h +22 -4
  259. data/src/vk.h +416 -0
  260. data/src/win32/application.cpp +167 -12
  261. data/src/win32/application.h +20 -0
  262. data/src/win32/clipboard.cpp +210 -0
  263. data/src/win32/color_picker.cpp +82 -0
  264. data/src/win32/event.cpp +123 -11
  265. data/src/win32/event.h +22 -3
  266. data/src/win32/file_dialog.cpp +226 -0
  267. data/src/win32/gamepad.cpp +9 -2
  268. data/src/win32/menu.cpp +490 -0
  269. data/src/win32/menu.h +35 -0
  270. data/src/win32/opengl.cpp +2 -9
  271. data/src/win32/reflex.cpp +44 -3
  272. data/src/win32/screen.cpp +164 -3
  273. data/src/win32/screen.h +8 -0
  274. data/src/win32/tray.cpp +191 -0
  275. data/src/win32/tray.h +22 -0
  276. data/src/win32/vk.cpp +11 -0
  277. data/src/win32/window.cpp +858 -135
  278. data/src/win32/window.h +9 -0
  279. data/src/window.cpp +929 -183
  280. data/src/window.h +77 -33
  281. data/src/world.cpp +86 -15
  282. data/src/world.h +9 -2
  283. data/test/helper.rb +24 -0
  284. data/test/test_application.rb +101 -1
  285. data/test/test_chase_constraint.rb +122 -0
  286. data/test/test_clipboard.rb +54 -0
  287. data/test/test_color_event.rb +36 -0
  288. data/test/test_color_picker.rb +62 -0
  289. data/test/test_constraint.rb +184 -0
  290. data/test/test_event.rb +1 -1
  291. data/test/test_file_dialog.rb +48 -0
  292. data/test/test_file_event.rb +43 -0
  293. data/test/test_has_text_preedit.rb +54 -0
  294. data/test/test_key_event.rb +23 -2
  295. data/test/test_link_constraint.rb +237 -0
  296. data/test/test_menu.rb +237 -0
  297. data/test/test_pin.rb +65 -0
  298. data/test/test_pointer.rb +50 -26
  299. data/test/test_pointer_event.rb +25 -10
  300. data/test/test_reflex.rb +36 -0
  301. data/test/test_screen.rb +24 -2
  302. data/test/test_snap_constraint.rb +140 -0
  303. data/test/test_text_event.rb +54 -0
  304. data/test/test_view.rb +152 -25
  305. data/test/test_wheel_constraint.rb +125 -0
  306. data/test/test_wheel_event.rb +24 -10
  307. data/test/test_window.rb +205 -43
  308. metadata +154 -10
  309. data/.github/workflows/utils.rb +0 -127
@@ -567,7 +567,7 @@ namespace Reflex
567
567
 
568
568
  CFIndex count = CFSetGetCount(set.get());
569
569
  std::vector<IOHIDDeviceRef> devices(count, NULL);
570
- CFSetGetValues(set.get(), (const void**) &devices[0]);
570
+ CFSetGetValues(set.get(), (const void**) devices.data());
571
571
 
572
572
  for (CFIndex i = 0; i < count; ++i)
573
573
  handle_connect_event(app, kIOReturnSuccess, manager, devices[i]);
data/src/osx/menu.h ADDED
@@ -0,0 +1,25 @@
1
+ // -*- objc -*-
2
+ #pragma once
3
+ #ifndef __REFLEX_SRC_OSX_MENU_H__
4
+ #define __REFLEX_SRC_OSX_MENU_H__
5
+
6
+
7
+ #import <AppKit/NSMenu.h>
8
+ #include "../menu.h"
9
+
10
+
11
+ namespace Reflex
12
+ {
13
+
14
+
15
+ NSMenu* Menu_get_nssubmenu (Menu* menu);
16
+
17
+ void Menu_set_native_action (Menu* menu, SEL action);
18
+
19
+ void Menu_apply_to_main_menu (Menu* menu);
20
+
21
+
22
+ }// Reflex
23
+
24
+
25
+ #endif//EOH
data/src/osx/menu.mm ADDED
@@ -0,0 +1,516 @@
1
+ // -*- objc -*-
2
+ #include "menu.h"
3
+
4
+
5
+ #import <Cocoa/Cocoa.h>
6
+ #import <AppKit/AppKit.h>
7
+ #import <objc/runtime.h>
8
+ #include "reflex/exception.h"
9
+ #include "reflex/event.h"
10
+ #include "reflex/view.h"
11
+ #include "../rays.h"
12
+ #include "window.h"
13
+ #include "screen.h"
14
+ #import "native_window.h"
15
+
16
+
17
+ @interface ReflexMenuTarget : NSObject <NSMenuDelegate>
18
+ @end
19
+
20
+
21
+ static NSValue*
22
+ menu2value (Reflex::Menu* menu)
23
+ {
24
+ return [NSValue valueWithPointer: menu];
25
+ }
26
+
27
+ static Reflex::Menu*
28
+ value2menu (NSValue* value)
29
+ {
30
+ return value ? (Reflex::Menu*) value.pointerValue : NULL;
31
+ }
32
+
33
+ static void
34
+ set_owner (NSMenuItem* nsitem, Reflex::Menu* owner)
35
+ {
36
+ [nsitem setRepresentedObject: menu2value(owner)];
37
+ }
38
+
39
+ static Reflex::Menu*
40
+ get_owner (NSMenuItem* nsitem)
41
+ {
42
+ return value2menu(nsitem.representedObject);
43
+ }
44
+
45
+ static void*
46
+ associated_object_key ()
47
+ {
48
+ static char key;
49
+ return &key;
50
+ }
51
+
52
+ static void
53
+ set_owner (NSMenu* nsmenu, Reflex::Menu* owner)
54
+ {
55
+ objc_setAssociatedObject(
56
+ nsmenu, associated_object_key(), menu2value(owner),
57
+ OBJC_ASSOCIATION_RETAIN_NONATOMIC);
58
+ }
59
+
60
+ static Reflex::Menu*
61
+ get_owner (NSMenu* nsmenu)
62
+ {
63
+ return value2menu(objc_getAssociatedObject(nsmenu, associated_object_key()));
64
+ }
65
+
66
+ static ReflexMenuTarget*
67
+ menu_target ()
68
+ {
69
+ static ReflexMenuTarget* target = [[ReflexMenuTarget alloc] init];
70
+ return target;
71
+ }
72
+
73
+
74
+ namespace Reflex
75
+ {
76
+
77
+
78
+ struct MenuData : public Menu::Data
79
+ {
80
+
81
+ NSMenuItem* nsitem = nil;
82
+
83
+ NSMenu* nssubmenu = nil;
84
+
85
+ SEL native_action = NULL;
86
+
87
+ MenuData ()
88
+ {
89
+ nsitem = [[NSMenuItem alloc]
90
+ initWithTitle: @"" action: @selector(handleMenuItem:) keyEquivalent: @""];
91
+ }
92
+
93
+ virtual ~MenuData ()
94
+ {
95
+ [nsitem release];
96
+ [nssubmenu release];
97
+ }
98
+
99
+ NSMenu* get_nssubmenu (Menu* menu)
100
+ {
101
+ if (!nssubmenu)
102
+ {
103
+ nssubmenu = [[NSMenu alloc] initWithTitle: @""];
104
+ set_owner(nssubmenu, menu);
105
+ [nssubmenu setAutoenablesItems: NO];
106
+ [nssubmenu setDelegate: menu_target()];
107
+ [nsitem setSubmenu: nssubmenu];
108
+ }
109
+ return nssubmenu;
110
+ }
111
+
112
+ };// MenuData
113
+
114
+
115
+ static MenuData&
116
+ get_data (Menu* menu)
117
+ {
118
+ if (!menu)
119
+ argument_error(__FILE__, __LINE__);
120
+
121
+ return (MenuData&) *menu->self;
122
+ }
123
+
124
+ static void
125
+ Menu_validate_items (NSMenu* nsmenu)
126
+ {
127
+ for (NSMenuItem* nsitem in nsmenu.itemArray)
128
+ {
129
+ Menu* menu = get_owner(nsitem);
130
+ if (!menu) continue;
131
+
132
+ MenuData& self = get_data(menu);
133
+ if (!self.native_action) continue;
134
+
135
+ [nsitem setEnabled:
136
+ menu->is_enabled() && [NSApp targetForAction: self.native_action] != nil];
137
+ }
138
+ }
139
+
140
+ Menu::Data*
141
+ Menu_create_data ()
142
+ {
143
+ return new MenuData();
144
+ }
145
+
146
+ void
147
+ Menu_validate_shortcut_modifiers (uint modifiers)
148
+ {
149
+ static const uint SUPPORTED =
150
+ MOD_SHIFT | MOD_CONTROL | MOD_ALT | MOD_OPTION | MOD_COMMAND;
151
+
152
+ if (modifiers & ~SUPPORTED)
153
+ {
154
+ argument_error(
155
+ __FILE__, __LINE__,
156
+ "modifiers 0x%X can not be used for a shortcut on macOS.",
157
+ modifiers & ~SUPPORTED);
158
+ }
159
+ }
160
+
161
+ static NSString*
162
+ get_keyequivalent_string (int key)
163
+ {
164
+ using namespace Reflex;
165
+ switch (key)
166
+ {
167
+ #define KEY_STR(key) [NSString stringWithFormat: @"%C", (unichar) (key)]
168
+
169
+ case KEY_A: return @"a";
170
+ case KEY_B: return @"b";
171
+ case KEY_C: return @"c";
172
+ case KEY_D: return @"d";
173
+ case KEY_E: return @"e";
174
+ case KEY_F: return @"f";
175
+ case KEY_G: return @"g";
176
+ case KEY_H: return @"h";
177
+ case KEY_I: return @"i";
178
+ case KEY_J: return @"j";
179
+ case KEY_K: return @"k";
180
+ case KEY_L: return @"l";
181
+ case KEY_M: return @"m";
182
+ case KEY_N: return @"n";
183
+ case KEY_O: return @"o";
184
+ case KEY_P: return @"p";
185
+ case KEY_Q: return @"q";
186
+ case KEY_R: return @"r";
187
+ case KEY_S: return @"s";
188
+ case KEY_T: return @"t";
189
+ case KEY_U: return @"u";
190
+ case KEY_V: return @"v";
191
+ case KEY_W: return @"w";
192
+ case KEY_X: return @"x";
193
+ case KEY_Y: return @"y";
194
+ case KEY_Z: return @"z";
195
+
196
+ case KEY_0: return @"0";
197
+ case KEY_1: return @"1";
198
+ case KEY_2: return @"2";
199
+ case KEY_3: return @"3";
200
+ case KEY_4: return @"4";
201
+ case KEY_5: return @"5";
202
+ case KEY_6: return @"6";
203
+ case KEY_7: return @"7";
204
+ case KEY_8: return @"8";
205
+ case KEY_9: return @"9";
206
+
207
+ case KEY_MINUS: return @"-";
208
+ case KEY_EQUAL: return @"=";
209
+ case KEY_COMMA: return @",";
210
+ case KEY_PERIOD: return @".";
211
+ case KEY_SEMICOLON: return @";";
212
+ case KEY_QUOTE: return @"'";
213
+ case KEY_SLASH: return @"/";
214
+ case KEY_BACKSLASH: return @"\\";
215
+ case KEY_GRAVE: return @"`";
216
+ case KEY_LBRACKET: return @"[";
217
+ case KEY_RBRACKET: return @"]";
218
+
219
+ case KEY_ENTER: return @"\r";
220
+ case KEY_SPACE: return @" ";
221
+ case KEY_TAB: return @"\t";
222
+ case KEY_ESCAPE: return @"\033";
223
+ case KEY_BACKSPACE: return @"\b";
224
+ case KEY_DELETE: return KEY_STR(NSDeleteFunctionKey);
225
+ case KEY_INSERT: return KEY_STR(NSInsertFunctionKey);
226
+
227
+ case KEY_LEFT: return KEY_STR(NSLeftArrowFunctionKey);
228
+ case KEY_RIGHT: return KEY_STR(NSRightArrowFunctionKey);
229
+ case KEY_UP: return KEY_STR(NSUpArrowFunctionKey);
230
+ case KEY_DOWN: return KEY_STR(NSDownArrowFunctionKey);
231
+ case KEY_HOME: return KEY_STR(NSHomeFunctionKey);
232
+ case KEY_END: return KEY_STR(NSEndFunctionKey);
233
+ case KEY_PAGEUP: return KEY_STR(NSPageUpFunctionKey);
234
+ case KEY_PAGEDOWN: return KEY_STR(NSPageDownFunctionKey);
235
+
236
+ case KEY_F1: return KEY_STR(NSF1FunctionKey);
237
+ case KEY_F2: return KEY_STR(NSF2FunctionKey);
238
+ case KEY_F3: return KEY_STR(NSF3FunctionKey);
239
+ case KEY_F4: return KEY_STR(NSF4FunctionKey);
240
+ case KEY_F5: return KEY_STR(NSF5FunctionKey);
241
+ case KEY_F6: return KEY_STR(NSF6FunctionKey);
242
+ case KEY_F7: return KEY_STR(NSF7FunctionKey);
243
+ case KEY_F8: return KEY_STR(NSF8FunctionKey);
244
+ case KEY_F9: return KEY_STR(NSF9FunctionKey);
245
+ case KEY_F10: return KEY_STR(NSF10FunctionKey);
246
+ case KEY_F11: return KEY_STR(NSF11FunctionKey);
247
+ case KEY_F12: return KEY_STR(NSF12FunctionKey);
248
+ case KEY_F13: return KEY_STR(NSF13FunctionKey);
249
+ case KEY_F14: return KEY_STR(NSF14FunctionKey);
250
+ case KEY_F15: return KEY_STR(NSF15FunctionKey);
251
+ case KEY_F16: return KEY_STR(NSF16FunctionKey);
252
+ case KEY_F17: return KEY_STR(NSF17FunctionKey);
253
+ case KEY_F18: return KEY_STR(NSF18FunctionKey);
254
+ case KEY_F19: return KEY_STR(NSF19FunctionKey);
255
+ case KEY_F20: return KEY_STR(NSF20FunctionKey);
256
+ case KEY_F21: return KEY_STR(NSF21FunctionKey);
257
+ case KEY_F22: return KEY_STR(NSF22FunctionKey);
258
+ case KEY_F23: return KEY_STR(NSF23FunctionKey);
259
+ case KEY_F24: return KEY_STR(NSF24FunctionKey);
260
+
261
+ #undef KEY_STR
262
+ }
263
+ return @"";
264
+ }
265
+
266
+ static NSEventModifierFlags
267
+ modifiers2mask (uint mods)
268
+ {
269
+ NSEventModifierFlags mask = 0;
270
+ if (mods & MOD_SHIFT) mask |= NSEventModifierFlagShift;
271
+ if (mods & MOD_CONTROL) mask |= NSEventModifierFlagControl;
272
+ if (mods & MOD_COMMAND) mask |= NSEventModifierFlagCommand;
273
+ if (mods & (MOD_OPTION | MOD_ALT)) mask |= NSEventModifierFlagOption;
274
+ return mask;
275
+ }
276
+
277
+ void
278
+ Menu_update (Menu* menu)
279
+ {
280
+ auto& self = get_data(menu);
281
+ bool old_sep = self.nsitem && self.nsitem.isSeparatorItem;
282
+ bool is_sep = menu->is_separator();
283
+
284
+ if (!self.nsitem || is_sep != old_sep)
285
+ {
286
+ NSMenu* parent = self.nsitem.menu;
287
+ NSInteger index = parent ? [parent indexOfItem: self.nsitem] : -1;
288
+
289
+ NSMenuItem* nsitem = is_sep
290
+ ? [[NSMenuItem separatorItem] retain]
291
+ : [[NSMenuItem alloc]
292
+ initWithTitle: @""
293
+ action: @selector(handleMenuItem:)
294
+ keyEquivalent: @""];
295
+
296
+ if (parent)
297
+ {
298
+ [parent removeItem: self.nsitem];
299
+ [parent insertItem: nsitem atIndex: index];
300
+ }
301
+
302
+ [self.nsitem release];
303
+ self.nsitem = nsitem;
304
+ }
305
+
306
+ if (is_sep) return;
307
+
308
+ set_owner(self.nsitem, menu);
309
+ [self.nsitem setTarget: self.native_action ? nil : menu_target()];
310
+ [self.nsitem setAction: self.native_action ? self.native_action : @selector(handleMenuItem:)];
311
+ [self.nsitem setTitle: [NSString stringWithUTF8String: menu->label()]];
312
+ [self.nsitem setEnabled: menu->is_enabled() ? YES : NO];
313
+ [self.nsitem setState: menu->is_checked() ? NSControlStateValueOn : NSControlStateValueOff];
314
+ [self.nsitem setKeyEquivalent: get_keyequivalent_string(menu->shortcut_key())];
315
+ [self.nsitem setKeyEquivalentModifierMask: modifiers2mask(menu->shortcut_modifiers())];
316
+ [self.nsitem setImage: menu->image() ? Rays::Bitmap_get_nsimage(menu->image().bitmap()) : nil];
317
+ [self.nsitem setSubmenu: menu->empty() ? nil : self.nssubmenu];
318
+ }
319
+
320
+ void
321
+ Menu_popup (Menu* menu, View* view, coord x, coord y)
322
+ {
323
+ Menu_cancel_active_pointers_for_popup(view);
324
+
325
+ MenuData& self = get_data(menu);
326
+
327
+ if (!self.nssubmenu)
328
+ invalid_state_error(__FILE__, __LINE__);
329
+
330
+ if (view)
331
+ {
332
+ Window* win = view->window();
333
+ if (!win)
334
+ invalid_state_error(__FILE__, __LINE__);
335
+
336
+ NSWindow* nswin = Window_get_data(win).native;
337
+ if (!nswin)
338
+ invalid_state_error(__FILE__, __LINE__);
339
+
340
+ NSView* nsview = nswin.contentView;
341
+ if (!nsview)
342
+ invalid_state_error(__FILE__, __LINE__);
343
+
344
+ Point win_pos = view->to_window(Point(x, y));
345
+ CGFloat win_h = nsview.frame.size.height;
346
+ [self.nssubmenu popUpMenuPositioningItem: nil
347
+ atLocation: NSMakePoint(win_pos.x, win_h - win_pos.y)
348
+ inView: nsview];
349
+ }
350
+ else
351
+ {
352
+ [self.nssubmenu popUpMenuPositioningItem: nil
353
+ atLocation: NSMakePoint(x, primary_screen_height() - y)
354
+ inView: nil];
355
+ }
356
+ }
357
+
358
+ void
359
+ Menu_child_added (Menu* parent, Menu* child, int index)
360
+ {
361
+ auto& p = get_data(parent);
362
+ auto& c = get_data(child);
363
+
364
+ [p.get_nssubmenu(parent) insertItem: c.nsitem atIndex: index];
365
+ Menu_update(child);
366
+ }
367
+
368
+ void
369
+ Menu_child_removed (Menu* parent, Menu* child)
370
+ {
371
+ auto& p = get_data(parent);
372
+ auto& c = get_data(child);
373
+
374
+ if (p.nssubmenu && c.nsitem.menu == p.nssubmenu)
375
+ [p.nssubmenu removeItem: c.nsitem];
376
+ }
377
+
378
+ NSMenu*
379
+ Menu_get_nssubmenu (Menu* menu)
380
+ {
381
+ return get_data(menu).get_nssubmenu(menu);
382
+ }
383
+
384
+ void
385
+ Menu_set_native_action (Menu* menu, SEL action)
386
+ {
387
+ MenuData& self = get_data(menu);
388
+
389
+ self.native_action = action;
390
+ Menu_update(menu);
391
+ }
392
+
393
+ void
394
+ Menu_apply_to_main_menu (Menu* menu)
395
+ {
396
+ if (!menu && app())
397
+ menu = app()->menu();
398
+
399
+ if (!menu) return;
400
+
401
+ [NSApp setMainMenu: get_data(menu).get_nssubmenu(menu)];
402
+ }
403
+
404
+
405
+ }// Reflex
406
+
407
+
408
+ static NSMenuItem*
409
+ find_key_equivalent_item (NSMenu* nsmenu, NSEvent* event)
410
+ {
411
+ static const NSEventModifierFlags KEY_EQUIVALENT_MODIFIER_MASK =
412
+ NSEventModifierFlagCommand |
413
+ NSEventModifierFlagShift |
414
+ NSEventModifierFlagOption |
415
+ NSEventModifierFlagControl;
416
+
417
+ if (event.type != NSEventTypeKeyDown)
418
+ return nil;
419
+
420
+ NSEventModifierFlags mods = event.modifierFlags & KEY_EQUIVALENT_MODIFIER_MASK;
421
+ NSString* chars = event.charactersIgnoringModifiers;
422
+
423
+ for (NSMenuItem* nsitem in nsmenu.itemArray)
424
+ {
425
+ if (!nsitem.enabled) continue;
426
+
427
+ if (nsitem.hasSubmenu)
428
+ {
429
+ NSMenuItem* found = find_key_equivalent_item(nsitem.submenu, event);
430
+ if (found) return found;
431
+ }
432
+ else if (
433
+ nsitem.keyEquivalent.length > 0 &&
434
+ nsitem.keyEquivalentModifierMask == mods &&
435
+ [nsitem.keyEquivalent isEqualToString: chars])
436
+ {
437
+ return nsitem;
438
+ }
439
+ }
440
+ return nil;
441
+ }
442
+
443
+
444
+ @implementation ReflexMenuTarget
445
+
446
+ - (void) handleMenuItem: (id) sender
447
+ {
448
+ NSMenuItem* nsitem = nil;
449
+ if ([sender isKindOfClass: NSMenuItem.class])
450
+ nsitem = (NSMenuItem*) sender;
451
+ else if ([sender isKindOfClass: NSMenu.class])
452
+ nsitem = find_key_equivalent_item((NSMenu*) sender, NSApp.currentEvent);
453
+
454
+ Reflex::Menu* menu = get_owner(nsitem);
455
+ if (!menu) return;
456
+
457
+ Reflex::Event e;
458
+ Reflex::Menu_call_click_event(menu, &e);
459
+ }
460
+
461
+ - (void) menuWillOpen: (NSMenu*) nsmenu
462
+ {
463
+ Reflex::Menu_validate_items(nsmenu);
464
+
465
+ Reflex::Menu* menu = get_owner(nsmenu);
466
+ if (!menu) return;
467
+
468
+ Reflex::Event e;
469
+ Reflex::Menu_call_open_submenu_event(menu, &e);
470
+
471
+ for (NSMenuItem* nsitem in nsmenu.itemArray)
472
+ {
473
+ Reflex::Menu* child = get_owner(nsitem);
474
+ if (!child) continue;
475
+
476
+ Reflex::Event ce;
477
+ Reflex::Menu_call_show_event(child, &ce);
478
+ }
479
+ }
480
+
481
+ - (void) menuDidClose: (NSMenu*) nsmenu
482
+ {
483
+ Reflex::Menu* menu = get_owner(nsmenu);
484
+ if (!menu) return;
485
+
486
+ for (NSMenuItem* nsitem in nsmenu.itemArray)
487
+ {
488
+ Reflex::Menu* child = get_owner(nsitem);
489
+ if (!child) continue;
490
+
491
+ Reflex::Event ce;
492
+ Reflex::Menu_call_hide_event(child, &ce);
493
+ }
494
+
495
+ Reflex::Event e;
496
+ Reflex::Menu_call_close_submenu_event(menu, &e);
497
+ }
498
+
499
+ - (BOOL) menuHasKeyEquivalent: (NSMenu*) nsmenu
500
+ forEvent: (NSEvent*) event
501
+ target: (id*) target
502
+ action: (SEL*) action
503
+ {
504
+ // answer key equivalent matching ourselves: AppKit's own scanning of
505
+ // delegate-backed menus caches stale results across setMainMenu calls,
506
+ // leaving every shortcut dead until the menu bar is clicked once
507
+
508
+ NSMenuItem* nsitem = find_key_equivalent_item(nsmenu, event);
509
+ if (!nsitem) return NO;
510
+
511
+ *target = nsitem.target;
512
+ *action = nsitem.action;
513
+ return YES;
514
+ }
515
+
516
+ @end// ReflexMenuTarget
@@ -4,10 +4,24 @@
4
4
 
5
5
  @interface NativeWindow : NSWindow <NSWindowDelegate>
6
6
 
7
- - (void) draw;
7
+ - (void) setTitlebarBackgroundVisible: (BOOL) visible;
8
+
9
+ - (void) setTitlebarButtonsVisible: (BOOL) visible;
10
+
11
+ - (void) setTitlebarContainerVisible: (BOOL) visible;
12
+
13
+ - (void) setBackgroundTransparent: (BOOL) transparent;
8
14
 
9
15
  - (BOOL) hasFullScreenFlag;
10
16
 
11
- + (NSRect) frameRectForContentRect: (NSRect) contentRect;
17
+ - (void) draw;
18
+
19
+ - (BOOL) isTextInputEnabled;
20
+
21
+ - (void) textPreedit: (NSString*) text selection: (NSRange) selection;
22
+
23
+ - (void) textCommit: (NSString*) text synthesizeKeyEvent: (BOOL) synthesize;
24
+
25
+ - (NSRect) textInputBounds;
12
26
 
13
27
  @end// NativeWindow