reflexion 0.1.22 → 0.1.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/event.cpp +9 -1
  3. data/.doc/ext/reflex/key_event.cpp +3 -3
  4. data/.doc/ext/reflex/native.cpp +2 -0
  5. data/.doc/ext/reflex/pointer.cpp +158 -0
  6. data/.doc/ext/reflex/pointer_event.cpp +29 -88
  7. data/.doc/ext/reflex/selector.cpp +8 -0
  8. data/.doc/ext/reflex/view.cpp +57 -0
  9. data/.doc/ext/reflex/window.cpp +24 -0
  10. data/VERSION +1 -1
  11. data/ext/reflex/event.cpp +11 -2
  12. data/ext/reflex/key_event.cpp +3 -3
  13. data/ext/reflex/native.cpp +2 -0
  14. data/ext/reflex/pointer.cpp +170 -0
  15. data/ext/reflex/pointer_event.cpp +29 -94
  16. data/ext/reflex/selector.cpp +9 -0
  17. data/ext/reflex/view.cpp +67 -3
  18. data/ext/reflex/window.cpp +30 -3
  19. data/include/reflex/defs.h +0 -18
  20. data/include/reflex/event.h +26 -27
  21. data/include/reflex/pointer.h +107 -0
  22. data/include/reflex/ruby/pointer.h +41 -0
  23. data/include/reflex/ruby/view.h +9 -0
  24. data/include/reflex/ruby/window.h +9 -0
  25. data/include/reflex/selector.h +1 -1
  26. data/include/reflex/view.h +6 -4
  27. data/include/reflex/window.h +10 -8
  28. data/lib/reflex/key_event.rb +1 -1
  29. data/lib/reflex/pointer.rb +107 -0
  30. data/lib/reflex/pointer_event.rb +16 -54
  31. data/lib/reflex.rb +1 -0
  32. data/reflex.gemspec +5 -5
  33. data/src/event.cpp +189 -37
  34. data/src/event.h +32 -0
  35. data/src/ios/event.h +15 -3
  36. data/src/ios/event.mm +126 -11
  37. data/src/ios/view_controller.mm +49 -21
  38. data/src/osx/event.h +6 -3
  39. data/src/osx/event.mm +40 -22
  40. data/src/osx/native_window.mm +79 -16
  41. data/src/pointer.cpp +203 -0
  42. data/src/pointer.h +26 -0
  43. data/src/selector.cpp +1 -1
  44. data/src/view.cpp +83 -72
  45. data/src/view.h +0 -4
  46. data/src/window.cpp +321 -97
  47. data/src/window.h +22 -3
  48. data/test/test_event.rb +16 -2
  49. data/test/test_pointer.rb +149 -0
  50. data/test/test_pointer_event.rb +70 -104
  51. data/test/test_selector.rb +7 -0
  52. data/test/test_view.rb +38 -11
  53. data/test/test_window.rb +27 -25
  54. metadata +46 -35
data/src/event.cpp CHANGED
@@ -1,9 +1,11 @@
1
- #include "reflex/event.h"
1
+ #include "event.h"
2
2
 
3
3
 
4
4
  #include "reflex/timer.h"
5
5
  #include "reflex/shape.h"
6
6
  #include "reflex/exception.h"
7
+ #include "view.h"
8
+ #include "pointer.h"
7
9
 
8
10
 
9
11
  namespace Reflex
@@ -11,7 +13,7 @@ namespace Reflex
11
13
 
12
14
 
13
15
  Event::Event ()
14
- : blocked(false)
16
+ : blocked(false), time_(Xot::time())
15
17
  {
16
18
  }
17
19
 
@@ -27,6 +29,12 @@ namespace Reflex
27
29
  return blocked;
28
30
  }
29
31
 
32
+ double
33
+ Event::time () const
34
+ {
35
+ return time_;
36
+ }
37
+
30
38
 
31
39
  UpdateEvent::UpdateEvent (double now, float dt)
32
40
  : now(now), dt(dt)
@@ -123,76 +131,220 @@ namespace Reflex
123
131
 
