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
data/src/sdl/window.cpp CHANGED
@@ -24,6 +24,10 @@ namespace Reflex
24
24
 
25
25
  bool need_rebind = false;
26
26
 
27
+ // whether the input method is composing, which is what tells the text
28
+ // it commits apart from the text a key produces on its own
29
+ bool composing = false;
30
+
27
31
  OpenGLContext context;
28
32
 
29
33
  mutable String title_tmp;
@@ -87,13 +91,16 @@ namespace Reflex
87
91
  if (win) win->release();
88
92
 
89
93
  if (Window_all().empty())
90
- Reflex::app()->quit();
94
+ Reflex::Application_call_quit(Reflex::app());
91
95
  }
92
96
 
93
97
  Uint32 to_sdl_flags (uint flags)
94
98
  {
95
99
  Uint32 sdl_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI;
96
100
 
101
+ if (!Xot::has_flag(flags, Window::FLAG_TITLEBAR_BACKGROUND))
102
+ sdl_flags |= SDL_WINDOW_BORDERLESS;
103
+
97
104
  if (Xot::has_flag(flags, Window::FLAG_RESIZABLE))
98
105
  sdl_flags |= SDL_WINDOW_RESIZABLE;
99
106
 
@@ -157,32 +164,60 @@ namespace Reflex
157
164
  Window_call_draw_event(win, &e);
158
165
  }
159
166
 
167
+ static bool
168
+ accepts_text_input (Window* win)
169
+ {
170
+ const View* focus = win->focus();
171
+ return focus && focus->accepts_text_input();
172
+ }
173
+
160
174
  static void
161
- frame_changed (Window* win)
175
+ update_text_input_rect (Window* win)
162
176
  {
163
- Rays::Bounds b = win->frame();
164
- Rays::Point dpos = b.position() - win->self->prev_position;
165
- Rays::Point dsize = b.size() - win->self->prev_size;
166
- win->self->prev_position = b.position();
167
- win->self->prev_size = b.size();
177
+ const View* focus = win->focus();
178
+ if (!focus) return;
168
179
 
169
- if (dpos == 0 && dsize == 0) return;
180
+ Bounds b = focus->text_input_bounds();
181
+ Point p1 = focus->to_window(b.position());
182
+ Point p2 = focus->to_window(b.position() + b.size());
170
183
 
171
- Reflex::FrameEvent e(b, dpos.x, dpos.y, 0, dsize.x, dsize.y, 0);
172
- if (dpos != 0) win->on_move(&e);
173
- if (dsize != 0)
174
- {
175
- Rays::Bounds b = win->frame();
176
- b.move_to(0, 0);
184
+ SDL_Rect rect = {(int) p1.x, (int) p1.y, (int) (p2.x - p1.x), (int) (p2.y - p1.y)};
185
+ SDL_SetTextInputRect(&rect);
186
+ }
177
187
 
178
- if (win->painter())
179
- win->painter()->canvas(b, win->painter()->pixel_density());
188
+ static void
189
+ preedit (Window* win, const char* text, int offset, int size)
190
+ {
191
+ WindowData* self = get_data(win);
180
192
 
181
- if (win->root())
182
- View_set_frame(win->root(), b);
193
+ // the input method reports an empty composition before anything is typed
194
+ bool empty = !text || *text == '\0';
195
+ if (empty && !self->composing)
196
+ return;
183
197
 
184
- win->on_resize(&e);
185
- }
198
+ self->composing = !empty;
199
+
200
+ if (!accepts_text_input(win))
201
+ return;
202
+
203
+ NativeTextEvent e(text ? text : "", offset, size);
204
+ Window_call_text_event(win, &e);
205
+
206
+ update_text_input_rect(win);
207
+ }
208
+
209
+ static void
210
+ commit (Window* win, const SDL_TextInputEvent& event)
211
+ {
212
+ WindowData* self = get_data(win);
213
+
214
+ bool composed = self->composing;
215
+
216
+ if (!accepts_text_input(win))
217
+ return;
218
+
219
+ NativeTextEvent e(event);
220
+ Window_call_text_event(win, &e, composed);
186
221
  }
