reflexion 0.1.20 → 0.1.24

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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/capture_event.cpp +6 -5
  3. data/.doc/ext/reflex/contact_event.cpp +18 -16
  4. data/.doc/ext/reflex/draw_event.cpp +10 -8
  5. data/.doc/ext/reflex/event.cpp +10 -10
  6. data/.doc/ext/reflex/focus_event.cpp +18 -17
  7. data/.doc/ext/reflex/frame_event.cpp +17 -17
  8. data/.doc/ext/reflex/key_event.cpp +227 -28
  9. data/.doc/ext/reflex/native.cpp +2 -0
  10. data/.doc/ext/reflex/pointer.cpp +158 -0
  11. data/.doc/ext/reflex/pointer_event.cpp +32 -91
  12. data/.doc/ext/reflex/scroll_event.cpp +14 -17
  13. data/.doc/ext/reflex/selector.cpp +8 -0
  14. data/.doc/ext/reflex/timer.cpp +9 -1
  15. data/.doc/ext/reflex/timer_event.cpp +4 -13
  16. data/.doc/ext/reflex/update_event.cpp +6 -5
  17. data/.doc/ext/reflex/view.cpp +57 -0
  18. data/.doc/ext/reflex/wheel_event.cpp +39 -22
  19. data/.doc/ext/reflex/window.cpp +41 -0
  20. data/VERSION +1 -1
  21. data/ext/reflex/capture_event.cpp +6 -5
  22. data/ext/reflex/contact_event.cpp +18 -16
  23. data/ext/reflex/draw_event.cpp +9 -7
  24. data/ext/reflex/event.cpp +11 -11
  25. data/ext/reflex/focus_event.cpp +18 -17
  26. data/ext/reflex/frame_event.cpp +16 -16
  27. data/ext/reflex/key_event.cpp +228 -28
  28. data/ext/reflex/native.cpp +2 -0
  29. data/ext/reflex/pointer.cpp +170 -0
  30. data/ext/reflex/pointer_event.cpp +31 -96
  31. data/ext/reflex/scroll_event.cpp +15 -18
  32. data/ext/reflex/selector.cpp +9 -0
  33. data/ext/reflex/timer.cpp +15 -6
  34. data/ext/reflex/timer_event.cpp +9 -19
  35. data/ext/reflex/update_event.cpp +6 -5
  36. data/ext/reflex/view.cpp +67 -3
  37. data/ext/reflex/wheel_event.cpp +40 -21
  38. data/ext/reflex/window.cpp +49 -3
  39. data/include/reflex/defs.h +140 -106
  40. data/include/reflex/event.h +232 -124
  41. data/include/reflex/pointer.h +107 -0
  42. data/include/reflex/ruby/pointer.h +41 -0
  43. data/include/reflex/ruby/view.h +9 -0
  44. data/include/reflex/ruby/window.h +9 -0
  45. data/include/reflex/selector.h +1 -1
  46. data/include/reflex/shape.h +2 -2
  47. data/include/reflex/view.h +6 -4
  48. data/include/reflex/window.h +14 -8
  49. data/lib/reflex/application.rb +3 -3
  50. data/lib/reflex/autoinit.rb +1 -1
  51. data/lib/reflex/button.rb +7 -7
  52. data/lib/reflex/capture_event.rb +7 -7
  53. data/lib/reflex/contact_event.rb +10 -10
  54. data/lib/reflex/draw_event.rb +2 -2
  55. data/lib/reflex/ellipse_shape.rb +2 -2
  56. data/lib/reflex/focus_event.rb +11 -11
  57. data/lib/reflex/frame_event.rb +5 -5
  58. data/lib/reflex/helper.rb +20 -20
  59. data/lib/reflex/image_view.rb +2 -2
  60. data/lib/reflex/key_event.rb +12 -12
  61. data/lib/reflex/model.rb +22 -22
  62. data/lib/reflex/model_owner.rb +7 -7
  63. data/lib/reflex/model_view.rb +1 -1
  64. data/lib/reflex/module.rb +5 -5
  65. data/lib/reflex/pointer.rb +107 -0
  66. data/lib/reflex/pointer_event.rb +16 -54
  67. data/lib/reflex/polygon_shape.rb +2 -2
  68. data/lib/reflex/reflex.rb +3 -3
  69. data/lib/reflex/scroll_event.rb +1 -1
  70. data/lib/reflex/selector.rb +4 -4
  71. data/lib/reflex/shape.rb +13 -13
  72. data/lib/reflex/style.rb +11 -11
  73. data/lib/reflex/style_length.rb +1 -1
  74. data/lib/reflex/text_view.rb +2 -2
  75. data/lib/reflex/timer.rb +2 -2
  76. data/lib/reflex/timer_event.rb +3 -2
  77. data/lib/reflex/update_event.rb +1 -1
  78. data/lib/reflex/view.rb +32 -32
  79. data/lib/reflex/wheel_event.rb +2 -10
  80. data/lib/reflex/window.rb +8 -7
  81. data/lib/reflex.rb +1 -0
  82. data/lib/reflexion.rb +17 -17
  83. data/reflex.gemspec +5 -5
  84. data/samples/reflexion/noise.rb +1 -1
  85. data/samples/tree.rb +1 -1
  86. data/src/event.cpp +792 -86
  87. data/src/event.h +47 -0
  88. data/src/image_view.cpp +2 -2
  89. data/src/ios/event.h +15 -3
  90. data/src/ios/event.mm +126 -11
  91. data/src/ios/view_controller.mm +51 -23
  92. data/src/ios/window.mm +18 -0
  93. data/src/osx/event.h +15 -4
  94. data/src/osx/event.mm +214 -24
  95. data/src/osx/native_window.mm +85 -18
  96. data/src/osx/window.mm +22 -0
  97. data/src/pointer.cpp +203 -0
  98. data/src/pointer.h +26 -0
  99. data/src/selector.cpp +1 -1
  100. data/src/shape.cpp +11 -13
  101. data/src/shape.h +1 -1
  102. data/src/view.cpp +205 -118
  103. data/src/view.h +5 -10
  104. data/src/window.cpp +346 -104
  105. data/src/window.h +28 -3
  106. data/src/world.cpp +6 -4
  107. data/test/helper.rb +3 -3
  108. data/test/test_application.rb +1 -1
  109. data/test/test_capture_event.rb +22 -6
  110. data/test/test_contact_event.rb +40 -0
  111. data/test/test_draw_event.rb +35 -0
  112. data/test/test_event.rb +33 -5
  113. data/test/test_focus_event.rb +34 -0
  114. data/test/test_frame_event.rb +38 -0
  115. data/test/test_has_frame.rb +11 -11
  116. data/test/test_key_event.rb +33 -0
  117. data/test/test_pointer.rb +149 -0
  118. data/test/test_pointer_event.rb +70 -104
  119. data/test/test_reflex.rb +1 -1
  120. data/test/test_scroll_event.rb +39 -0
  121. data/test/test_selector.rb +15 -8
  122. data/test/test_shape.rb +8 -8
  123. data/test/test_style.rb +13 -13
  124. data/test/test_style_length.rb +5 -5
  125. data/test/test_timer_event.rb +38 -0
  126. data/test/test_update_event.rb +29 -0
  127. data/test/test_view.rb +57 -30
  128. data/test/test_wheel_event.rb +40 -0
  129. data/test/test_window.rb +45 -26
  130. metadata +64 -35
