reflexion 0.1.22 → 0.1.23

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 (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/osx/event.mm CHANGED
@@ -185,9 +185,9 @@ namespace Reflex
185
185
  {
186
186
  NSUInteger buttons = [NSEvent pressedMouseButtons];
187
187
  uint ret = 0;
188
- if (buttons & (1 << 0)) ret |= POINTER_MOUSE_LEFT;
189
- if (buttons & (1 << 1)) ret |= POINTER_MOUSE_RIGHT;
190
- if (buttons >= (1 << 2)) ret |= POINTER_MOUSE_MIDDLE;
188
+ if (buttons & Xot::bit(0)) ret |= Reflex::Pointer::MOUSE_LEFT;
189
+ if (buttons & Xot::bit(1)) ret |= Reflex::Pointer::MOUSE_RIGHT;
190
+ if (buttons >= Xot::bit(2)) ret |= Reflex::Pointer::MOUSE_MIDDLE;
191
191
  return ret;
192
192
  }
193
193
 
@@ -199,22 +199,24 @@ namespace Reflex
199
199
  case NSLeftMouseDown:
200
200
  case NSLeftMouseUp:
201
201
  case NSLeftMouseDragged:
202
- return POINTER_MOUSE_LEFT;
202
+ return Reflex::Pointer::MOUSE | Reflex::Pointer::MOUSE_LEFT;
203
203
 
204
204
  case NSRightMouseDown:
205
205
  case NSRightMouseUp:
206
206
  case NSRightMouseDragged:
207
- return POINTER_MOUSE_RIGHT;
207
+ return Reflex::Pointer::MOUSE | Reflex::Pointer::MOUSE_RIGHT;
208
208
 
209
209
  case NSOtherMouseDown:
210
210
  case NSOtherMouseUp:
211
211
  case NSOtherMouseDragged:
212
- return POINTER_MOUSE_MIDDLE;
212
+ return Reflex::Pointer::MOUSE | Reflex::Pointer::MOUSE_MIDDLE;
213
213
 
214
214
  case NSMouseMoved:
215
- return get_current_pointer_type();
215
+ return Reflex::Pointer::MOUSE | get_current_pointer_type();
216
+
217
+ default:
218
+ return Reflex::Pointer::TYPE_NONE;
216
219
  }
217
- return 0;
218
220
  }
219
221
 
220
222
  static uint
@@ -241,6 +243,13 @@ namespace Reflex
241
243
  return p;
242
244
  }
243
245
 
246
+ static Point
247
+ get_pointer_position (NSEvent* e, NSView* view)
248
+ {
249
+ NSPoint p = correct_point(view, [e locationInWindow]);
250
+ return Point(p.x, p.y);
251
+ }
252
+
244
253
 
245
254
  NativeKeyEvent::NativeKeyEvent (NSEvent* e, Type type)
246
255
  : KeyEvent(
@@ -258,26 +267,35 @@ namespace Reflex
258
267
  }
259
268
 
260
269
 
261
- NativePointerEvent::NativePointerEvent (NSEvent* e, NSView* view, Type type)
262
- : PointerEvent(
263
- type, get_pointer_type(e), (coord) 0, (coord) 0,
264
- get_modifiers(e), (uint) [e clickCount],
265
- [e type] == NSLeftMouseDragged || [e type] == NSRightMouseDragged || [e type] == NSOtherMouseDragged)
270
+ static bool
271
+ is_pointer_dragging (NSEvent* e)
266
272
  {
267
- NSPoint p = correct_point(view, [e locationInWindow]);
268
- x = p.x;
269
- y = p.y;
273
+ return
274
+ [e type] == NSLeftMouseDragged ||
275
+ [e type] == NSRightMouseDragged ||
276
+ [e type] == NSOtherMouseDragged;
277
+ }
278
+
279
+ NativePointerEvent::NativePointerEvent (
280
+ NSEvent* event, NSView* view, Pointer::ID id, Pointer::Action action)
281
+ {
282
+ bool dragging = is_pointer_dragging(event);
283
+ PointerEvent_add_pointer(this, Pointer(
284
+ id,
285
+ get_pointer_type(event),
286
+ action,
287
+ get_pointer_position(event, view),
288
+ get_modifiers(event),
289
+ action == Pointer::MOVE && !dragging ? 0 : (uint) [event clickCount],
290
+ dragging,
291
+ time()));
270
292
  }