187
222
 
188
223
 
@@ -196,9 +231,12 @@ namespace Reflex
196
231
  Window_default_flags ()
197
232
  {
198
233
  return
199
- Window::FLAG_CLOSABLE |
200
- Window::FLAG_RESIZABLE |
201
- Window::FLAG_MINIMIZABLE;
234
+ Window::FLAG_CLOSABLE |
235
+ Window::FLAG_MINIMIZABLE |
236
+ Window::FLAG_RESIZABLE |
237
+ Window::FLAG_TITLEBAR_BUTTONS |
238
+ Window::FLAG_TITLEBAR_BACKGROUND |
239
+ Window::FLAG_SHADOW;
202
240
  }
203
241
 
204
242
  void
@@ -283,6 +321,12 @@ namespace Reflex
283
321
  return Bounds(x, y, w, h);
284
322
  }
285
323
 
324
+ void
325
+ Window_set_menu (Window* window, Menu* menu)
326
+ {
327
+ not_implemented_error(__FILE__, __LINE__);
328
+ }
329
+
286
330
  Screen
287
331
  Window_get_screen (const Window& win)
288
332
  {
@@ -305,13 +349,48 @@ namespace Reflex
305
349
  if (!*win)
306
350
  invalid_state_error(__FILE__, __LINE__);
307
351
 
352
+ bool buttons = Xot::has_flag(flags, Window::FLAG_TITLEBAR_BUTTONS);
353
+ bool background = Xot::has_flag(flags, Window::FLAG_TITLEBAR_BACKGROUND);
354
+ if (buttons != background)
355
+ {
356
+ argument_error(
357
+ __FILE__, __LINE__,
358
+ "FLAG_TITLEBAR_BUTTONS and FLAG_TITLEBAR_BACKGROUND must match");
359
+ }
360
+
361
+ if (Xot::has_flag(flags, Window::FLAG_UNLISTED))
362
+ not_implemented_error(__FILE__, __LINE__, "FLAG_UNLISTED");
363
+
364
+ if (!Xot::has_flag(flags, Window::FLAG_SHADOW))
365
+ not_implemented_error(__FILE__, __LINE__, "missing FLAG_SHADOW");
366
+
367
+ if (Xot::has_flag(flags, Window::FLAG_TRANSPARENT))
368
+ not_implemented_error(__FILE__, __LINE__, "FLAG_TRANSPARENT");
369
+
370
+ if (Xot::has_flag(flags, Window::FLAG_ALWAYS_ON_BOTTOM))
371
+ not_implemented_error(__FILE__, __LINE__, "FLAG_ALWAYS_ON_BOTTOM");
372
+
373
+ if (Xot::has_flag(flags, Window::FLAG_POINTER_THROUGH))
374
+ not_implemented_error(__FILE__, __LINE__, "FLAG_POINTER_THROUGH");
375
+
308
376
  WindowData* self = get_data(win);
309
377
  Uint32 sdl_flags = self->to_sdl_flags(flags);
310
378
 
379
+ #if SDL_VERSION_ATLEAST(2, 0, 16)
380
+ SDL_SetWindowAlwaysOnTop(
381
+ self->native,
382
+ Xot::has_flag(flags, Window::FLAG_ALWAYS_ON_TOP) ? SDL_TRUE : SDL_FALSE);
383
+ #else
384
+ if (Xot::has_flag(flags, Window::FLAG_ALWAYS_ON_TOP))
385
+ not_implemented_error(__FILE__, __LINE__, "FLAG_ALWAYS_ON_TOP");
386
+ #endif
387
+
311
388
  SDL_SetWindowResizable(
312
389
  self->native,
313
390
  sdl_flags & SDL_WINDOW_RESIZABLE ? SDL_TRUE : SDL_FALSE);
314
391
 
392
+ SDL_SetWindowBordered(self->native, background ? SDL_TRUE : SDL_FALSE);
393
+
315
394
  int result = SDL_SetWindowFullscreen(
316
395
  self->native,
317
396
  sdl_flags & SDL_WINDOW_FULLSCREEN_DESKTOP ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
@@ -338,6 +417,17 @@ namespace Reflex
338
417
  return (float) draw_w / (float) win_w;
339
418
  }
340
419
 
420
+ void
421
+ Window_set_pointer_through (Window* window, bool through)
422
+ {
423
+ }
424
+
425
+ bool
426
+ Window_is_pointer_over_and_uncovered (Point* position, const Window& window)
427
+ {
428
+ return false;
429
+ }
430
+
341
431
  Window*
342
432
  Window_from (SDL_Window* native)
343
433
  {
@@ -358,7 +448,7 @@ namespace Reflex
358
448
  switch (event.window.event)
359
449
  {
360
450
  case SDL_WINDOWEVENT_CLOSE:
361
- win->close();
451
+ Window_call_close(win);
362
452
  break;
363
453
 
364
454
  case SDL_WINDOWEVENT_EXPOSED:
@@ -373,7 +463,7 @@ namespace Reflex
373
463
  case SDL_WINDOWEVENT_RESTORED:
374
464
  case SDL_WINDOWEVENT_MAXIMIZED:
375
465
  case SDL_WINDOWEVENT_MINIMIZED:
376
- frame_changed(win);
466
+ Window_call_frame_event(win);
377
467
  break;
378
468
 
379
469
  case SDL_WINDOWEVENT_FOCUS_GAINED:
@@ -381,8 +471,23 @@ namespace Reflex
381
471
  break;
382
472
 
383
473
  case SDL_WINDOWEVENT_FOCUS_LOST:
474
+ Window_cancel_active_pointers(win);
384
475
  Window_call_deactivate_event(win);
385
476
  break;
477
+
478
+ case SDL_WINDOWEVENT_ENTER:
479
+ {
480
+ NativePointerEvent e(self->native, Pointer::ENTER);
481
+ Window_call_pointer_event(win, &e);
482
+ break;
483
+ }
484
+
485
+ case SDL_WINDOWEVENT_LEAVE:
486
+ {
487
+ NativePointerEvent e(self->native, Pointer::LEAVE);
488
+ Window_call_pointer_event(win, &e);
489
+ break;
490
+ }
386
491
  }
387
492
  break;
388
493
  }
@@ -401,25 +506,54 @@ namespace Reflex
401
506
  break;
402
507
  }
