reflexion 0.2 → 0.2.1

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.
data/src/osx/window.mm CHANGED
@@ -74,9 +74,9 @@ namespace Reflex
74
74
  Window_default_flags ()
75
75
  {
76
76
  return
77
- Window::FLAG_CLOSABLE |
78
- Window::FLAG_MINIMIZABLE |
79
- Window::FLAG_RESIZABLE;
77
+ Window::FLAG_CLOSABLE |
78
+ Window::FLAG_RESIZABLE |
79
+ Window::FLAG_MINIMIZABLE;
80
80
  }
81
81
 
82
82
  void
@@ -143,6 +143,15 @@ namespace Reflex
143
143
  return Bounds(f.origin.x, f.origin.y, f.size.width, f.size.height);
144
144
  }
145
145
 
146
+ Screen
147
+ Window_get_screen (const Window& window)
148
+ {
149
+ Screen s;
150
+ NSScreen* screen = get_native(&window).screen;
151
+ if (screen) Screen_initialize(&s, screen);
152
+ return s;
153
+ }
154
+
146
155
  void
147
156
  Window_set_flags (Window* window, uint flags)
148
157
  {
@@ -163,15 +172,6 @@ namespace Reflex
163
172
  [native toggleFullScreen: native];
164
173
  }
165
174
 
166
- Screen
167
- Window_get_screen (const Window& window)
168
- {
169
- Screen s;
170
- NSScreen* screen = get_native(&window).screen;
171
- if (screen) Screen_initialize(&s, screen);
172
- return s;
173
- }
174
-
175
175
  float
176
176
  Window_get_pixel_density (const Window& window)
177
177
  {
data/src/pointer.cpp CHANGED
@@ -28,21 +28,25 @@ namespace Reflex
28
28
  enum Flag
29
29
  {
30
30
 
31
- DRAG = Xot::bit(0, TYPE_LAST),
31
+ DRAG = Xot::bit(0, TYPE_LAST),
32
32
 
33
- ENTER = Xot::bit(1, TYPE_LAST),
33
+ ENTER = Xot::bit(1, TYPE_LAST),
34
34
 
35
- EXIT = Xot::bit(2, TYPE_LAST),
35
+ EXIT = Xot::bit(2, TYPE_LAST),
36
+
37
+ HAS_SYSTEM_ID = Xot::bit(3, TYPE_LAST),
38
+
39
+ HAS_PREV_POS = Xot::bit(4, TYPE_LAST),
36
40
 
37
41
  };// Flag
38
42
 
39
- ID id;
43
+ ID id, system_id;
40
44
 
41
45
  uint types;
42
46
 
43
47
  Action action;
44
48
 
45
- Point position;
49
+ Point position, prev_position;
46
50
 
47
51
  uint modifiers, flags;
48
52
 
@@ -74,6 +78,11 @@ namespace Reflex
74
78
  (exit ? EXIT : 0);
75
79
  }
76
80
 
81
+ bool is_valid () const
82
+ {
83
+ return id >= 0 && types != TYPE_NONE && action != ACTION_NONE;
84
+ }
85
+
77
86
  };// Pointer::Data
78
87
 
79
88
 
@@ -122,13 +131,43 @@ namespace Reflex
122
131
  void
123
132
  Pointer_set_prev (Pointer* it, const Pointer* prev)
124
133
  {
125
- it->self->prev.reset(prev ? new Pointer(*prev) : NULL);
134
+ it->self->prev.reset(prev && *prev ? new Pointer(*prev) : NULL);
126
135
  }
127
136
 
128
137
  void
129
138
  Pointer_set_down (Pointer* it, const Pointer* down)
130
139
  {
131
- it->self->down.reset(down ? new Pointer(*down) : NULL);
140
+ it->self->down.reset(down && *down ? new Pointer(*down) : NULL);
141
+ }
142
+
143
+ void
144
+ Pointer_set_system_id (Pointer*it, Pointer::ID id)
145
+ {
146
+ it->self->system_id = id;
147
+ Xot::add_flag(&it->self->flags, Pointer::Data::HAS_SYSTEM_ID);
148
+ }
149
+
150
+ const Pointer::ID*
151
+ Pointer_get_system_id (const Pointer& it)
152
+ {
153
+ if (!Xot::has_flag(it.self->flags, Pointer::Data::HAS_SYSTEM_ID))
154
+ return NULL;
155
+ return &it.self->system_id;
156
+ }
157
+
158
+ void
159
+ Pointer_set_prev_position (Pointer* it, const Point& position)
160
+ {
161
+ it->self->prev_position = position;
162
+ Xot::add_flag(&it->self->flags, Pointer::Data::HAS_PREV_POS);
163
+ }
164
+
165
+ const Point*
166
+ Pointer_get_prev_position (const Pointer& it)
167
+ {
168
+ if (!Xot::has_flag(it.self->flags, Pointer::Data::HAS_PREV_POS))
169
+ return NULL;
170
+ return &it.self->prev_position;
132
171
  }