271
293
 
272
294
 
273
295
  NativeWheelEvent::NativeWheelEvent (NSEvent* e, NSView* view)
274
- : WheelEvent([e deltaX], [e deltaY], [e deltaZ])
296
+ : WheelEvent(0, 0, 0, [e deltaX], [e deltaY], [e deltaZ], get_modifiers(e))
275
297
  {
276
- NSPoint p = correct_point(view, [e locationInWindow]);
277
- x = p.x;
278
- y = p.y;
279
- z = 0;
280
- modifiers = get_modifiers(e);
298
+ position_ = get_pointer_position(e, view);
281
299
  }
282
300
 
283
301
 
@@ -4,9 +4,9 @@
4
4
 
5
5
  #include <assert.h>
6
6
  #import <Cocoa/Cocoa.h>
7
- #include "rays/bounds.h"
8
7
  #include "reflex/exception.h"
9
8
  #include "../view.h"
9
+ #include "../pointer.h"
10
10
  #include "event.h"
11
11
  #include "window.h"
12
12
  #import "opengl_view.h"
@@ -20,12 +20,30 @@ static const NSUInteger WINDOW_STYLE_MASK =
20
20
  0;//NSTexturedBackgroundWindowMask
21
21
 
22
22
 
23
+ static int
24
+ count_mouse_buttons (const Reflex::PointerEvent& e)
25
+ {
26
+ uint nbuttons = 0;
27
+ PointerEvent_each_pointer(&e, [&](const auto& pointer) {
28
+ uint t = pointer.type();
29
+ nbuttons +=
30
+ (t & Reflex::Pointer::MOUSE_LEFT ? 1 : 0) +
31
+ (t & Reflex::Pointer::MOUSE_RIGHT ? 1 : 0) +
32
+ (t & Reflex::Pointer::MOUSE_MIDDLE ? 1 : 0);
33
+ });
34
+ return nbuttons;
35
+ }
36
+
23
37
  @implementation NativeWindow
24
38
 
25
39
  {
26
40
  Reflex::Window *pwindow, *ptr_for_rebind;
27
41
  OpenGLView* view;
28
42
  NSTimer* timer;
43
+ int update_count;
44
+ int clicking_count;
45
+ Reflex::Pointer::ID pointer_id;
46
+ Reflex::Pointer prevPointer;
29
47
  }
30
48
 
31
49
  - (id) init
@@ -37,9 +55,13 @@ static const NSUInteger WINDOW_STYLE_MASK =
37
55
  defer: NO];
38
56
  if (!self) return nil;
39
57
 
40
- pwindow = ptr_for_rebind = NULL;
41
- view = nil;
42
- timer = nil;
58
+ pwindow =
59
+ ptr_for_rebind = NULL;
60
+ view = nil;
61
+ timer = nil;
62
+ update_count = 0;
63
+ clicking_count = 0;
64
+ pointer_id = 0;
43
65
 
44
66
  [self setDelegate: self];
45
67
  [self setupContentView];
@@ -152,6 +174,8 @@ static const NSUInteger WINDOW_STYLE_MASK =
152
174
  Reflex::Window* win = self.window;
153
175
  if (!win) return;
154
176
 
177
+ ++update_count;
178
+
155
179
  double now = Xot::time();
156
180
  Reflex::UpdateEvent e(now, now - win->self->prev_time_update);
157
181
  win->self->prev_time_update = now;