124
132
 
125
133
  KeyEvent::KeyEvent ()
126
- : type(NONE), code(KEY_NONE), modifiers(MOD_NONE), repeat(0), capture(false)
134
+ : type(NONE), code(KEY_NONE), modifiers(MOD_NONE), repeat(0), captured(false)
127
135
  {
128
136
  }
129
137
 
130
138
  KeyEvent::KeyEvent (
131
139
  Type type, const char* chars, int code, uint modifiers, int repeat)
132
140
  : type(type), chars(chars ? chars : ""), code(code), modifiers(modifiers),
133
- repeat(repeat), capture(false)
141
+ repeat(repeat), captured(false)
134
142
  {
135
143
  }
136
144
 
137
145
 
138
- PointerEvent::PointerEvent ()
139
- : type(NONE), pointer_type(POINTER_NONE),
140
- size(0), modifiers(MOD_NONE), count(0), drag(false), capture(false),
141
- x(0), y(0), z(0)
146
+ struct PointerEvent::Data
147
+ {
148
+
149
+ std::vector<Pointer> pointers;
150
+
151
+ bool captured;
152
+
153
+ Data (bool captured = false)
154
+ : captured(captured)
155
+ {
156
+ }
157
+
158
+ };// PointerEvent::Data
159
+
160
+
161
+ void
162
+ PointerEvent_add_pointer (PointerEvent* pthis, const Pointer& pointer)
142
163
  {
164
+ if (!pthis)
165
+ argument_error(__FILE__, __LINE__);
166
+
167
+ pthis->self->pointers.emplace_back(pointer);
143
168
  }
144
169
 
145
- PointerEvent::PointerEvent (
146
- Type type, uint pointer_type, coord x, coord y, uint modifiers, uint count, bool drag)
147
- : type(type), pointer_type(pointer_type),
148
- size(1), modifiers(modifiers), count(count), drag(drag), capture(false),
149
- x(x), y(y), z(0)
170
+ void
171
+ PointerEvent_erase_pointer (PointerEvent* pthis, Pointer::ID id)
150
172
  {
173
+ if (!pthis)
174
+ argument_error(__FILE__, __LINE__);
175
+
176
+ auto& pointers = pthis->self->pointers;
177
+ auto it = std::find_if(
178
+ pointers.begin(), pointers.end(),
179
+ [=](const auto& pointer)
180
+ {
181
+ return pointer.id() == id;
182
+ });
183
+
184
+ if (it == pointers.end()) return;
185
+
186
+ pointers.erase(it);
151
187
  }
152
188
 
153
- PointerEvent::PointerEvent (
154
- Type type, uint pointer_type, const Point* positions_, size_t size,
155
- uint modifiers, uint count, bool drag)
156
- : type(type), pointer_type(pointer_type),
157
- size(size), modifiers(modifiers), count(count), drag(drag), capture(false)
189
+ Pointer&
190
+ PointerEvent_pointer_at (PointerEvent* pthis, size_t index)
158
191
  {
159
- if (!positions_ && size > 0)
192
+ if (!pthis)
160
193
  argument_error(__FILE__, __LINE__);
161
194
 
162
- if (size > MAX) size = MAX;
195
+ auto& pointers = pthis->self->pointers;
196
+ if (index >= pointers.size())
197
+ index_error(__FILE__, __LINE__);
163
198
 
164
- if (positions_)
199
+ return pointers[index];
200
+ }
201
+
202
+ void
203
+ PointerEvent_each_pointer (
204
+ const PointerEvent* pthis, std::function<void(const Pointer&)> fun)
205
+ {
206
+ if (!pthis)
207
+ argument_error(__FILE__, __LINE__);
208
+
209
+ for (const auto& pointer : pthis->self->pointers)
210
+ fun(pointer);
211
+ }
212
+
213
+ static void
214
+ filter_and_offset_pointer_positions (PointerEvent* event, const Bounds& frame)
215
+ {
216
+ assert(event);
217
+
218
+ const Point& offset = frame.position();
219
+
220
+ std::vector<Pointer> pointers;
221
+ for (const auto& pointer : event->self->pointers)
165
222
  {
166
- for (size_t i = 0; i < size; ++i)
167
- positions[i] = *(Coord3*) &positions_[i];
223
+ if (!frame.is_include(pointer.position()))
224
+ continue;
225
+
226
+ pointers.emplace_back(pointer);
227
+ Pointer_update_positions(&pointers.back(), [&](Point* pos)
228
+ {
229
+ *pos -= offset;
230
+ });
168
231
  }
232
+
233
+ event->self->pointers = pointers;
169
234
  }