403
508
 
509
+ case SDL_TEXTEDITING:
510
+ {
511
+ preedit(win, event.edit.text, event.edit.start, event.edit.length);
512
+ break;
513
+ }
514
+
515
+ #if SDL_VERSION_ATLEAST(2, 0, 22)
516
+ case SDL_TEXTEDITING_EXT:
517
+ {
518
+ preedit(win, event.editExt.text, event.editExt.start, event.editExt.length);
519
+ break;
520
+ }
521
+ #endif
522
+
523
+ case SDL_TEXTINPUT:
524
+ {
525
+ commit(win, event.text);
526
+ break;
527
+ }
528
+
404
529
  case SDL_MOUSEBUTTONDOWN:
405
530
  {
406
- NativePointerEvent e(
407
- event.button, self->native, Pointer::DOWN);
531
+ NativePointerEvent e(self->native, event.button, Pointer::DOWN);
408
532
  Window_call_pointer_event(win, &e);
533
+
534
+ #if SDL_VERSION_ATLEAST(2, 0, 4)
535
+ SDL_CaptureMouse(SDL_TRUE);
536
+ #endif
409
537
  break;
410
538
  }
411
539
 
412
540
  case SDL_MOUSEBUTTONUP:
413
541
  {
414
- NativePointerEvent e(
415
- event.button, self->native, Pointer::UP);
542
+ NativePointerEvent e(self->native, event.button, Pointer::UP);
416
543
  Window_call_pointer_event(win, &e);
544
+
545
+ #if SDL_VERSION_ATLEAST(2, 0, 4)
546
+ static const uint32_t BUTTONS =
547
+ SDL_BUTTON_LMASK | SDL_BUTTON_RMASK | SDL_BUTTON_MMASK;
548
+ if ((SDL_GetMouseState(NULL, NULL) & BUTTONS) == 0)
549
+ SDL_CaptureMouse(SDL_FALSE);
550
+ #endif
417
551
  break;
418
552
  }