@@ -172,6 +196,9 @@ static const NSUInteger WINDOW_STYLE_MASK =
172
196
  Reflex::Window* win = self.window;
173
197
  if (!win) return;
174
198
 
199
+ if (update_count == 0)
200
+ [self update];
201
+
175
202
  double now = Xot::time();
176
203
  double dt = now - win->self->prev_time_draw;
177
204
  double fps = 1. / dt;
@@ -266,7 +293,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
266
293
  if (!win) return;
267
294
 
268
295
  Reflex::NativeKeyEvent e(event, Reflex::KeyEvent::DOWN);
269
- win->on_key(&e);
296
+ Window_call_key_event(win, &e);
270
297
  }
271
298
 
272
299
  - (void) keyUp: (NSEvent*) event
@@ -275,7 +302,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
275
302
  if (!win) return;
276
303
 
277
304
  Reflex::NativeKeyEvent e(event, Reflex::KeyEvent::UP);
278
- win->on_key(&e);
305
+ Window_call_key_event(win, &e);
279
306
  }
280
307
 
281
308
  - (void) flagsChanged: (NSEvent*) event
@@ -284,7 +311,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
284
311
  if (!win) return;
285
312
 
286
313
  Reflex::NativeFlagKeyEvent e(event);
287
- win->on_key(&e);
314
+ Window_call_key_event(win, &e);
288
315
  }
289
316
 
290
317
  - (void) mouseDown: (NSEvent*) event
@@ -292,8 +319,22 @@ static const NSUInteger WINDOW_STYLE_MASK =
292
319
  Reflex::Window* win = self.window;
293
320
  if (!win) return;
294
321
 
295
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::DOWN);
296
- win->on_pointer(&e);
322
+ if (clicking_count == 0) ++pointer_id;
323
+
324
+ Reflex::NativePointerEvent e(event, view, pointer_id, Reflex::Pointer::DOWN);
325
+
326
+ if (e[0].position().y < 0)
327
+ {
328
+ // ignore mouseDown event since the mouseUp event to the window title bar
329
+ // will not come and will break clicking_count.
330
+ return;
331
+ }
332
+
333
+ [self attachAndUpdatePrevPointer: &e];
334
+
335
+ clicking_count += count_mouse_buttons(e);
336
+
337
+ Window_call_pointer_event(win, &e);
297
338
  }
298
339
 
299
340
  - (void) mouseUp: (NSEvent*) event
@@ -301,8 +342,16 @@ static const NSUInteger WINDOW_STYLE_MASK =
301
342
  Reflex::Window* win = self.window;
302
343
  if (!win) return;
303
344
 
304
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::UP);
305
- win->on_pointer(&e);
345
+ Reflex::NativePointerEvent e(event, view, pointer_id, Reflex::Pointer::UP);
346
+ [self attachAndUpdatePrevPointer: &e];
347
+
348
+ clicking_count -= count_mouse_buttons(e);
349
+ if (clicking_count == 0)
350
+ ++pointer_id;
351
+ else if (clicking_count < 0)
352
+ Reflex::invalid_state_error(__FILE__, __LINE__);
353
+
354
+ Window_call_pointer_event(win, &e);
306
355
  }
307
356
 
308
357
  - (void) mouseDragged: (NSEvent*) event
@@ -310,8 +359,10 @@ static const NSUInteger WINDOW_STYLE_MASK =
310
359
  Reflex::Window* win = self.window;
311
360
  if (!win) return;
312
361
 
313
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::MOVE);
314
- win->on_pointer(&e);
362
+ Reflex::NativePointerEvent e(event, view, pointer_id, Reflex::Pointer::MOVE);
363
+ [self attachAndUpdatePrevPointer: &e];
364
+
365
+ Window_call_pointer_event(win, &e);
315
366
  }
316
367
 
317
368
  - (void) mouseMoved: (NSEvent*) event