170
235
 
171
- Point&
172
- PointerEvent::position (size_t i)
236
+ static void
237
+ scroll_and_zoom_pointer_positions (
238
+ PointerEvent* event, const Point& scroll, float zoom)
173
239
  {
174
- if (i >= size)
175
- index_error(__FILE__, __LINE__);
240
+ assert(event);
241
+
242
+ if (zoom == 0)
243
+ argument_error(__FILE__, __LINE__);
244
+
245
+ if (scroll == 0 && zoom == 1)
246
+ return;
176
247
 
177
- return *(Point*) &positions[i];
248
+ for (auto& pointer : event->self->pointers)
249
+ {
250
+ Pointer_update_positions(&pointer, [=](Point* pos)
251
+ {
252
+ *pos -= scroll;
253
+ *pos /= zoom;
254
+ });
255
+ }
178
256
  }
179
257
 
180
- const Point&
181
- PointerEvent::position (size_t i) const
258
+ void
259
+ PointerEvent_update_for_child_view (PointerEvent* pthis, const View* view)
182
260
  {
183
- return const_cast<PointerEvent*>(this)->position(i);
261
+ if (!pthis || !view)
262
+ argument_error(__FILE__, __LINE__);
263
+
264
+ filter_and_offset_pointer_positions(pthis, view->frame());
265
+ scroll_and_zoom_pointer_positions(pthis, view->scroll(), view->zoom());
184
266
  }
185
267
 
186
- Point&
187
- PointerEvent::operator [] (size_t i)
268
+ void
269
+ PointerEvent_update_for_capturing_view (PointerEvent* pthis, const View* view)
188
270
  {
189
- return position(i);
271
+ if (!pthis || !view)
272
+ argument_error(__FILE__, __LINE__);
273
+
274
+ for (auto& pointer : pthis->self->pointers)
275
+ {
276
+ Pointer_update_positions(&pointer, [=](Point* pos)
277
+ {
278
+ *pos = view->from_window(*pos);
279
+ });
280
+ }
281
+
282
+ scroll_and_zoom_pointer_positions(pthis, view->scroll(), view->zoom());
190
283
  }
191
284
 
192
- const Point&
193
- PointerEvent::operator [] (size_t i) const
285
+
286
+ PointerEvent::PointerEvent (bool captured)
287
+ : self(new Data(captured))
288
+ {
289
+ }
290
+
291
+ PointerEvent::PointerEvent (const Pointer& pointer, bool captured)
292
+ : self(new Data(captured))
293
+ {
294
+ self->pointers.emplace_back(pointer);
295
+ }
296
+
297
+ PointerEvent::PointerEvent (const Pointer* pointers, size_t size, bool captured)
298
+ : self(new Data(captured))
299
+ {
300
+ for (size_t i = 0; i < size; ++i)
301
+ self->pointers.emplace_back(pointers[i]);
302
+ }
303
+
304
+ PointerEvent::PointerEvent (const This& obj)
305
+ : self(new Data(*obj.self))
306
+ {
307
+ }
308
+
309
+ PointerEvent&
310
+ PointerEvent::operator = (const This& obj)
311
+ {
312
+ if (&obj == this) return *this;
313
+
314
+ Event::operator=(obj);
315
+ *self = *obj.self;
316
+ return *this;
317
+ }
318
+
319
+ PointerEvent::~PointerEvent ()
194
320
  {
195
- return position(i);
321
+ }
322
+
323
+ size_t
324
+ PointerEvent::size () const
325
+ {
326
+ return self->pointers.size();
327
+ }
328
+
329
+ bool
330
+ PointerEvent::empty () const
331
+ {
332
+ return size() == 0;
333
+ }
334
+
335
+ bool
336
+ PointerEvent::is_captured () const
337
+ {
338
+ return self->captured;
339
+ }
340
+
341
+ const Pointer&
342
+ PointerEvent::operator [] (size_t index) const
343
+ {
344
+ if (index >= self->pointers.size())
345
+ index_error(__FILE__, __LINE__);
346
+
347
+ return self->pointers[index];
196
348
  }
