reflexion 0.1.20 → 0.1.24

Sign up to get free protection for your applications and to get access to all the features.
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
  {