@@ -319,8 +370,20 @@ static const NSUInteger WINDOW_STYLE_MASK =
319
370
  Reflex::Window* win = self.window;
320
371
  if (!win) return;
321
372
 
322
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::MOVE);
323
- win->on_pointer(&e);
373
+ Reflex::NativePointerEvent e(event, view, pointer_id, Reflex::Pointer::MOVE);
374
+ [self attachAndUpdatePrevPointer: &e];
375
+
376
+ Window_call_pointer_event(win, &e);
377
+ }
378
+
379
+ - (void) attachAndUpdatePrevPointer: (Reflex::PointerEvent*) e
380
+ {
381
+ assert(e->size() == 1);
382
+
383
+ Reflex::Pointer& pointer = Reflex::PointerEvent_pointer_at(e, 0);
384
+ if (prevPointer)
385
+ Reflex::Pointer_set_prev(&pointer, &prevPointer);
386
+ prevPointer = pointer;
324
387
  }
325
388
 
326
389
  - (void) scrollWheel: (NSEvent*) event
@@ -329,7 +392,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
329
392
  if (!win) return;
330
393
 
331
394
  Reflex::NativeWheelEvent e(event, view);
332
- win->on_wheel(&e);
395
+ Window_call_wheel_event(win, &e);
333
396
  }
334
397
 
335
398
  + (NSRect) frameRectForContentRect: (NSRect) contentRect