data/src/osx/event.mm CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
 
5
5
  #include <assert.h>
6
+ #include <Carbon/Carbon.h>
6
7
  #import <Cocoa/Cocoa.h>
7
8
 
8
9
 
@@ -17,14 +18,176 @@ namespace Reflex
17
18
  return [chars UTF8String];
18
19
  }
19
20
 
21
+ static KeyCode
22
+ get_code (UInt16 code)
23
+ {
24
+ switch (code)
25
+ {
26
+ case kVK_ANSI_A: return KEY_A;
27
+ case kVK_ANSI_S: return KEY_S;
28
+ case kVK_ANSI_D: return KEY_D;
29
+ case kVK_ANSI_F: return KEY_F;
30
+ case kVK_ANSI_H: return KEY_H;
31
+ case kVK_ANSI_G: return KEY_G;
32
+ case kVK_ANSI_Z: return KEY_Z;
33
+ case kVK_ANSI_X: return KEY_X;
34
+ case kVK_ANSI_C: return KEY_C;
35
+ case kVK_ANSI_V: return KEY_V;
36
+ case kVK_ANSI_B: return KEY_B;
37
+ case kVK_ANSI_Q: return KEY_Q;
38
+ case kVK_ANSI_W: return KEY_W;
39
+ case kVK_ANSI_E: return KEY_E;
40
+ case kVK_ANSI_R: return KEY_R;
41
+ case kVK_ANSI_Y: return KEY_Y;
42
+ case kVK_ANSI_T: return KEY_T;
43
+ case kVK_ANSI_1: return KEY_1;
44
+ case kVK_ANSI_2: return KEY_2;
45
+ case kVK_ANSI_3: return KEY_3;
46
+ case kVK_ANSI_4: return KEY_4;
47
+ case kVK_ANSI_6: return KEY_6;
48
+ case kVK_ANSI_5: return KEY_5;
49
+ case kVK_ANSI_Equal: return KEY_EQUAL;
50
+ case kVK_ANSI_9: return KEY_9;
51
+ case kVK_ANSI_7: return KEY_7;
52
+ case kVK_ANSI_Minus: return KEY_MINUS;
53
+ case kVK_ANSI_8: return KEY_8;
54
+ case kVK_ANSI_0: return KEY_0;
55
+ case kVK_ANSI_RightBracket: return KEY_RBRACKET;
56
+ case kVK_ANSI_O: return KEY_O;
57
+ case kVK_ANSI_U: return KEY_U;
58
+ case kVK_ANSI_LeftBracket: return KEY_LBRACKET;
59
+ case kVK_ANSI_I: return KEY_I;
60
+ case kVK_ANSI_P: return KEY_P;
61
+ case kVK_ANSI_L: return KEY_L;
62
+ case kVK_ANSI_J: return KEY_J;
63
+ case kVK_ANSI_Quote: return KEY_QUOTE;
64
+ case kVK_ANSI_K: return KEY_K;
65
+ case kVK_ANSI_Semicolon: return KEY_SEMICOLON;
66
+ case kVK_ANSI_Backslash: return KEY_BACKSLASH;
67
+ case kVK_ANSI_Comma: return KEY_COMMA;
68
+ case kVK_ANSI_Slash: return KEY_SLASH;
69
+ case kVK_ANSI_N: return KEY_N;
70
+ case kVK_ANSI_M: return KEY_M;
71
+ case kVK_ANSI_Period: return KEY_PERIOD;
72
+ case kVK_ANSI_Grave: return KEY_GRAVE;
73
+ case kVK_ANSI_KeypadDecimal: return KEY_NUM_DECIMAL;
74
+ case kVK_ANSI_KeypadMultiply: return KEY_NUM_MULTIPLY;
75
+ case kVK_ANSI_KeypadPlus: return KEY_NUM_PLUS;
76
+ case kVK_ANSI_KeypadClear: return KEY_NUM_CLEAR;
77
+ case kVK_ANSI_KeypadDivide: return KEY_NUM_DIVIDE;
78
+ case kVK_ANSI_KeypadEnter: return KEY_ENTER;
79
+ case kVK_ANSI_KeypadMinus: return KEY_NUM_MINUS;
80
+ case kVK_ANSI_KeypadEquals: return KEY_NUM_EQUAL;
81
+ case kVK_ANSI_Keypad0: return KEY_NUM_0;
82
+ case kVK_ANSI_Keypad1: return KEY_NUM_1;
83
+ case kVK_ANSI_Keypad2: return KEY_NUM_2;
84
+ case kVK_ANSI_Keypad3: return KEY_NUM_3;
85
+ case kVK_ANSI_Keypad4: return KEY_NUM_4;
86
+ case kVK_ANSI_Keypad5: return KEY_NUM_5;
87
+ case kVK_ANSI_Keypad6: return KEY_NUM_6;
88
+ case kVK_ANSI_Keypad7: return KEY_NUM_7;
89
+ case kVK_ANSI_Keypad8: return KEY_NUM_8;
90
+ case kVK_ANSI_Keypad9: return KEY_NUM_9;
91
+
92
+ case kVK_Return: return KEY_RETURN;
93
+ case kVK_Tab: return KEY_TAB;
94
+ case kVK_Space: return KEY_SPACE;
95
+ case kVK_Delete: return KEY_BACKSPACE;
96
+ case kVK_Escape: return KEY_ESCAPE;
97
+ case kVK_Command: return KEY_LCOMMAND;
98
+ case kVK_Shift: return KEY_LSHIFT;
99
+ case kVK_CapsLock: return KEY_CAPSLOCK;
100
+ case kVK_Option: return KEY_LOPTION;
101
+ case kVK_Control: return KEY_LCONTROL;
102
+ case kVK_RightCommand: return KEY_RCOMMAND;
103
+ case kVK_RightShift: return KEY_RSHIFT;
104
+ case kVK_RightOption: return KEY_ROPTION;
105
+ case kVK_RightControl: return KEY_RCONTROL;
106
+ case kVK_Function: return KEY_FUNCTION;
107
+ case kVK_F17: return KEY_F17;
108
+ case kVK_VolumeUp: return KEY_VOLUME_UP;
109
+ case kVK_VolumeDown: return KEY_VOLUME_DOWN;
110
+ case kVK_Mute: return KEY_MUTE;
111
+ case kVK_F18: return KEY_F18;
112
+ case kVK_F19: return KEY_F19;
113
+ case kVK_F20: return KEY_F20;
114
+ case kVK_F5: return KEY_F5;
115
+ case kVK_F6: return KEY_F6;
116
+ case kVK_F7: return KEY_F7;
117
+ case kVK_F3: return KEY_F3;
118
+ case kVK_F8: return KEY_F8;
119
+ case kVK_F9: return KEY_F9;
120
+ case kVK_F11: return KEY_F11;
121
+ case kVK_F13: return KEY_F13;
122
+ case kVK_F16: return KEY_F16;
123
+ case kVK_F14: return KEY_F14;
124
+ case kVK_F10: return KEY_F10;
125
+ case kVK_F12: return KEY_F12;
126
+ case kVK_F15: return KEY_F15;
127
+ case kVK_Help: return KEY_HELP;
128
+ case kVK_Home: return KEY_HOME;
129
+ case kVK_PageUp: return KEY_PAGEUP;
130
+ case kVK_ForwardDelete: return KEY_DELETE;
131
+ case kVK_F4: return KEY_F4;
132
+ case kVK_End: return KEY_END;
133
+ case kVK_F2: return KEY_F2;
134
+ case kVK_PageDown: return KEY_PAGEDOWN;
135
+ case kVK_F1: return KEY_F1;
136
+ case kVK_LeftArrow: return KEY_LEFT;
137
+ case kVK_RightArrow: return KEY_RIGHT;
138
+ case kVK_DownArrow: return KEY_DOWN;
139
+ case kVK_UpArrow: return KEY_UP;
140
+
141
+ case kVK_ISO_Section: return KEY_SECTION;
142
+
143
+ case kVK_JIS_Yen: return KEY_YEN;
144
+ case kVK_JIS_Underscore: return KEY_UNDERSCORE;
145
+ case kVK_JIS_KeypadComma: return KEY_NUM_COMMA;
146
+ case kVK_JIS_Eisu: return KEY_IME_EISU;
147
+ case kVK_JIS_Kana: return KEY_IME_KANA;
148
+ }
149
+
150
+ return KEY_NONE;
151
+ }
152
+
153
+ static uint
154
+ get_modifier_flag_mask (const NSEvent* e)
155
+ {
156
+ switch ([e keyCode])
157
+ {
158
+ case kVK_Shift:
159
+ case kVK_RightShift: return NSShiftKeyMask;
160
+ case kVK_Control:
161
+ case kVK_RightControl: return NSControlKeyMask;
162
+ case kVK_Option:
163
+ case kVK_RightOption: return NSAlternateKeyMask;
164
+ case kVK_Command:
165
+ case kVK_RightCommand: return NSCommandKeyMask;
166
+ case kVK_CapsLock: return NSAlphaShiftKeyMask;
167
+ case kVK_Function: return NSFunctionKeyMask;
168
+ }
169
+ return 0;
170
+ }
171
+
172
+ static KeyEvent::Action
173
+ get_flag_key_event_action (const NSEvent* e)
174
+ {
175
+ uint mask = get_modifier_flag_mask(e);
176
+ if (mask == 0) return Reflex::KeyEvent::ACTION_NONE;
177
+
178
+ return [e modifierFlags] & mask
179
+ ? Reflex::KeyEvent::DOWN
180
+ : Reflex::KeyEvent::UP;
181
+ }
182
+
20
183
  static uint