133
172
 
134
173
 
@@ -226,14 +265,17 @@ namespace Reflex
226
265
  const Pointer*
227
266
  Pointer::down () const
228
267
  {
229
- return self->down.get();
268
+ if (self->down)
269
+ return self->down.get();
270
+ else if (action() == DOWN)
271
+ return this;
272
+ else
273
+ return NULL;
230
274
  }
231
275
 
232
276
  Pointer::operator bool () const
233
277
  {
234
- return
235
- self->types != TYPE_NONE &&
236
- ACTION_NONE < self->action && self->action <= STAY;
278
+ return self->is_valid();
237
279
  }
238
280
 
239
281
  bool
data/src/pointer.h CHANGED
@@ -28,6 +28,14 @@ namespace Reflex
28
28
 
29
29
  void Pointer_set_down (Pointer* it, const Pointer* down);
30
30
 
31
+ void Pointer_set_system_id (Pointer* it, Pointer::ID id);
32
+
33
+ const Pointer::ID* Pointer_get_system_id (const Pointer& it);
34
+
35
+ void Pointer_set_prev_position (Pointer* it, const Point& position);
36
+
37
+ const Point* Pointer_get_prev_position (const Pointer& it);
38
+
31
39
 
32
40
  }// Reflex
33
41
 
data/src/view.cpp CHANGED
@@ -245,7 +245,7 @@ namespace Reflex
245
245
  void
246
246
  get_view2body_matrix (Matrix* m)
