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.
- checksums.yaml +4 -4
- data/.doc/ext/reflex/capture_event.cpp +6 -5
- data/.doc/ext/reflex/contact_event.cpp +18 -16
- data/.doc/ext/reflex/draw_event.cpp +10 -8
- data/.doc/ext/reflex/event.cpp +10 -10
- data/.doc/ext/reflex/focus_event.cpp +18 -17
- data/.doc/ext/reflex/frame_event.cpp +17 -17
- data/.doc/ext/reflex/key_event.cpp +227 -28
- data/.doc/ext/reflex/native.cpp +2 -0
- data/.doc/ext/reflex/pointer.cpp +158 -0
- data/.doc/ext/reflex/pointer_event.cpp +32 -91
- data/.doc/ext/reflex/scroll_event.cpp +14 -17
- data/.doc/ext/reflex/selector.cpp +8 -0
- data/.doc/ext/reflex/timer.cpp +9 -1
- data/.doc/ext/reflex/timer_event.cpp +4 -13
- data/.doc/ext/reflex/update_event.cpp +6 -5
- data/.doc/ext/reflex/view.cpp +57 -0
- data/.doc/ext/reflex/wheel_event.cpp +39 -22
- data/.doc/ext/reflex/window.cpp +41 -0
- data/VERSION +1 -1
- data/ext/reflex/capture_event.cpp +6 -5
- data/ext/reflex/contact_event.cpp +18 -16
- data/ext/reflex/draw_event.cpp +9 -7
- data/ext/reflex/event.cpp +11 -11
- data/ext/reflex/focus_event.cpp +18 -17
- data/ext/reflex/frame_event.cpp +16 -16
- data/ext/reflex/key_event.cpp +228 -28
- data/ext/reflex/native.cpp +2 -0
- data/ext/reflex/pointer.cpp +170 -0
- data/ext/reflex/pointer_event.cpp +31 -96
- data/ext/reflex/scroll_event.cpp +15 -18
- data/ext/reflex/selector.cpp +9 -0
- data/ext/reflex/timer.cpp +15 -6
- data/ext/reflex/timer_event.cpp +9 -19
- data/ext/reflex/update_event.cpp +6 -5
- data/ext/reflex/view.cpp +67 -3
- data/ext/reflex/wheel_event.cpp +40 -21
- data/ext/reflex/window.cpp +49 -3
- data/include/reflex/defs.h +140 -106
- data/include/reflex/event.h +232 -124
- data/include/reflex/pointer.h +107 -0
- data/include/reflex/ruby/pointer.h +41 -0
- data/include/reflex/ruby/view.h +9 -0
- data/include/reflex/ruby/window.h +9 -0
- data/include/reflex/selector.h +1 -1
- data/include/reflex/shape.h +2 -2
- data/include/reflex/view.h +6 -4
- data/include/reflex/window.h +14 -8
- data/lib/reflex/application.rb +3 -3
- data/lib/reflex/autoinit.rb +1 -1
- data/lib/reflex/button.rb +7 -7
- data/lib/reflex/capture_event.rb +7 -7
- data/lib/reflex/contact_event.rb +10 -10
- data/lib/reflex/draw_event.rb +2 -2
- data/lib/reflex/ellipse_shape.rb +2 -2
- data/lib/reflex/focus_event.rb +11 -11
- data/lib/reflex/frame_event.rb +5 -5
- data/lib/reflex/helper.rb +20 -20
- data/lib/reflex/image_view.rb +2 -2
- data/lib/reflex/key_event.rb +12 -12
- data/lib/reflex/model.rb +22 -22
- data/lib/reflex/model_owner.rb +7 -7
- data/lib/reflex/model_view.rb +1 -1
- data/lib/reflex/module.rb +5 -5
- data/lib/reflex/pointer.rb +107 -0
- data/lib/reflex/pointer_event.rb +16 -54
- data/lib/reflex/polygon_shape.rb +2 -2
- data/lib/reflex/reflex.rb +3 -3
- data/lib/reflex/scroll_event.rb +1 -1
- data/lib/reflex/selector.rb +4 -4
- data/lib/reflex/shape.rb +13 -13
- data/lib/reflex/style.rb +11 -11
- data/lib/reflex/style_length.rb +1 -1
- data/lib/reflex/text_view.rb +2 -2
- data/lib/reflex/timer.rb +2 -2
- data/lib/reflex/timer_event.rb +3 -2
- data/lib/reflex/update_event.rb +1 -1
- data/lib/reflex/view.rb +32 -32
- data/lib/reflex/wheel_event.rb +2 -10
- data/lib/reflex/window.rb +8 -7
- data/lib/reflex.rb +1 -0
- data/lib/reflexion.rb +17 -17
- data/reflex.gemspec +5 -5
- data/samples/reflexion/noise.rb +1 -1
- data/samples/tree.rb +1 -1
- data/src/event.cpp +792 -86
- data/src/event.h +47 -0
- data/src/image_view.cpp +2 -2
- data/src/ios/event.h +15 -3
- data/src/ios/event.mm +126 -11
- data/src/ios/view_controller.mm +51 -23
- data/src/ios/window.mm +18 -0
- data/src/osx/event.h +15 -4
- data/src/osx/event.mm +214 -24
- data/src/osx/native_window.mm +85 -18
- data/src/osx/window.mm +22 -0
- data/src/pointer.cpp +203 -0
- data/src/pointer.h +26 -0
- data/src/selector.cpp +1 -1
- data/src/shape.cpp +11 -13
- data/src/shape.h +1 -1
- data/src/view.cpp +205 -118
- data/src/view.h +5 -10
- data/src/window.cpp +346 -104
- data/src/window.h +28 -3
- data/src/world.cpp +6 -4
- data/test/helper.rb +3 -3
- data/test/test_application.rb +1 -1
- data/test/test_capture_event.rb +22 -6
- data/test/test_contact_event.rb +40 -0
- data/test/test_draw_event.rb +35 -0
- data/test/test_event.rb +33 -5
- data/test/test_focus_event.rb +34 -0
- data/test/test_frame_event.rb +38 -0
- data/test/test_has_frame.rb +11 -11
- data/test/test_key_event.rb +33 -0
- data/test/test_pointer.rb +149 -0
- data/test/test_pointer_event.rb +70 -104
- data/test/test_reflex.rb +1 -1
- data/test/test_scroll_event.rb +39 -0
- data/test/test_selector.rb +15 -8
- data/test/test_shape.rb +8 -8
- data/test/test_style.rb +13 -13
- data/test/test_style_length.rb +5 -5
- data/test/test_timer_event.rb +38 -0
- data/test/test_update_event.rb +29 -0
- data/test/test_view.rb +57 -30
- data/test/test_wheel_event.rb +40 -0
- data/test/test_window.rb +45 -26
- 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 & (
|
26
|
-
if (buttons & (1
|
27
|
-
if (buttons >= (
|
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
|
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
|
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
|
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,
|
254
|
+
NativeKeyEvent::NativeKeyEvent (NSEvent* e, Action action)
|
83
255
|
: KeyEvent(
|
84
|
-
|
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
|
-
|
90
|
-
:
|
91
|
-
|
92
|
-
get_modifiers(e),
|
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
|
-
|
96
|
-
|
97
|
-
|
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
|
-
|
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
|
|
data/src/osx/native_window.mm
CHANGED
@@ -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
|
41
|
-
|
42
|
-
|
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,
|
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
|
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
|
305
|
+
Window_call_key_event(win, &e);
|
279
306
|
}
|
280
307
|
|
281
308
|
- (void) flagsChanged: (NSEvent*) event
|
282
309
|
{
|
283
|
-
|
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
|
-
|
292
|
-
|
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::
|
301
|
-
|
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::
|
310
|
-
|
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::
|
319
|
-
|
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
|
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
|
{
|