21
184
  get_current_pointer_type ()
22
185
  {
23
186
  NSUInteger buttons = [NSEvent pressedMouseButtons];
24
187
  uint ret = 0;
25
- if (buttons & (1 << 0)) ret |= POINTER_MOUSE_LEFT;
26
- if (buttons & (1 << 1)) ret |= POINTER_MOUSE_RIGHT;
27
- 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;
28
191
  return ret;
29
192
  }
30
193
 
@@ -36,22 +199,24 @@ namespace Reflex
36
199
  case NSLeftMouseDown:
37
200
  case NSLeftMouseUp:
38
201
  case NSLeftMouseDragged:
39
- return POINTER_MOUSE_LEFT;
202
+ return Reflex::Pointer::MOUSE | Reflex::Pointer::MOUSE_LEFT;
40
203
 
41
204
  case NSRightMouseDown:
42
205
  case NSRightMouseUp:
43
206
  case NSRightMouseDragged:
44
- return POINTER_MOUSE_RIGHT;
207
+ return Reflex::Pointer::MOUSE | Reflex::Pointer::MOUSE_RIGHT;
45
208
 
46
209
  case NSOtherMouseDown:
47
210
  case NSOtherMouseUp:
48
211
  case NSOtherMouseDragged:
49
- return POINTER_MOUSE_MIDDLE;
212
+ return Reflex::Pointer::MOUSE | Reflex::Pointer::MOUSE_MIDDLE;
50
213
 