247
247
  {
248
- assert(m && *m == 1 && ppivot && *ppivot != 0);
248
+ assert(*m == 1 && ppivot && *ppivot != 0);
249
249
 
250
250
  Point pivot = *ppivot * frame.size();
251
251
  m->translate(frame.position() + pivot)
@@ -256,7 +256,7 @@ namespace Reflex
256
256
  void
257
257
  get_body2view_matrix (Matrix* m)
258
258
  {
259
- assert(m && *m == 1 && ppivot && *ppivot != 0 && pbody);
259
+ assert(*m == 1 && ppivot && *ppivot != 0 && pbody);
260
260
 
261
261
  Point pos = pbody->position();
262
262
  Point pivot = *ppivot * frame.size();
@@ -288,8 +288,6 @@ namespace Reflex
288
288
 
289
289
  World* child_world (View* view, bool create = true)
290
290
  {
291
- assert(view);
292
-
293
291
  if (!pchild_world && create)
294
292
  {
295
293
  pchild_world.reset(new World());
@@ -301,8 +299,6 @@ namespace Reflex
301
299
 
302
300
  void create_walls (View* view)
303
301
  {
304
- assert(view);
305
-
306
302
  clear_walls(view);
307
303
 
308
304
  View* wall = new View(WALL_NAME);
@@ -314,8 +310,6 @@ namespace Reflex
314
310
 
315
311
  void clear_walls (View* view)
316
312
  {
317
- assert(view);
318
-
319
313
  for (auto& wall : view->find_children(WALL_NAME))
320
314
  view->remove_child(wall.get());
321
315
  }
@@ -364,8 +358,6 @@ namespace Reflex
364
358
 
365
359
  void do_sort_children ()
366
360
  {
367
- assert(pchildren);
368
-
369
361
  auto& children = *pchildren;
370
362
 
371
363
  size_t size = children.size();
@@ -475,8 +467,6 @@ namespace Reflex
475
467
 
476
468
  static void get_flow_sign (schar* h, schar* v, Style::Flow flow)
477
469
  {
478
- assert(h && v);
479
-
480
470
  switch (flow)
481
471
  {
482
472
  case Style::FLOW_RIGHT: *h = +1; *v = 0; break;
@@ -491,8 +481,6 @@ namespace Reflex
491
481
  iterator* line_end, coord* main_fill_size, coord* sub_size_max,
492
482
  iterator begin, iterator end)
493
483
  {
494
- assert(line_end && main_fill_size && sub_size_max);
495
-
496
484
  *line_end = end;
497
485
  *main_fill_size = 0;
498
486
  *sub_size_max = 0;
@@ -545,8 +533,6 @@ namespace Reflex
545
533
  void place_child (
546
534
  View* child, Point* position, coord main_fill_size, coord sub_size_max)
547
535
  {
548
- assert(child && position);
549
-
550
536
  const Style* style = child->self->pstyle.get();
551
537
  Bounds frame = child->frame();
552
538
  bool update = false;
@@ -567,8 +553,6 @@ namespace Reflex
567
553
  Bounds* frame,
568
554
  const Style* style, coord main_fill_size, coord sub_size_max)
569
555
  {
570
- assert(frame);
571
-
572
556
  bool update = false;
573
557
 
574
558
  if (has_fill_length(style, DIR_MAIN))
@@ -582,8 +566,6 @@ namespace Reflex
582
566
 
583
567
  bool place_in_flow (Bounds* frame, Point* position)
584
568
  {
585
- assert(frame && position);
586
-
587
569
  coord old_x = frame->x;
588
570
  coord old_y = frame->y;
589
571
 
@@ -604,8 +586,6 @@ namespace Reflex
604
586
 
605
587
  bool place_position (Bounds* frame, const Style* style)
606
588
  {
607
- assert(frame);
608
-
609
589
  if (!style)
610
590
  return false;
611
591
 
@@ -666,8 +646,6 @@ namespace Reflex
666
646
 
667
647
  bool set_flow_size (Bounds* frame, coord size, FlowDirection dir) const
668
648
  {
669
- assert(frame);
670
-
671
649
  coord& value = flow_value(frame->width, frame->height, dir);
672
650
  if (value == size) return false;
673
651
 
@@ -745,15 +723,11 @@ namespace Reflex
745
723
  static void
746
724
  apply_style_to_children_have_variable_lengths (View* parent)
747
725
  {
748
- assert(parent);
749
-
750
726
  View::ChildList* children = parent->self->children();
751
727
  if (!children) return;
752
728
 
753
729
  for (auto& child : *children)
754
730
  {
755
- assert(child);
756
-
757
731
  if (child->self->has_flag(View::Data::HAS_VARIABLE_LENGTHS))
758
732
  child->self->add_flag(View::Data::APPLY_STYLE);
759
733
  }
@@ -762,7 +736,6 @@ namespace Reflex
762
736
  static void
763
737
  update_view_layout (View* view, bool update_parent = false)
764
738
  {
765
- assert(view);
766
739
  View::Data* self = view->self.get();
767
740
 
768
741
  self->add_flag(View::Data::UPDATE_LAYOUT);
@@ -776,7 +749,6 @@ namespace Reflex
776
749
  View* view, const Bounds& frame, float zoom, float angle,
777
750
  bool update_body = true)
778
751
  {
779
- assert(view);
780
752
  View::Data* self = view->self.get();
781
753
 
782
754
  if (frame == self->frame && zoom == self->zoom && angle == self->angle)
@@ -854,8 +826,6 @@ namespace Reflex
854
826
  View::ChildList* result, const View* view, const Selector& selector,
855
827
  bool recursive)
856
828
  {
857
- assert(result && view);
858
-
859
829
  View::ChildList* children = view->self->children();
860
830
  if (!children) return;
861
831
 
@@ -877,8 +847,6 @@ namespace Reflex
877
847
  View::StyleList* result, const View* view, const Selector& selector,
878
848
  bool recursive)
879
849
  {
880
- assert(result && view);
881
-
882
850
  View::StyleList* pstyles = view->self->pstyles.get();
883
851
  if (pstyles)
884
852
  {
@@ -902,8 +870,6 @@ namespace Reflex
902
870
  static void
903
871
  fire_timers (View* view, double now)
904
872
  {
905
- assert(view);
906
-
907
873
  Timers* timers = view->self->ptimers.get();
908
874
  if (timers)
909
875
  timers->fire(now);
@@ -912,7 +878,6 @@ namespace Reflex
912
878
  static void
913
879
  update_view_shapes (View* view)
914
880
  {
915
- assert(view);
916
881
  View::Data* self = view->self.get();
917
882
 
918
883
  bool create_shape = self->pbody && !self->pshape;
@@ -927,7 +892,6 @@ namespace Reflex
927
892
  static void
928
893
  update_view_body (View* view)
929
894
  {
930
- assert(view);
931
895
  View::Data* self = view->self.get();
932
896
 
933
897
  Body* body = self->pbody.get();
@@ -954,7 +918,6 @@ namespace Reflex
954
918
  static void
955
919
  update_child_world (View* view, float dt)
956
920
  {
957
- assert(view);
958
921
  View::Data* self = view->self.get();
959
922
 
960
923
  World* child_world = self->pchild_world.get();
@@ -973,7 +936,6 @@ namespace Reflex
973
936
  static void
974
937
  update_views_for_selectors (View* view)
975
938
  {
976
- assert(view);
977
939
  View::Data* self = view->self.get();
978
940
 
979
941
  View::Data::SelectorSet* sels = self->pselectors_for_update.get();
@@ -1001,8 +963,6 @@ namespace Reflex
1001
963
  get_styles_for_selector (
1002
964
  View::StyleList* result, View* view, const Selector& selector)
1003
965
  {
1004
- assert(result);
1005
-
1006
966
  View* parent = view->parent();
1007
967
  if (parent)
1008
968
  get_styles_for_selector(result, parent, selector);
@@ -1013,8 +973,6 @@ namespace Reflex
1013
973
  static bool
1014
974
  get_styles_for_view (View::StyleList* result, View* view)
1015
975
  {
1016
- assert(result && view);
1017
-
1018
976
  result->clear();
1019
977
 
1020
978
  Selector* sel = view->self->pselector.get();
@@ -1028,7 +986,6 @@ namespace Reflex
1028
986
  static void
1029
987
  update_view_style (View* view)
1030
988
  {
1031
- assert(view);
1032
989
  View::Data* self = view->self.get();
1033
990
 
1034
991
  Style* pstyle = self->pstyle.get();
@@ -1057,8 +1014,6 @@ namespace Reflex
1057
1014
  static void
1058
1015
  fit_view_to_content (View* view)
1059
1016
  {
1060
- assert(view);
1061
-
1062
1017
  Bounds bounds = view->content_bounds();
1063
1018
  if (!bounds) return;
1064
1019
 
@@ -1121,7 +1076,6 @@ namespace Reflex
1121
1076
  static bool
1122
1077
  use_cache (View* view)
1123
1078
  {
1124
- assert(view);
1125
1079
  View::Data* self = view->self.get();
1126
1080
 
1127
1081
  return
@@ -1132,7 +1086,7 @@ namespace Reflex
1132
1086
  static bool
1133
1087
  reset_cache_image (View* view, const Painter& painter)
1134
1088
  {
1135
- assert(view && use_cache(view));
1089
+ assert(use_cache(view));
1136
1090
  View::Data* self = view->self.get();
1137
1091
 
1138
1092
  Image* image = self->pcache_image.get();
@@ -1155,8 +1109,6 @@ namespace Reflex
1155
1109
  static void
1156
1110
  setup_painter (Painter* painter, const Color& fill, const Color& stroke)
1157
1111
  {
1158
- assert(painter);
1159
-
1160
1112
  painter->set_fill(fill);
1161
1113
  painter->set_stroke(stroke);
1162
1114
  }
@@ -1164,11 +1116,7 @@ namespace Reflex
1164
1116
  static void
1165
1117
  draw_default_shape (View* view, DrawEvent* event)
1166
1118
  {
1167
- assert(view && event);
1168
-
1169
- Painter* painter = event->painter();
1170
- assert(painter);
1171
-
1119
+ Painter* painter = event->painter();
1172
1120
  const Style& style = View_get_style(view);
1173
1121
  const Color& back_fill = style.background_fill();
1174
1122
  const Color& back_stroke = style.background_stroke();
@@ -1189,8 +1137,6 @@ namespace Reflex
1189
1137
  static void
1190
1138
  draw_content (View* view, DrawEvent* event)
1191
1139
  {
1192
- assert(view && event && event->painter());
1193
-
1194
1140
  draw_default_shape(view, event);
1195
1141
 
1196
1142
  const Style& style = View_get_style(view);
@@ -1211,7 +1157,6 @@ namespace Reflex
1211
1157
  draw_view (
1212
1158
  View* view, DrawEvent* event, const Point& offset, const Bounds& clip)
1213
1159
  {
1214
- assert(view && event && event->painter());
1215
1160
  View::Data* self = view->self.get();
1216
1161
 
1217
1162
  Painter* p = event->painter();
@@ -1250,8 +1195,6 @@ namespace Reflex
1250
1195
  static void
1251
1196
  draw_view_to_cache (View* view, DrawEvent* event)
1252
1197
  {
1253
- assert(view && event && event->painter() && view->self->pcache_image);
1254
-
1255
1198
  Painter* view_painter = event->painter();
1256
1199
  Painter cache_painter = view->self->pcache_image->painter();
1257
1200
 
@@ -1267,7 +1210,6 @@ namespace Reflex
1267
1210
  static bool
1268
1211
  draw_view_with_cache (View* view, DrawEvent* event, bool redraw)
1269
1212
  {
1270
- assert(view && event && event->painter());
1271
1213
  View::Data* self = view->self.get();
1272
1214
 
1273
1215
  if (!use_cache(view))
@@ -1403,8 +1345,6 @@ namespace Reflex
1403
1345
  static void
1404
1346
  call_children (View* parent, std::function<bool(View*)> fun, bool sort = true)
1405
1347
  {
1406
- assert(parent);
1407
-
1408
1348
  auto* children = parent->self->children(false, sort);
1409
1349
  if (!children) return;
1410
1350
 
@@ -1418,8 +1358,6 @@ namespace Reflex
1418
1358
  static void
1419
1359
  call_pointer_events_for_each_child (View* parent, PointerEvent* event)
1420
1360
  {
1421
- assert(parent && event);
1422
-
1423
1361
  call_children(parent, [&](View* child) {
1424
1362
  PointerEvent e = event->dup();
1425
1363
  PointerEvent_update_for_child_view(&e, child);
@@ -1431,8 +1369,6 @@ namespace Reflex
1431
1369
  static void
1432
1370
  call_pointer_events (View* view, PointerEvent* event)
1433
1371
  {
1434
- assert(view && event);
1435
-
1436
1372
  if (view->self->pbody)
1437
1373
  view->self->pbody->awake();
1438
1374
 
@@ -1454,8 +1390,6 @@ namespace Reflex
1454
1390
  static void
1455
1391
  register_captures (View* view, const PointerEvent& event)
1456
1392
  {
1457
- assert(view);
1458
-
1459
1393
  Window* win = view->window();
1460
1394
  if (!win)
1461
1395
  invalid_state_error(__FILE__, __LINE__);
@@ -1470,8 +1404,6 @@ namespace Reflex
1470
1404
  static void
1471
1405
  unregister_captures (View* view, const PointerEvent& event)
1472
1406
  {
1473
- assert(view);
1474
-
1475
1407
  Window* win = view->window();
1476
1408
  if (!win)
1477
1409
  invalid_state_error(__FILE__, __LINE__);
@@ -1666,7 +1598,6 @@ namespace Reflex
1666
1598
  static void
1667
1599
  get_from_parent_matrix (Matrix* m, const View* view)
1668
1600
  {
1669
- assert(m && view);
1670
1601
  View::Data* self = view->self.get();
1671
1602
 
1672
1603
  const auto& frame = self->frame;
@@ -1689,7 +1620,6 @@ namespace Reflex
1689
1620
  static void
1690
1621
  get_to_parent_matrix (Matrix* m, const View* view)
1691
1622
  {
1692
- assert(m && view);
1693
1623
  View::Data* self = view->self.get();
1694
1624
 
1695
1625
  const auto& frame = self->frame;
@@ -1778,7 +1708,6 @@ namespace Reflex
1778
1708
  static void
1779
1709
  set_parent (View* view, View* parent)
1780
1710
  {
1781
- assert(view);
1782
1711
  View::Data* self = view->self.get();
1783
1712
 
1784
1713
  if (parent == self->parent) return;
@@ -1790,8 +1719,6 @@ namespace Reflex
1790
1719
  static void
1791
1720
  erase_child_from_children (View* parent, View* child)
1792
1721
  {
1793
- assert(parent && child);
1794
-
1795
1722
  View::ChildList* children = parent->self->children();
1796
1723
  if (!children) return;
1797
1724
 
@@ -1918,8 +1845,6 @@ namespace Reflex
1918
1845
  static Style*
1919
1846
  add_view_style (View* view, Style style)
1920
1847
  {
1921
- assert(view);
1922
-
1923
1848
  if (!Style_set_owner(&style, view))
1924
1849
  return NULL;
1925
1850
 
data/src/window.cpp CHANGED
@@ -223,6 +223,109 @@ namespace Reflex
223
223
  cleanup_captures(window);
224
224
  }
225
225
 
226
+ static Pointer::ID
227
+ get_next_pointer_id (Window* window)
228
+ {
229
+ return window->self->next_pointer_id++;
230
+ }
231
+
232
+ static void
233
+ setup_mouse_pointer (Window* window, Pointer* pointer)
234
+ {
235
+ static const uint MOUSE_BUTTONS =
236
+ Pointer::MOUSE_LEFT |
237
+ Pointer::MOUSE_RIGHT |
238
+ Pointer::MOUSE_MIDDLE;
239
+
240
+ Window::Data* self = window->self.get();
241
+
242
+ auto action = pointer->action();
243
+ auto& prev_pointer = self->prev_mouse_pointer;
244
+
245
+ auto id = prev_pointer ? prev_pointer.id() : get_next_pointer_id(window);
246
+ auto* down = prev_pointer.down();
247
+ if (
248
+ Pointer_mask_flag(prev_pointer, MOUSE_BUTTONS) == 0 &&
249
+ (action == Pointer::DOWN || prev_pointer.action() == Pointer::UP))
250
+ {
251
+ id = get_next_pointer_id(window);
252
+ down = NULL;
253
+ }
254
+
255
+ Pointer_set_id(pointer, id);
256
+ Pointer_add_flag(pointer, Pointer_mask_flag(prev_pointer, MOUSE_BUTTONS));
257
+ Pointer_set_prev(pointer, &prev_pointer);
258
+ Pointer_set_down(pointer, down);
259
+
260
+ if (action == Pointer::DOWN)
261
+ Pointer_add_flag(pointer, pointer->types() & MOUSE_BUTTONS);
262
+
263
+ prev_pointer = *pointer;
264
+ Pointer_set_prev(&prev_pointer, NULL);
265
+
266
+ if (action == Pointer::UP || action == Pointer::CANCEL)
267
+ Pointer_remove_flag(&prev_pointer, prev_pointer.types() & MOUSE_BUTTONS);
268
+ }
269
+
270
+ static PointerList::const_iterator
271
+ find_prev_pointer (const Pointer& pointer, const PointerList& prev_pointers)
272
+ {
273
+ const auto* sys_id = Pointer_get_system_id(pointer);
274
+ const auto* prev_pos = Pointer_get_prev_position(pointer);
275
+
276
+ return std::find_if(
277
+ prev_pointers.begin(), prev_pointers.end(),
278
+ [&](const Pointer& p)
279
+ {
280
+ if (sys_id)
281
+ {
282
+ const auto* id = Pointer_get_system_id(p);
283
+ if (id && *id == *sys_id) return true;
284
+ }
285
+ return prev_pos && *prev_pos == p.position();
286
+ });
287
+ }
288
+
289
+ static void
290
+ setup_pointer (Window* window, Pointer* pointer)
291
+ {
292
+ Window::Data* self = window->self.get();
293
+
294
+ PointerList& prev_pointers = self->prev_pointers;
295
+ auto it = find_prev_pointer(*pointer, prev_pointers);
296
+ const Pointer* prev_pointer = it != prev_pointers.end() && *it ? &*it : NULL;
297
+
298
+ if (prev_pointer)
299
+ {
300
+ Pointer_set_id(pointer, prev_pointer->id());
301
+ Pointer_set_prev(pointer, prev_pointer);
302
+ Pointer_set_down(pointer, prev_pointer->down());
303
+ prev_pointers.erase(it);
304
+ }
305
+ else
306
+ Pointer_set_id(pointer, get_next_pointer_id(window));
307
+
308
+ auto action = pointer->action();
309
+ if (action != Pointer::UP && action != Pointer::CANCEL)
310
+ {
311
+ prev_pointers.emplace_back(*pointer);
312
+ Pointer_set_prev(&prev_pointers.back(), NULL);
313
+ }
314
+ }
315
+
316
+ static void
317
+ setup_pointer_event (Window* window, PointerEvent* event)
318
+ {
319
+ for (size_t i = 0; i < event->size(); ++i)
320
+ {
321
+ Pointer& pointer = PointerEvent_pointer_at(event, i);
322
+ if (pointer.types() & Pointer::MOUSE)
323
+ setup_mouse_pointer(window, &pointer);
324
+ else
325
+ setup_pointer(window, &pointer);
326
+ }
327
+ }
328
+
226
329
  static void
227
330
  get_views_capturing_all_pointers (Window* window, ViewList* result)
228
331
  {
@@ -395,6 +498,8 @@ namespace Reflex
395
498
  if (!event)
396
499
  argument_error(__FILE__, __LINE__);
397
500
 
501
+ setup_pointer_event(window, event);
502
+
398
503
  window->on_pointer(event);
399
504
 
400
505
  switch ((*event)[0].action())