data/src/pointer.cpp ADDED
@@ -0,0 +1,203 @@
1
+ #include "pointer.h"
2
+
3
+
4
+ #include <xot/time.h>
5
+ #include "reflex/exception.h"
6
+
7
+
8
+ namespace Reflex
9
+ {
10
+
11
+
12
+ class PrevPointerPtr : public Xot::PImpl<Pointer>
13
+ {
14
+
15
+ typedef Xot::PImpl<Pointer> Super;
16
+
17
+ public:
18
+
19
+ PrevPointerPtr () : Super(NULL) {}
20
+
21
+ };// PrevPointerPtr
22
+
23
+
24
+ struct Pointer::Data
25
+ {
26
+
27
+ enum Flag
28
+ {
29
+
30
+ DRAG = Xot::bit(0),
31
+
32
+ ENTER = Xot::bit(1),
33
+
34
+ EXIT = Xot::bit(2),
35
+
36
+ };// Flag
37
+
38
+ ID id;
39
+
40
+ uint type;
41
+
42
+ Action action;
43
+
44
+ Point position;
45
+
46
+ uint modifiers, click_count, flags;
47
+
48
+ double time;
49
+
50
+ PrevPointerPtr prev;
51
+
52
+ Data (
53
+ ID id = -1, uint type = TYPE_NONE, Action action = ACTION_NONE,
54
+ const Point& position = 0, uint modifiers = 0, uint click_count = 0,
55
+ bool drag = false, bool enter = false, bool exit = false,
56
+ double time = 0)
57
+ : id(id), type(type), action(action),
58
+ position(position), modifiers(modifiers), click_count(click_count),
59
+ flags(make_flags(drag, enter, exit)),
60
+ time(time)
61
+ {
62
+ }
63
+
64
+ uint make_flags (bool drag, bool enter, bool exit)
65
+ {
66
+ return
67
+ (drag ? DRAG : 0) |
68
+ (enter ? ENTER : 0) |
69
+ (exit ? EXIT : 0);
70
+ }
71
+
72
+ };// Pointer::Data
73
+
74
+
75
+ void
76
+ Pointer_update_positions (Pointer* pthis, std::function<void(Point*)> fun)
77
+ {
78
+ assert(pthis);
79
+
80
+ auto& self = pthis->self;
81
+ fun(&self->position);
82
+ if (self->prev)
83
+ fun(&self->prev->self->position);
84
+ }
85
+
86
+ void
87
+ Pointer_set_id (Pointer* pthis, Pointer::ID id)
88
+ {
89
+ pthis->self->id = id;
90
+ }
91
+
92
+ void
93
+ Pointer_set_prev (Pointer* pthis, const Pointer* prev)
94
+ {
95
+ if (prev)
96
+ pthis->self->prev.reset(new Pointer(*prev));
97
+ else
98
+ pthis->self->prev.reset();
99
+ }
100
+
101
+
102
+ Pointer::Pointer ()
103
+ {
104
+ }
105
+
106
+ Pointer::Pointer (
107
+ ID id, uint type, Action action,
108
+ const Point& position, uint modifiers, uint click_count, bool drag,
109
+ double time)
110
+ : self(new Data(
111
+ id, type, action,
112
+ position, modifiers, click_count, drag, false, false,
113
+ time))
114
+ {
115
+ }
116
+
117
+ Pointer::Pointer (const This& obj)
118
+ : self(new Data(*obj.self))
119
+ {
120
+ }
121
+
122
+ Pointer&
123
+ Pointer::operator = (const This& obj)
124
+ {
125
+ if (&obj == this) return *this;
126
+
127
+ *self = *obj.self;
128
+ return *this;
129
+ }
130
+
131
+ Pointer::~Pointer ()
132
+ {
133
+ }
134
+
135
+ Pointer::ID
136
+ Pointer::id () const
137
+ {
138
+ return self->id;
139
+ }
140
+
141
+ uint
142
+ Pointer::type () const
143
+ {
144
+ return self->type;
145
+ }
146
+
147
+ Pointer::Action
148
+ Pointer::action () const
149
+ {
150
+ return self->action;
151
+ }
152
+
153
+ const Point&
154
+ Pointer::position () const
155
+ {
156
+ return self->position;
157
+ }
158
+
159
+ uint
160
+ Pointer::modifiers () const
161
+ {
162
+ return self->modifiers;
163
+ }
164
+
165
+ uint
166
+ Pointer::click_count () const
167
+ {
168
+ return self->click_count;
169
+ }
170
+
171
+ bool
172
+ Pointer::is_drag () const
173
+ {
174
+ return self->flags & Data::DRAG;
175
+ }
176
+
177
+ double
178
+ Pointer::time () const
179
+ {
180
+ return self->time;
181
+ }
182
+
183
+ const Pointer*
184
+ Pointer::prev () const
185
+ {
186
+ return self->prev.get();
187
+ }
188
+
189
+ Pointer::operator bool () const
190
+ {
191
+ return
192
+ self->type != TYPE_NONE &&
193
+ ACTION_NONE < self->action && self->action <= STAY;
194
+ }
195
+
196
+ bool
197
+ Pointer::operator ! () const
198
+ {
199
+ return !operator bool();
200
+ }
201
+
202
+
203
+ }// Reflex
data/src/pointer.h ADDED
@@ -0,0 +1,26 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __REFLEX_SRC_POINTER_H__
4
+ #define __REFLEX_SRC_POINTER_H__
5
+
6
+
7
+ #include <functional>
8
+ #include <reflex/pointer.h>
9
+
10
+
11
+ namespace Reflex
12
+ {
13
+
14
+
15
+ void Pointer_update_positions (
16
+ Pointer* pthis, std::function<void(Point*)> fun);
17
+
18
+ void Pointer_set_id (Pointer* pthis, Pointer::ID id);
19
+
20
+ void Pointer_set_prev (Pointer* pthis, const Pointer* prev);
21
+
22
+
23
+ }// Reflex
24
+
25
+
26
+ #endif//EOH
data/src/selector.cpp CHANGED
@@ -139,7 +139,7 @@ namespace Reflex
139
139
  }
140
140
 
141
141
  bool
142
- Selector::is_empty () const
142
+ Selector::empty () const
143
143
  {
144
144
  return self->name.empty() && self->tags.empty();
145
145
  }