51
214
  case NSMouseMoved:
52
- return get_current_pointer_type();
215
+ return Reflex::Pointer::MOUSE | get_current_pointer_type();
216
+
217
+ default:
218
+ return Reflex::Pointer::TYPE_NONE;
53
219
  }
54
- return 0;
55
220
  }
56
221
 
57
222
  static uint
@@ -78,34 +243,59 @@ namespace Reflex
78
243
  return p;
79
244
  }
80
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
+
81
253
 
82
- NativeKeyEvent::NativeKeyEvent (NSEvent* e, Type type)
254
+ NativeKeyEvent::NativeKeyEvent (NSEvent* e, Action action)
83
255
  : KeyEvent(
84
- type, get_chars(e), [e keyCode], get_modifiers(e), [e isARepeat] ? 1 : 0)
256
+ action, get_chars(e), get_code([e keyCode]),
257
+ get_modifiers(e), [e isARepeat] ? 1 : 0)
85
258
  {
86
259
  }
87
260
 
88
261
 
89
- NativePointerEvent::NativePointerEvent (NSEvent* e, NSView* view, Type type)
90
- : PointerEvent(
91
- type, get_pointer_type(e), (coord) 0, (coord) 0,
92
- get_modifiers(e), (uint) [e clickCount],
93
- [e type] == NSLeftMouseDragged || [e type] == NSRightMouseDragged || [e type] == NSOtherMouseDragged)
262
+ NativeFlagKeyEvent::NativeFlagKeyEvent (NSEvent* e)
263
+ : KeyEvent(
264
+ get_flag_key_event_action(e), "", get_code([e keyCode]),
265
+ get_modifiers(e), 0)
94
266
  {
95
- NSPoint p = correct_point(view, [e locationInWindow]);
96
- x = p.x;
97
- y = p.y;
267
+ }
268
+
269
+
270
+ static bool
271
+ is_pointer_dragging (NSEvent* e)
272
+ {
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()));
98
292
  }