197
349
 
198
350
 
data/src/event.h ADDED
@@ -0,0 +1,32 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __REFLEX_SRC_EVENT_H__
4
+ #define __REFLEX_SRC_EVENT_H__
5
+
6
+
7
+ #include <functional>
8
+ #include <reflex/event.h>
9
+
10
+
11
+ namespace Reflex
12
+ {
13
+
14
+
15
+ void PointerEvent_add_pointer (PointerEvent* pthis, const Pointer& pointer);
16
+
17
+ void PointerEvent_erase_pointer (PointerEvent* pthis, Pointer::ID id);
18
+
19
+ Pointer& PointerEvent_pointer_at (PointerEvent* pthis, size_t index);
20
+
21
+ void PointerEvent_each_pointer (
22
+ const PointerEvent* pthis, std::function<void(const Pointer&)> fun);
23
+
24
+ void PointerEvent_update_for_child_view (PointerEvent* pthis, const View* view);
25
+
26
+ void PointerEvent_update_for_capturing_view (PointerEvent* pthis, const View* view);
27
+
28
+
29
+ }// Reflex
30
+
31
+
32
+ #endif//EOH
data/src/ios/event.h CHANGED
@@ -4,18 +4,30 @@
4
4
  #define __REFLEX_SRC_IOS_EVENT_H__
5
5
 
6
6
 
7
+ #include <list>
7
8
  #import <UIKit/UIEvent.h>
8
- #include <reflex/event.h>
9
+ #include "../event.h"
9
10
 
10
11
 
11
12
  namespace Reflex