419
553
 
420
554
  case SDL_MOUSEMOTION:
421
555
  {
422
- NativePointerEvent e(event.motion, self->native);
556
+ NativePointerEvent e(self->native, event.motion);
423
557
  Window_call_pointer_event(win, &e);
424
558
  break;
425
559
  }
@@ -433,21 +567,21 @@ namespace Reflex
433
567
 
434
568
  case SDL_FINGERDOWN:
435
569
  {
436
- NativePointerEvent e(event.tfinger, self->native, Pointer::DOWN);
570
+ NativePointerEvent e(self->native, event.tfinger, Pointer::DOWN);
437
571
  Window_call_pointer_event(win, &e);
438
572
  break;
439
573
  }
440
574
 
441
575
  case SDL_FINGERUP:
442
576
  {
443
- NativePointerEvent e(event.tfinger, self->native, Pointer::UP);
577
+ NativePointerEvent e(self->native, event.tfinger, Pointer::UP);
444
578
  Window_call_pointer_event(win, &e);
445
579
  break;
446
580
  }
447
581
 
448
582
  case SDL_FINGERMOTION:
449
583
  {
450
- NativePointerEvent e(event.tfinger, self->native, Pointer::MOVE);
584
+ NativePointerEvent e(self->native, event.tfinger, Pointer::MOVE);
451
585
  Window_call_pointer_event(win, &e);
452
586
  break;
453
587
  }
@@ -476,11 +610,8 @@ namespace Reflex
476
610
 
477
611
  Window_call_update_event(win);
478
612
 
479
- if (self->redraw)
480
- {
613
+ if (Xot::check_and_remove_flag(&self->flags, Window::Data::REDRAW))
481
614
  redraw_window(self->native);
482
- self->redraw = false;
483
- }
484
615
  }
485
616
 
486
617
 
data/src/shape.cpp CHANGED
@@ -7,6 +7,7 @@
7
7
  #include <rays/polygon.h>
8
8
  #include "reflex/exception.h"
9
9
  #include "reflex/debug.h"
10
+ #include "application.h"
10
11
  #include "selector.h"
11
12
  #include "view.h"
12
13
  #include "world.h"
@@ -449,18 +450,22 @@ namespace Reflex
449
450
  if (!event)
450
451
  argument_error(__FILE__, __LINE__);
451
452
 
452
- shape->on_contact(event);
453
-
454
- switch (event->action())
453
+ // called back from box2d, which can not let an exception through
454
+ Application_guard([&]()
455
455
  {
456
- case ContactEvent::BEGIN: shape->on_contact_begin(event); break;
457
- case ContactEvent::END: shape->on_contact_end(event); break;
458
- default: break;
459
- }
456
+ shape->on_contact(event);
457
+
458
+ switch (event->action())
459
+ {
460
+ case ContactEvent::BEGIN: shape->on_contact_begin(event); break;
461
+ case ContactEvent::END: shape->on_contact_end(event); break;
462
+ default: break;
463
+ }
460
464
 
461
- if (event->is_blocked()) return;
465
+ if (event->is_blocked()) return;
462
466
 
463
- View_call_contact_event(shape->owner(), event);
467
+ View_call_contact_event(shape->owner(), event);
468
+ });
464
469
  }
465
470
 
466
471
 
@@ -705,7 +710,7 @@ namespace Reflex
705
710
  if (points.empty())
706
711
  return Polygon();
707
712
 
708
- return Rays::create_line(&points[0], points.size(), loop);
713
+ return Rays::create_line(points.data(), points.size(), loop);
709
714
  }
710
715
 
711
716
  Bounds get_fixed_frame () const override