99
293
 
100
294
 
101
295
  NativeWheelEvent::NativeWheelEvent (NSEvent* e, NSView* view)
102
- : WheelEvent([e deltaX], [e deltaY], [e deltaZ])
296
+ : WheelEvent(0, 0, 0, [e deltaX], [e deltaY], [e deltaZ], get_modifiers(e))
103
297
  {
104
- NSPoint p = correct_point(view, [e locationInWindow]);
105
- x = p.x;
106
- y = p.y;
107
- z = 0;
108
- modifiers = get_modifiers(e);
298
+ WheelEvent_set_position(this, get_pointer_position(e, view));
109
299
  }
110
300
 
111
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;
@@ -242,7 +269,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
242
269
 
243
270
  if (dpos != 0 || dsize != 0)
244
271
  {
245
- Reflex::FrameEvent e(b, dpos.x, dpos.y, dsize.x, dsize.y);
272
+ Reflex::FrameEvent e(b, dpos.x, dpos.y, dsize.x, dsize.y, 0, 0);
246
273
  if (dpos != 0) win->on_move(&e);
247
274
  if (dsize != 0)
248
275
  {
@@ -250,7 +277,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
250
277
  b.move_to(0, 0);
251
278
 
252
279
  if (win->painter())
253
- win->painter()->canvas(b, self.backingScaleFactor);
280
+ win->painter()->canvas(b, win->painter()->pixel_density());
254
281
 
255
282
  if (win->root())
256
283
  View_set_frame(win->root(), b);
@@ -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,12 +302,16 @@ 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
282
309
  {
283
- // TODO: implement later.
310
+ Reflex::Window* win = self.window;
311
+ if (!win) return;
312
+
313
+ Reflex::NativeFlagKeyEvent e(event);
314
+ Window_call_key_event(win, &e);
284
315
  }
285
316
 
286
317
  - (void) mouseDown: (NSEvent*) event
@@ -288,8 +319,22 @@ static const NSUInteger WINDOW_STYLE_MASK =
288
319
  Reflex::Window* win = self.window;
289
320
  if (!win) return;
290
321
 
291
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::DOWN);
292
- 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);
293
338
  }