12
13
  {
13
14
 
14
15
 
15
- struct NativePointerEvent : public PointerEvent
16
+ typedef std::list<Pointer> PrevPointerList;
17
+
18
+
19
+ class NativePointerEvent : public PointerEvent
16
20
  {
17
21
 
18
- NativePointerEvent (NSSet* touches, UIEvent* event, UIView* view, Type type);
22
+ public:
23
+
24
+ NativePointerEvent (
25
+ NSSet* touches, UIEvent* event, UIView* view,
26
+ Pointer::ID* pointer_id);
27
+
28
+ NativePointerEvent (
29
+ NSSet* touches, UIEvent* event, UIView* view,
30
+ PrevPointerList* prev_pointers);
19
31
 
20
32
  };// NativePointerEvent
21
33
 
data/src/ios/event.mm CHANGED
@@ -3,30 +3,145 @@
3
3
 
4
4
 
5
5
  #include <assert.h>
6
+ #include <algorithm>
7
+ #include "../pointer.h"
6
8
 
7
9
 
8
10
  namespace Reflex
9
11
  {
10
12
 
11
13
 
12
- static CGPoint
13
- correct_point (UIView* view, UITouch* touch)
14
+ static uint
15
+ get_type (UITouch* touch)
14
16
  {
15
- assert(view && touch);
16
- return [touch locationInView: view];
17
+ assert(touch);
18
+
19
+ NSInteger type = 0;
20
+ if (@available(iOS 9.0, *)) type = touch.type;
21
+
22
+ switch (type)
23
+ {
24
+ case UITouchTypeDirect: return Pointer::TOUCH;
25
+ case UITouchTypePencil: return Pointer::PEN;
26
+ default: return Pointer::TYPE_NONE;
27
+ }
28
+ }
29
+
30
+ static Pointer::Action
31
+ get_action (UITouch* touch)
32
+ {
33
+ assert(touch);
34
+
35
+ switch (touch.phase)
36
+ {
37
+ case UITouchPhaseBegan: return Pointer::DOWN;
38
+ case UITouchPhaseEnded: return Pointer::UP;
39
+ case UITouchPhaseMoved: return Pointer::MOVE;
40
+ case UITouchPhaseStationary: return Pointer::STAY;
41
+ case UITouchPhaseCancelled: return Pointer::CANCEL;
42
+ //case UITouchPhaseRegionEntered: return Pointer::MOVE;
43
+ //case UITouchPhaseRegionExited: return Pointer::MOVE;
44
+ //case UITouchPhaseRegionMoved: return Pointer::MOVE;
45
+ default: return Pointer::ACTION_NONE;
46
+ }
47
+ }
48
+
49
+ static Point
50
+ to_point (const CGPoint& point)
51
+ {
52
+ return Point(point.x, point.y);
53
+ }
54
+
55
+ static uint
56
+ get_modifiers (const UIEvent* event)
57
+ {
58
+ assert(event);
59
+
60
+ NSInteger flags = 0;
61
+ if (@available(iOS 13.4, *)) flags = event.modifierFlags;
62
+
63
+ return
64
+ (flags & UIKeyModifierAlphaShift) ? MOD_CAPS : 0 |
65
+ (flags & UIKeyModifierShift) ? MOD_SHIFT : 0 |
66
+ (flags & UIKeyModifierControl) ? MOD_CONTROL : 0 |
67
+ (flags & UIKeyModifierAlternate) ? MOD_ALT : 0 |
68
+ (flags & UIKeyModifierCommand) ? MOD_COMMAND : 0 |
69
+ (flags & UIKeyModifierNumericPad) ? MOD_NUMPAD : 0;
70
+ }
71
+
72
+ static void
73
+ attach_prev_pointer (
74
+ Pointer* pointer, PrevPointerList* prev_pointers, const Point& prev_position)
75
+ {
76
+ assert(pointer && prev_pointers);
77
+
78
+ auto it = std::find_if(
79
+ prev_pointers->begin(), prev_pointers->end(),
80
+ [&](const Reflex::Pointer& p) {return p.position() == prev_position;});
81
+
82
+ if (it != prev_pointers->end())
83
+ {
84
+ Reflex::Pointer_set_prev(pointer, &*it);
85
+ prev_pointers->erase(it);
86
+ }
87
+ else if (prev_pointers->size() == 1)
88
+ {
89
+ Reflex::Pointer_set_prev(pointer, &prev_pointers->front());
90
+ prev_pointers->clear();
91
+ }
92
+ else
93
+ Reflex::Pointer_set_prev(pointer, NULL);
94
+
95
+ if (pointer->prev())
96
+ Reflex::Pointer_set_id(pointer, pointer->prev()->id());
17
97
  }
18
98
 
99
+ static Pointer
100
+ create_pointer (
101
+ UITouch* touch, UIEvent* event, UIView* view, double time,
102
+ Pointer::ID pointer_id, PrevPointerList* prev_pointers)
103
+ {
104
+ Reflex::Pointer::Action action = get_action(touch);
105
+ Reflex::Pointer pointer(
106
+ pointer_id,
107
+ get_type(touch),
108
+ action,
109
+ to_point([touch locationInView: view]),
110
+ get_modifiers(event),
111
+ (uint) touch.tapCount,
112
+ action == Pointer::MOVE,
113
+ time);
114
+
115
+ if (prev_pointers)
116
+ {
117
+ attach_prev_pointer(
118
+ &pointer, prev_pointers,
119
+ to_point([touch previousLocationInView: view]));
120
+ }
121
+
122
+ return pointer;
123
+ }
124
+
125
+ NativePointerEvent::NativePointerEvent (
126
+ NSSet* touches, UIEvent* event, UIView* view,
127
+ Pointer::ID* pointer_id)
128
+ {
129
+ for (UITouch* touch in touches)
130
+ {
131
+ PointerEvent_add_pointer(
132
+ this, create_pointer(touch, event, view, time(), ++*pointer_id, NULL));
133
+ }
134
+ }
19
135
 
20
136
  NativePointerEvent::NativePointerEvent (
21
- NSSet* touches, UIEvent* e, UIView* view, Type type)
22
- : PointerEvent(type, POINTER_TOUCH, (coord) 0, (coord) 0, 0, 1, type == MOVE)
137
+ NSSet* touches, UIEvent* event, UIView* view,
138
+ PrevPointerList* prev_pointers)
23
139
  {
24
- int index = 0;
25
- for (UITouch* touch in touches) {
26
- CGPoint p = correct_point(view, touch);
27
- positions[index++].reset(p.x, p.y);
140
+ for (UITouch* touch in touches)
141
+ {
142
+ PointerEvent_add_pointer(
143
+ this, create_pointer(touch, event, view, time(), 0, prev_pointers));
28
144
  }
29
- size = index;
30
145
  }
31
146
 
32
147
 
@@ -3,9 +3,9 @@
3
3
 
4
4
 
5
5
  #include <rays/opengl.h>
6
- #include <rays/exception.h>
7
6
  #include "reflex/exception.h"
8
7
  #include "../view.h"
8
+ #include "../pointer.h"
9
9
  #include "event.h"
10
10
  #include "window.h"
11
11
 
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
  static ReflexViewController*
17
- createReflexViewController ()
17
+ create_reflex_view_controller ()
18
18
  {
19
19
  return [[ReflexViewController alloc] init];
20
20
  }
@@ -52,7 +52,7 @@ get_top_view_controller (UIViewController* vc)
52
52
  }
53
53
 
54
54
  static void
55
- showReflexViewController (
55
+ show_reflex_view_controller (
56
56
  UIViewController* root_vc, ReflexViewController* reflex_vc)
57
57
  {
58
58
  UIViewController* top = get_top_view_controller(root_vc);
@@ -90,13 +90,13 @@ ReflexViewController_set_show_fun (ReflexViewController_ShowFun fun)
90
90
  ReflexViewController_CreateFun
91
91
  ReflexViewController_get_create_fun ()
92
92
  {
93
- return global::create_fun ? global::create_fun : createReflexViewController;
93
+ return global::create_fun ? global::create_fun : create_reflex_view_controller;
94
94
  }
95
95
 
96
96
  ReflexViewController_ShowFun
97
97
  ReflexViewController_get_show_fun ()
98
98
  {
99
- return global::show_fun ? global::show_fun : showReflexViewController;
99
+ return global::show_fun ? global::show_fun : show_reflex_view_controller;
100
100
  }
101
101
 
102
102
 
@@ -131,6 +131,10 @@ ReflexViewController_get_show_fun ()
131
131
 
132
132
  {
133
133
  Reflex::Window *pwindow, *ptr_for_rebind;
134
+ int update_count;
135
+ int touching_count;
136
+ Reflex::Pointer::ID pointer_id;
137
+ Reflex::PrevPointerList prev_pointers;
134
138
  }
135
139
 
136
140
  - (id) init
@@ -138,7 +142,11 @@ ReflexViewController_get_show_fun ()
138
142
  self = [super init];
139
143
  if (!self) return nil;
140
144
 
141
- pwindow = ptr_for_rebind = NULL;
145
+ pwindow =
146
+ ptr_for_rebind = NULL;
147
+ update_count = 0;
148
+ touching_count = 0;
149
+ pointer_id = 0;
142
150
 
143
151
  return self;
144
152
  }
@@ -312,6 +320,8 @@ ReflexViewController_get_show_fun ()
312
320
  Reflex::Window* win = self.window;
313
321
  if (!win) return;
314
322
 
323
+ ++update_count;
324
+
315
325
  double now = Xot::time();
316
326
  Reflex::UpdateEvent e(now, now - win->self->prev_time_update);
317
327
  win->self->prev_time_update = now;
@@ -332,6 +342,9 @@ ReflexViewController_get_show_fun ()
332
342
  Reflex::Window* win = self.window;
333
343
  if (!win) return;
334
344
 
345
+ if (update_count == 0)
346
+ [self update];
347
+
335
348
  EAGLContext* context = self.reflexView.context;
336
349
  if (!context) return;
337
350
 
@@ -386,9 +399,12 @@ ReflexViewController_get_show_fun ()
386
399
  Reflex::Window* win = self.window;
387
400
  if (!win) return;
388
401
 
389
- Reflex::NativePointerEvent e(
390
- touches, event, self.reflexView, Reflex::PointerEvent::DOWN);
391
- win->on_pointer(&e);
402
+ Reflex::NativePointerEvent e(touches, event, self.reflexView, &pointer_id);
403
+ [self addToPrevPointers: e];
404
+
405
+ touching_count += e.size();
406
+
407
+ Window_call_pointer_event(win, &e);
392
408
  }
393
409
 
394
410
  - (void) touchesEnded: (NSSet*) touches withEvent: (UIEvent*) event
@@ -396,19 +412,20 @@ ReflexViewController_get_show_fun ()
396
412
  Reflex::Window* win = self.window;
397
413
  if (!win) return;
398
414
 
399
- Reflex::NativePointerEvent e(
400
- touches, event, self.reflexView, Reflex::PointerEvent::UP);
401
- win->on_pointer(&e);
415
+ Reflex::NativePointerEvent e(touches, event, self.reflexView, &prev_pointers);
416
+
417
+ touching_count -= e.size();
418
+ if (touching_count == 0)
419
+ prev_pointers.clear();
420
+ else if (touching_count < 0)
421
+ Reflex::invalid_state_error(__FILE__, __LINE__);
422
+
423
+ Window_call_pointer_event(win, &e);
402
424
  }
