reflexion 0.3.5 → 0.3.7
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/application.cpp +16 -0
- data/.doc/ext/reflex/device.cpp +46 -3
- data/.doc/ext/reflex/device_event.cpp +62 -0
- data/.doc/ext/reflex/key_event.cpp +49 -19
- data/.doc/ext/reflex/midi.cpp +82 -0
- data/.doc/ext/reflex/native.cpp +10 -4
- data/.doc/ext/reflex/note_event.cpp +121 -0
- data/.doc/ext/reflex/reflex.cpp +30 -8
- data/.doc/ext/reflex/view.cpp +11 -16
- data/.doc/ext/reflex/window.cpp +24 -0
- data/ChangeLog.md +16 -0
- data/Rakefile +7 -0
- data/VERSION +1 -1
- data/ext/reflex/application.cpp +18 -0
- data/ext/reflex/device.cpp +48 -3
- data/ext/reflex/device_event.cpp +65 -0
- data/ext/reflex/key_event.cpp +49 -19
- data/ext/reflex/midi.cpp +87 -0
- data/ext/reflex/native.cpp +10 -4
- data/ext/reflex/note_event.cpp +130 -0
- data/ext/reflex/reflex.cpp +31 -8
- data/ext/reflex/view.cpp +11 -16
- data/ext/reflex/window.cpp +27 -0
- data/include/reflex/application.h +4 -0
- data/include/reflex/defs.h +58 -21
- data/include/reflex/device.h +22 -0
- data/include/reflex/event.h +64 -2
- data/include/reflex/gamepad.h +175 -0
- data/include/reflex/midi.h +53 -0
- data/include/reflex/reflex.h +2 -0
- data/include/reflex/ruby/application.h +18 -0
- data/include/reflex/ruby/device.h +40 -0
- data/include/reflex/ruby/event.h +22 -0
- data/include/reflex/ruby/midi.h +84 -0
- data/include/reflex/ruby/window.h +27 -0
- data/include/reflex/view.h +9 -1
- data/include/reflex/window.h +6 -0
- data/lib/reflex/note_event.rb +34 -0
- data/lib/reflex/view.rb +2 -1
- data/lib/reflex.rb +9 -8
- data/reflex.gemspec +3 -3
- data/src/application.cpp +70 -0
- data/src/application.h +9 -0
- data/src/device.cpp +24 -0
- data/src/event.cpp +133 -7
- data/src/event.h +5 -0
- data/src/gamepad.cpp +176 -0
- data/src/gamepad.h +74 -0
- data/src/ios/app_delegate.mm +2 -2
- data/src/ios/application.mm +0 -25
- data/src/ios/event.h +0 -5
- data/src/ios/event.mm +11 -87
- data/src/ios/gamepad.mm +314 -0
- data/src/ios/reflex.mm +0 -5
- data/src/midi.cpp +379 -0
- data/src/midi.h +32 -0
- data/src/osx/app_delegate.mm +2 -2
- data/src/osx/application.mm +0 -25
- data/src/osx/event.h +0 -5
- data/src/osx/event.mm +9 -86
- data/src/osx/gamepad.mm +40 -0
- data/src/osx/gamepad_gc.mm +299 -0
- data/src/osx/gamepad_hid.mm +567 -0
- data/src/osx/reflex.mm +0 -5
- data/src/queue.h +71 -0
- data/src/reflex.cpp +18 -0
- data/src/timer.cpp +3 -10
- data/src/view.cpp +39 -0
- data/src/view.h +2 -0
- data/src/win32/application.cpp +5 -26
- data/src/win32/event.cpp +6 -89
- data/src/win32/event.h +1 -1
- data/src/win32/gamepad.cpp +110 -0
- data/src/win32/gamepad.h +20 -0
- data/src/win32/window.cpp +2 -1
- data/src/window.cpp +61 -10
- data/src/window.h +2 -0
- data/test/test_capture_event.rb +20 -16
- data/test/test_key_event.rb +8 -1
- data/test/test_note_event.rb +43 -0
- data/test/test_view.rb +24 -12
- metadata +43 -14
data/src/view.cpp
CHANGED
@@ -1373,6 +1373,7 @@ namespace Reflex
|
|
1373
1373
|
|
1374
1374
|
KeyEvent e = event->dup();
|
1375
1375
|
view->on_key(&e);
|
1376
|
+
if (e.is_blocked()) return;
|
1376
1377
|
|
1377
1378
|
switch (e.action())
|
1378
1379
|
{
|
@@ -1413,6 +1414,7 @@ namespace Reflex
|
|
1413
1414
|
view->self->pbody->awake();
|
1414
1415
|
|
1415
1416
|
view->on_pointer(event);
|
1417
|
+
if (event->is_blocked()) return;
|
1416
1418
|
|
1417
1419
|
switch ((*event)[0].action())
|
1418
1420
|
{
|
@@ -1506,6 +1508,28 @@ namespace Reflex
|
|
1506
1508
|
view->on_wheel(&e);
|
1507
1509
|
}
|
1508
1510
|
|
1511
|
+
void
|
1512
|
+
View_call_note_event (View* view, NoteEvent* event)
|
1513
|
+
{
|
1514
|
+
if (!view)
|
1515
|
+
argument_error(__FILE__, __LINE__);
|
1516
|
+
if (!event)
|
1517
|
+
argument_error(__FILE__, __LINE__);
|
1518
|
+
|
1519
|
+
if (view->hidden()) return;
|
1520
|
+
|
1521
|
+
NoteEvent e = event->dup();
|
1522
|
+
view->on_note(&e);
|
1523
|
+
if (e.is_blocked()) return;
|
1524
|
+
|
1525
|
+
switch (e.action())
|
1526
|
+
{
|
1527
|
+
case NoteEvent::ON: view->on_note_on(&e); break;
|
1528
|
+
case NoteEvent::OFF: view->on_note_off(&e); break;
|
1529
|
+
default: break;
|
1530
|
+
}
|
1531
|
+
}
|
1532
|
+
|
1509
1533
|
void
|
1510
1534
|
View_call_contact_event (View* view, ContactEvent* event)
|
1511
1535
|
{
|
@@ -2781,6 +2805,21 @@ namespace Reflex
|
|
2781
2805
|
//scroll_by(e->dx, e->dy, e->dz);
|
2782
2806
|
}
|
2783
2807
|
|
2808
|
+
void
|
2809
|
+
View::on_note (NoteEvent* e)
|
2810
|
+
{
|
2811
|
+
}
|
2812
|
+
|
2813
|
+
void
|
2814
|
+
View::on_note_on (NoteEvent* e)
|
2815
|
+
{
|
2816
|
+
}
|
2817
|
+
|
2818
|
+
void
|
2819
|
+
View::on_note_off (NoteEvent* e)
|
2820
|
+
{
|
2821
|
+
}
|
2822
|
+
|
2784
2823
|
void
|
2785
2824
|
View::on_capture (CaptureEvent* e)
|
2786
2825
|
{
|
data/src/view.h
CHANGED
data/src/win32/application.cpp
CHANGED
@@ -42,7 +42,7 @@ namespace Reflex
|
|
42
42
|
Application::start ()
|
43
43
|
{
|
44
44
|
Event e;
|
45
|
-
|
45
|
+
Application_call_start(this, &e);
|
46
46
|
|
47
47
|
timeBeginPeriod(1);
|
48
48
|
|
@@ -84,27 +84,11 @@ namespace Reflex
|
|
84
84
|
void
|
85
85
|
Application::quit ()
|
86
86
|
{
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
void
|
91
|
-
Application::on_start (Event* e)
|
92
|
-
{
|
93
|
-
}
|
94
|
-
|
95
|
-
void
|
96
|
-
Application::on_quit (Event* e)
|
97
|
-
{
|
98
|
-
}
|
99
|
-
|
100
|
-
void
|
101
|
-
Application::on_motion (MotionEvent* e)
|
102
|
-
{
|
103
|
-
}
|
87
|
+
Event e;
|
88
|
+
Application_call_quit(this, &e);
|
89
|
+
if (e.is_blocked()) return;
|
104
90
|
|
105
|
-
|
106
|
-
Application::on_preference (Event* e)
|
107
|
-
{
|
91
|
+
PostQuitMessage(0);
|
108
92
|
}
|
109
93
|
|
110
94
|
void
|
@@ -112,10 +96,5 @@ namespace Reflex
|
|
112
96
|
{
|
113
97
|
}
|
114
98
|
|
115
|
-
Application::operator bool () const
|
116
|
-
{
|
117
|
-
return true;
|
118
|
-
}
|
119
|
-
|
120
99
|
|
121
100
|
}// Reflex
|
data/src/win32/event.cpp
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#include "event.h"
|
2
2
|
|
3
3
|
|
4
|
-
#include <xinput.h>
|
5
4
|
#include <xot/time.h>
|
6
5
|
#include "reflex/exception.h"
|
7
6
|
#include "reflex/debug.h"
|
@@ -12,8 +11,8 @@ namespace Reflex
|
|
12
11
|
{
|
13
12
|
|
14
13
|
|
15
|
-
|
16
|
-
|
14
|
+
uint
|
15
|
+
KeyEvent_get_modifiers ()
|
17
16
|
{
|
18
17
|
return
|
19
18
|
(GetKeyState(VK_SHIFT) & 0x8000 ? MOD_SHIFT : 0) |
|
@@ -38,7 +37,7 @@ namespace Reflex
|
|
38
37
|
}
|
39
38
|
|
40
39
|
NativeKeyEvent::NativeKeyEvent (UINT msg, WPARAM wp, LPARAM lp, const char* chars)
|
41
|
-
: KeyEvent(get_key_action(msg), chars, (int) wp,
|
40
|
+
: KeyEvent(get_key_action(msg), chars, (int) wp, KeyEvent_get_modifiers(), lp & 0xFF)
|
42
41
|
{
|
43
42
|
}
|
44
43
|
|
@@ -136,7 +135,7 @@ namespace Reflex
|
|
136
135
|
get_mouse_type(msg, wp),
|
137
136
|
get_mouse_action(msg),
|
138
137
|
Point(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)),
|
139
|
-
|
138
|
+
KeyEvent_get_modifiers(),
|
140
139
|
get_mouse_click_count(msg),
|
141
140
|
is_mouse_dragging(msg, wp),
|
142
141
|
Xot::time()));
|
@@ -197,7 +196,7 @@ namespace Reflex
|
|
197
196
|
get_touch_type(touch),
|
198
197
|
action,
|
199
198
|
get_touch_position(hwnd, touch),
|
200
|
-
|
199
|
+
KeyEvent_get_modifiers(),
|
201
200
|
action == Pointer::DOWN ? 1 : 0,
|
202
201
|
action == Pointer::MOVE,
|
203
202
|
get_touch_time(touch));
|
@@ -213,90 +212,8 @@ namespace Reflex
|
|
213
212
|
: WheelEvent(
|
214
213
|
GET_X_LPARAM(lp), GET_Y_LPARAM(lp), 0,
|
215
214
|
GET_WHEEL_DELTA_WPARAM(wp_x), -GET_WHEEL_DELTA_WPARAM(wp_y), 0,
|
216
|
-
|
217
|
-
{
|
218
|
-
}
|
219
|
-
|
220
|
-
|
221
|
-
static void
|
222
|
-
call_gamepad_event (Window* win, int code, bool pressed)
|
223
|
-
{
|
224
|
-
auto action = pressed ? KeyEvent::DOWN : KeyEvent::UP;
|
225
|
-
KeyEvent e(action, NULL, code, get_modifiers(), 0);
|
226
|
-
Window_call_key_event(win, &e);
|
227
|
-
}
|
228
|
-
|
229
|
-
static void
|
230
|
-
handle_gamepad_button_event (
|
231
|
-
Window* win, const XINPUT_STATE& state, const XINPUT_STATE& prev_state,
|
232
|
-
WORD mask, int code)
|
233
|
-
{
|
234
|
-
WORD pressed = state.Gamepad.wButtons & mask;
|
235
|
-
WORD prev = prev_state.Gamepad.wButtons & mask;
|
236
|
-
if (pressed == prev) return;
|
237
|
-
|
238
|
-
call_gamepad_event(win, code, pressed);
|
239
|
-
}
|
240
|
-
|
241
|
-
static void
|
242
|
-
handle_gamepad_trigger_event (Window* win, BYTE value, BYTE prev_value, int code)
|
243
|
-
{
|
244
|
-
WORD pressed = value > XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
|
245
|
-
WORD prev = prev_value > XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
|
246
|
-
if (pressed == prev) return;
|
247
|
-
|
248
|
-
call_gamepad_event(win, code, pressed);
|
249
|
-
}
|
250
|
-
|
251
|
-
static void
|
252
|
-
handle_gamepad_events (const XINPUT_STATE& state, const XINPUT_STATE& prev_state)
|
215
|
+
KeyEvent_get_modifiers())
|
253
216
|
{
|
254
|
-
Window* win = Window_get_active();
|
255
|
-
if (!win) return;
|
256
|
-
|
257
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_DPAD_LEFT, KEY_GAMEPAD_LEFT);
|
258
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_DPAD_RIGHT, KEY_GAMEPAD_RIGHT);
|
259
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_DPAD_UP, KEY_GAMEPAD_UP);
|
260
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_DPAD_DOWN, KEY_GAMEPAD_DOWN);
|
261
|
-
|
262
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_A, KEY_GAMEPAD_A);
|
263
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_B, KEY_GAMEPAD_B);
|
264
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_X, KEY_GAMEPAD_X);
|
265
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_Y, KEY_GAMEPAD_Y);
|
266
|
-
|
267
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_LEFT_SHOULDER, KEY_GAMEPAD_SHOULDER_LEFT);
|
268
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_RIGHT_SHOULDER, KEY_GAMEPAD_SHOULDER_RIGHT);
|
269
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_LEFT_THUMB, KEY_GAMEPAD_THUMB_LEFT);
|
270
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_RIGHT_THUMB, KEY_GAMEPAD_THUMB_RIGHT);
|
271
|
-
|
272
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_START, KEY_GAMEPAD_START);
|
273
|
-
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_BACK, KEY_GAMEPAD_SELECT);
|
274
|
-
|
275
|
-
handle_gamepad_trigger_event(win, state.Gamepad.bLeftTrigger, prev_state.Gamepad.bLeftTrigger, KEY_GAMEPAD_TRIGGER_LEFT);
|
276
|
-
handle_gamepad_trigger_event(win, state.Gamepad.bRightTrigger, prev_state.Gamepad.bRightTrigger, KEY_GAMEPAD_TRIGGER_RIGHT);
|
277
|
-
}
|
278
|
-
|
279
|
-
void
|
280
|
-
poll_gamepads ()
|
281
|
-
{
|
282
|
-
static XINPUT_STATE prev_state;
|
283
|
-
static bool prev_detected = false;
|
284
|
-
|
285
|
-
XINPUT_STATE state = {0};
|
286
|
-
bool detected = XInputGetState(0, &state) == ERROR_SUCCESS;
|
287
|
-
|
288
|
-
if (detected != prev_detected)
|
289
|
-
{
|
290
|
-
prev_detected = detected;
|
291
|
-
if (detected) prev_state = {0};
|
292
|
-
}
|
293
|
-
|
294
|
-
if (!detected) return;
|
295
|
-
|
296
|
-
if (state.dwPacketNumber != prev_state.dwPacketNumber)
|
297
|
-
handle_gamepad_events(state, prev_state);
|
298
|
-
|
299
|
-
prev_state = state;
|
300
217
|
}
|
301
218
|
|
302
219
|
|
data/src/win32/event.h
CHANGED
@@ -0,0 +1,110 @@
|
|
1
|
+
#include "gamepad.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include <xot/windows.h>
|
5
|
+
#include <xinput.h>
|
6
|
+
|
7
|
+
#include "reflex/exception.h"
|
8
|
+
#include "reflex/debug.h"
|
9
|
+
#include "window.h"
|
10
|
+
#include "event.h"
|
11
|
+
|
12
|
+
|
13
|
+
namespace Reflex
|
14
|
+
{
|
15
|
+
|
16
|
+
|
17
|
+
static void
|
18
|
+
call_gamepad_event (Window* win, int code, bool pressed)
|
19
|
+
{
|
20
|
+
auto action = pressed ? KeyEvent::DOWN : KeyEvent::UP;
|
21
|
+
KeyEvent e(action, NULL, code, KeyEvent_get_modifiers(), 0);
|
22
|
+
Window_call_key_event(win, &e);
|
23
|
+
}
|
24
|
+
|
25
|
+
static void
|
26
|
+
handle_gamepad_button_event (
|
27
|
+
Window* win, const XINPUT_STATE& state, const XINPUT_STATE& prev_state,
|
28
|
+
WORD mask, int code)
|
29
|
+
{
|
30
|
+
WORD pressed = state.Gamepad.wButtons & mask;
|
31
|
+
WORD prev = prev_state.Gamepad.wButtons & mask;
|
32
|
+
if (pressed == prev) return;
|
33
|
+
|
34
|
+
call_gamepad_event(win, code, pressed);
|
35
|
+
}
|
36
|
+
|
37
|
+
static void
|
38
|
+
handle_gamepad_trigger_event (Window* win, BYTE value, BYTE prev_value, int code)
|
39
|
+
{
|
40
|
+
WORD pressed = value > XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
|
41
|
+
WORD prev = prev_value > XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
|
42
|
+
if (pressed == prev) return;
|
43
|
+
|
44
|
+
call_gamepad_event(win, code, pressed);
|
45
|
+
}
|
46
|
+
|
47
|
+
static void
|
48
|
+
handle_gamepad_events (const XINPUT_STATE& state, const XINPUT_STATE& prev_state)
|
49
|
+
{
|
50
|
+
Window* win = Window_get_active();
|
51
|
+
if (!win) return;
|
52
|
+
|
53
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_DPAD_LEFT, KEY_GAMEPAD_LEFT);
|
54
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_DPAD_RIGHT, KEY_GAMEPAD_RIGHT);
|
55
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_DPAD_UP, KEY_GAMEPAD_UP);
|
56
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_DPAD_DOWN, KEY_GAMEPAD_DOWN);
|
57
|
+
|
58
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_A, KEY_GAMEPAD_A);
|
59
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_B, KEY_GAMEPAD_B);
|
60
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_X, KEY_GAMEPAD_X);
|
61
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_Y, KEY_GAMEPAD_Y);
|
62
|
+
|
63
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_LEFT_SHOULDER, KEY_GAMEPAD_LSHOULDER);
|
64
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_RIGHT_SHOULDER, KEY_GAMEPAD_RSHOULDER);
|
65
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_LEFT_THUMB, KEY_GAMEPAD_LTHUMB);
|
66
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_RIGHT_THUMB, KEY_GAMEPAD_RTHUMB);
|
67
|
+
|
68
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_START, KEY_GAMEPAD_START);
|
69
|
+
handle_gamepad_button_event(win, state, prev_state, XINPUT_GAMEPAD_BACK, KEY_GAMEPAD_SELECT);
|
70
|
+
|
71
|
+
handle_gamepad_trigger_event(win, state.Gamepad.bLeftTrigger, prev_state.Gamepad.bLeftTrigger, KEY_GAMEPAD_LTRIGGER);
|
72
|
+
handle_gamepad_trigger_event(win, state.Gamepad.bRightTrigger, prev_state.Gamepad.bRightTrigger, KEY_GAMEPAD_RTRIGGER);
|
73
|
+
}
|
74
|
+
|
75
|
+
void
|
76
|
+
Gamepad_init (Application* app)
|
77
|
+
{
|
78
|
+
}
|
79
|
+
|
80
|
+
void
|
81
|
+
Gamepad_fin (Application* app)
|
82
|
+
{
|
83
|
+
Gamepad_remove_all(app);
|
84
|
+
}
|
85
|
+
|
86
|
+
void
|
87
|
+
Gamepad_poll ()
|
88
|
+
{
|
89
|
+
static XINPUT_STATE prev_state;
|
90
|
+
static bool prev_detected = false;
|
91
|
+
|
92
|
+
XINPUT_STATE state = {0};
|
93
|
+
bool detected = XInputGetState(0, &state) == ERROR_SUCCESS;
|
94
|
+
|
95
|
+
if (detected != prev_detected)
|
96
|
+
{
|
97
|
+
prev_detected = detected;
|
98
|
+
if (detected) prev_state = {0};
|
99
|
+
}
|
100
|
+
|
101
|
+
if (!detected) return;
|
102
|
+
|
103
|
+
if (state.dwPacketNumber != prev_state.dwPacketNumber)
|
104
|
+
handle_gamepad_events(state, prev_state);
|
105
|
+
|
106
|
+
prev_state = state;
|
107
|
+
}
|
108
|
+
|
109
|
+
|
110
|
+
}// Reflex
|
data/src/win32/gamepad.h
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
// -*- c++ -*-
|
2
|
+
#pragma once
|
3
|
+
#ifndef __REFLEX_SRC_WIN32_GAMEPAD_H__
|
4
|
+
#define __REFLEX_SRC_WIN32_GAMEPAD_H__
|
5
|
+
|
6
|
+
|
7
|
+
#include "../gamepad.h"
|
8
|
+
|
9
|
+
|
10
|
+
namespace Reflex
|
11
|
+
{
|
12
|
+
|
13
|
+
|
14
|
+
void Gamepad_poll ();
|
15
|
+
|
16
|
+
|
17
|
+
}// Reflex
|
18
|
+
|
19
|
+
|
20
|
+
#endif//EOH
|
data/src/win32/window.cpp
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
#include "reflex/debug.h"
|
13
13
|
#include "../view.h"
|
14
14
|
#include "event.h"
|
15
|
+
#include "gamepad.h"
|
15
16
|
#include "screen.h"
|
16
17
|
#include "opengl.h"
|
17
18
|
|
@@ -154,7 +155,7 @@ namespace Reflex
|
|
154
155
|
{
|
155
156
|
WindowData* self = get_data(win);
|
156
157
|
|
157
|
-
|
158
|
+
Gamepad_poll();
|
158
159
|
|
159
160
|
Window_call_update_event(win);
|
160
161
|
|
data/src/window.cpp
CHANGED
@@ -103,25 +103,18 @@ namespace Reflex
|
|
103
103
|
}
|
104
104
|
}
|
105
105
|
|
106
|
-
|
107
|
-
{
|
108
|
-
|
109
|
-
static Window_CreateRootViewFun create_root_view_fun = NULL;
|
110
|
-
|
111
|
-
}// global
|
106
|
+
static Window_CreateRootViewFun create_root_view_fun = NULL;
|
112
107
|
|
113
108
|
void
|
114
109
|
Window_set_create_root_view_fun (Window_CreateRootViewFun fun)
|
115
110
|
{
|
116
|
-
|
111
|
+
create_root_view_fun = fun;
|
117
112
|
}
|
118
113
|
|
119
114
|
static View*
|
120
115
|
create_root_view ()
|
121
116
|
{
|
122
|
-
return
|
123
|
-
? global::create_root_view_fun()
|
124
|
-
: new View();
|
117
|
+
return create_root_view_fun ? create_root_view_fun() : new View();
|
125
118
|
}
|
126
119
|
|
127
120
|
void
|
@@ -614,6 +607,49 @@ namespace Reflex
|
|
614
607
|
View_call_wheel_event(window->root(), event);
|
615
608
|
}
|
616
609
|
|
610
|
+
void
|
611
|
+
Window_call_note_event (Window* window, NoteEvent* event)
|
612
|
+
{
|
613
|
+
assert(window);
|
614
|
+
|
615
|
+
if (!event)
|
616
|
+
argument_error(__FILE__, __LINE__);
|
617
|
+
|
618
|
+
for (auto& [view, targets] : window->self->captures)
|
619
|
+
{
|
620
|
+
if (
|
621
|
+
!view->window() ||
|
622
|
+
!is_capturing(view.get(), targets, View::CAPTURE_NOTE))
|
623
|
+
{
|
624
|
+
continue;
|
625
|
+
}
|
626
|
+
|
627
|
+
NoteEvent e = event->dup();
|
628
|
+
NoteEvent_set_captured(&e, true);
|
629
|
+
View_call_note_event(const_cast<View*>(view.get()), &e);
|
630
|
+
|
631
|
+
if (e.is_blocked()) event->block();
|
632
|
+
}
|
633
|
+
|
634
|
+
if (!event->is_blocked())
|
635
|
+
window->on_note(event);
|
636
|
+
|
637
|
+
if (!event->is_blocked())
|
638
|
+
{
|
639
|
+
switch (event->action())
|
640
|
+
{
|
641
|
+
case NoteEvent::ON: window->on_note_on(event); break;
|
642
|
+
case NoteEvent::OFF: window->on_note_off(event); break;
|
643
|
+
default: break;
|
644
|
+
}
|
645
|
+
}
|
646
|
+
|
647
|
+
if (!event->is_blocked() && window->self->focus)
|
648
|
+
View_call_note_event(window->self->focus.get(), event);
|
649
|
+
|
650
|
+
cleanup_captures(window);
|
651
|
+
}
|
652
|
+
|
617
653
|
|
618
654
|
Window::Window ()
|
619
655
|
: self(Window_create_data())
|
@@ -905,6 +941,21 @@ namespace Reflex
|
|
905
941
|
{
|
906
942
|
}
|
907
943
|
|
944
|
+
void
|
945
|
+
Window::on_note (NoteEvent* e)
|
946
|
+
{
|
947
|
+
}
|
948
|
+
|
949
|
+
void
|
950
|
+
Window::on_note_on (NoteEvent* e)
|
951
|
+
{
|
952
|
+
}
|
953
|
+
|
954
|
+
void
|
955
|
+
Window::on_note_off (NoteEvent* e)
|
956
|
+
{
|
957
|
+
}
|
958
|
+
|
908
959
|
Window::operator bool () const
|
909
960
|
{
|
910
961
|
return self && *self;
|
data/src/window.h
CHANGED
data/test/test_capture_event.rb
CHANGED
@@ -26,31 +26,35 @@ class TestCaptureEvent < Test::Unit::TestCase
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def test_begin()
|
29
|
-
c = event [:key, :pointer], []
|
30
|
-
assert_equal [:key, :pointer], c.begin
|
31
|
-
assert_equal true,
|
32
|
-
assert_equal true,
|
33
|
-
assert_equal true,
|
29
|
+
c = event [:key, :pointer, :note], []
|
30
|
+
assert_equal [:key, :pointer, :note], c.begin
|
31
|
+
assert_equal true, c.begin?(:key)
|
32
|
+
assert_equal true, c.begin?(:pointer)
|
33
|
+
assert_equal true, c.begin?(:note)
|
34
|
+
assert_equal true, c.begin?(:all)
|
34
35
|
|
35
36
|
c = event [:key], []
|
36
37
|
assert_equal [:key], c.begin
|
37
|
-
assert_equal true,
|
38
|
-
assert_equal false,
|
39
|
-
assert_equal false,
|
38
|
+
assert_equal true, c.begin?(:key)
|
39
|
+
assert_equal false, c.begin?(:pointer)
|
40
|
+
assert_equal false, c.begin?(:note)
|
41
|
+
assert_equal false, c.begin?(:all)
|
40
42
|
end
|
41
43
|
|
42
44
|
def test_end()
|
43
|
-
c = event [], [:key, :pointer]
|
44
|
-
assert_equal [:key, :pointer], c.end
|
45
|
-
assert_equal true,
|
46
|
-
assert_equal true,
|
47
|
-
assert_equal true,
|
45
|
+
c = event [], [:key, :pointer, :note]
|
46
|
+
assert_equal [:key, :pointer, :note], c.end
|
47
|
+
assert_equal true, c.end?(:key)
|
48
|
+
assert_equal true, c.end?(:pointer)
|
49
|
+
assert_equal true, c.end?(:note)
|
50
|
+
assert_equal true, c.end?(:all)
|
48
51
|
|
49
52
|
c = event [], [:key]
|
50
53
|
assert_equal [:key], c.end
|
51
|
-
assert_equal true,
|
52
|
-
assert_equal false,
|
53
|
-
assert_equal false,
|
54
|
+
assert_equal true, c.end?(:key)
|
55
|
+
assert_equal false, c.end?(:pointer)
|
56
|
+
assert_equal false, c.end?(:note)
|
57
|
+
assert_equal false, c.end?(:all)
|
54
58
|
end
|
55
59
|
|
56
60
|
end# TestCaptureEvent
|
data/test/test_key_event.rb
CHANGED
@@ -3,7 +3,7 @@ require_relative 'helper'
|
|
3
3
|
|
4
4
|
class TestKeyEvent < Test::Unit::TestCase
|
5
5
|
|
6
|
-
DOWN = Reflex::KeyEvent::DOWN
|
6
|
+
DOWN, UP = Reflex::KeyEvent::DOWN, Reflex::KeyEvent::UP
|
7
7
|
|
8
8
|
def event(*args)
|
9
9
|
Reflex::KeyEvent.new(*args)
|
@@ -29,6 +29,13 @@ class TestKeyEvent < Test::Unit::TestCase
|
|
29
29
|
assert_true e3.blocked?
|
30
30
|
end
|
31
31
|
|
32
|
+
def test_down_up()
|
33
|
+
assert_true event(DOWN, 'a', 1, 2, 3).down?
|
34
|
+
assert_false event(DOWN, 'a', 1, 2, 3).up?
|
35
|
+
assert_false event(UP, 'a', 1, 2, 3).down?
|
36
|
+
assert_true event(UP, 'a', 1, 2, 3).up?
|
37
|
+
end
|
38
|
+
|
32
39
|
def test_chars()
|
33
40
|
assert_equal 'foo', event(DOWN, 'foo', 1, 2, 3).chars
|
34
41
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
|
4
|
+
class TestNoteEvent < Test::Unit::TestCase
|
5
|
+
|
6
|
+
ON, OFF = Reflex::NoteEvent::ON, Reflex::NoteEvent::OFF
|
7
|
+
|
8
|
+
def event(*args)
|
9
|
+
Reflex::NoteEvent.new(*args)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_initialize()
|
13
|
+
e = event ON, 1, 2, 0.5, 3
|
14
|
+
assert_equal :on, e.action
|
15
|
+
assert_equal 1, e.channel
|
16
|
+
assert_equal 2, e.note
|
17
|
+
assert_equal 0.5, e.velocity
|
18
|
+
assert_equal 3, e.time
|
19
|
+
assert_false e.captured?
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_dup()
|
23
|
+
e1 = event ON, 1, 2, 0.5, 3
|
24
|
+
e2 = e1.dup
|
25
|
+
e1.block
|
26
|
+
e3 = e1.dup
|
27
|
+
assert_true e1.blocked?
|
28
|
+
assert_false e2.blocked?
|
29
|
+
assert_true e3.blocked?
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_on_off()
|
33
|
+
assert_true event(ON, 1, 2, 0.5, 3).on?
|
34
|
+
assert_false event(ON, 1, 2, 0.5, 3).off?
|
35
|
+
assert_false event(OFF, 1, 2, 0.5, 3).on?
|
36
|
+
assert_true event(OFF, 1, 2, 0.5, 3).off?
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_frequency()
|
40
|
+
assert_equal 440, event(ON, 1, 69, 0.5, 3).frequency
|
41
|
+
end
|
42
|
+
|
43
|
+
end# TestNoteEvent
|