294
339
 
295
340
  - (void) mouseUp: (NSEvent*) event
@@ -297,8 +342,16 @@ static const NSUInteger WINDOW_STYLE_MASK =
297
342
  Reflex::Window* win = self.window;
298
343
  if (!win) return;
299
344
 
300
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::UP);
301
- 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);
302
355
  }
303
356
 
304
357
  - (void) mouseDragged: (NSEvent*) event
@@ -306,8 +359,10 @@ static const NSUInteger WINDOW_STYLE_MASK =
306
359
  Reflex::Window* win = self.window;
307
360
  if (!win) return;
308
361
 
309
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::MOVE);
310
- 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);
311
366
  }
312
367
 
313
368
  - (void) mouseMoved: (NSEvent*) event
@@ -315,8 +370,20 @@ static const NSUInteger WINDOW_STYLE_MASK =
315
370
  Reflex::Window* win = self.window;
316
371
  if (!win) return;
317
372
 
318
- Reflex::NativePointerEvent e(event, view, Reflex::PointerEvent::MOVE);
319
- 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;
320
387
  }
321
388
 
322
389
  - (void) scrollWheel: (NSEvent*) event
@@ -325,7 +392,7 @@ static const NSUInteger WINDOW_STYLE_MASK =
325
392
  if (!win) return;
326
393
 
327
394
  Reflex::NativeWheelEvent e(event, view);
328
- win->on_wheel(&e);
395
+ Window_call_wheel_event(win, &e);
329
396
  }
330
397
 
331
398
  + (NSRect) frameRectForContentRect: (NSRect) contentRect
data/src/osx/window.mm CHANGED
@@ -112,6 +112,28 @@ namespace Reflex
112
112
  rect.size.height);
113
113
  }
114
114
 
115
+ void
116
+ Window_set_resizable (Window* window, bool state)
117
+ {
118
+ NativeWindow* native = get_native(window);
119
+ if (state)
120
+ native.styleMask |= NSResizableWindowMask;
121
+ else
122
+ native.styleMask &= ~NSResizableWindowMask;
123
+ }
124
+
125
+ bool
126
+ Window_is_resizable (const Window& window)
127
+ {
128
+ return get_native(&window).styleMask & NSResizableWindowMask;
129
+ }
130
+
131
+ float
132
+ Window_get_pixel_density (const Window& window)
133
+ {
134
+ return get_native(&window).backingScaleFactor;
135
+ }
136
+
115
137
 
116
138
  WindowData::WindowData ()
117
139
  {