403
425
 
404
426
  - (void) touchesCancelled: (NSSet*) touches withEvent: (UIEvent*) event
405
427
  {
406
- Reflex::Window* win = self.window;
407
- if (!win) return;
408
-
409
- Reflex::NativePointerEvent e(
410
- touches, event, self.reflexView, Reflex::PointerEvent::UP);
411
- win->on_pointer(&e);
428
+ [self touchesEnded: touches withEvent: event];
412
429
  }
413
430
 
414
431
  - (void) touchesMoved: (NSSet*) touches withEvent: (UIEvent*) event
@@ -416,9 +433,20 @@ ReflexViewController_get_show_fun ()
416
433
  Reflex::Window* win = self.window;
417
434
  if (!win) return;
418
435
 
419
- Reflex::NativePointerEvent e(
420
- touches, event, self.reflexView, Reflex::PointerEvent::MOVE);
421
- win->on_pointer(&e);
436
+ Reflex::NativePointerEvent e(touches, event, self.reflexView, &prev_pointers);
437
+ [self addToPrevPointers: e];
438
+
439
+ Window_call_pointer_event(win, &e);
440
+ }
441
+
442
+ - (void) addToPrevPointers: (const Reflex::PointerEvent&) event
443
+ {
444
+ size_t size = event.size();
445
+ for (size_t i = 0; i < size; ++i)
446
+ {
447
+ prev_pointers.emplace_back(event[i]);
448
+ Reflex::Pointer_set_prev(&prev_pointers.back(), NULL);
449
+ }
422
450
  }
423
451
 
424
452
  @end// ReflexViewController
data/src/osx/event.h CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
  #import <AppKit/NSEvent.h>
8
- #include <reflex/event.h>
8
+ #include "../event.h"
9
9
 
10
10
 
11
11
  namespace Reflex
@@ -28,10 +28,13 @@ namespace Reflex
28
28
  };// NativeFlagKeyEvent
29
29
 
30
30
 
31
- struct NativePointerEvent : public PointerEvent
31
+ class NativePointerEvent : public PointerEvent
32
32
  {
33
33
 
34
- NativePointerEvent (NSEvent* event, NSView* view, Type type);
34
+ public:
35
+
36
+ NativePointerEvent (
37
+ NSEvent* event, NSView* view, Pointer::ID id, Pointer::Action action);
35
38
 
36
39
  };// NativePointerEvent
37
40