reflexion 0.3.4 → 0.3.6

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/application.cpp +16 -0
  3. data/.doc/ext/reflex/device.cpp +46 -3
  4. data/.doc/ext/reflex/device_event.cpp +62 -0
  5. data/.doc/ext/reflex/key_event.cpp +50 -0
  6. data/.doc/ext/reflex/native.cpp +6 -4
  7. data/.doc/ext/reflex/reflex.cpp +24 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  9. data/CONTRIBUTING.md +7 -0
  10. data/ChangeLog.md +20 -0
  11. data/README.md +46 -2
  12. data/VERSION +1 -1
  13. data/ext/reflex/application.cpp +18 -0
  14. data/ext/reflex/device.cpp +48 -3
  15. data/ext/reflex/device_event.cpp +65 -0
  16. data/ext/reflex/extconf.rb +3 -3
  17. data/ext/reflex/key_event.cpp +50 -0
  18. data/ext/reflex/native.cpp +6 -4
  19. data/ext/reflex/reflex.cpp +24 -0
  20. data/include/reflex/application.h +4 -0
  21. data/include/reflex/defs.h +60 -0
  22. data/include/reflex/device.h +22 -0
  23. data/include/reflex/event.h +25 -0
  24. data/include/reflex/gamepad.h +175 -0
  25. data/include/reflex/ruby/application.h +18 -0
  26. data/include/reflex/ruby/device.h +40 -0
  27. data/include/reflex/ruby/event.h +11 -0
  28. data/reflex.gemspec +3 -3
  29. data/src/application.cpp +67 -0
  30. data/src/application.h +9 -0
  31. data/src/device.cpp +24 -0
  32. data/src/event.cpp +38 -0
  33. data/src/gamepad.cpp +176 -0
  34. data/src/gamepad.h +74 -0
  35. data/src/ios/app_delegate.mm +2 -2
  36. data/src/ios/application.mm +0 -25
  37. data/src/ios/event.mm +2 -3
  38. data/src/ios/gamepad.mm +313 -0
  39. data/src/osx/app_delegate.mm +2 -2
  40. data/src/osx/application.mm +0 -25
  41. data/src/osx/event.h +3 -0
  42. data/src/osx/event.mm +11 -3
  43. data/src/osx/gamepad.mm +40 -0
  44. data/src/osx/gamepad_gc.mm +299 -0
  45. data/src/osx/gamepad_hid.mm +567 -0
  46. data/src/view.cpp +52 -18
  47. data/src/win32/application.cpp +5 -26
  48. data/src/win32/event.cpp +8 -7
  49. data/src/win32/event.h +5 -0
  50. data/src/win32/gamepad.cpp +110 -0
  51. data/src/win32/gamepad.h +20 -0
  52. data/src/win32/window.cpp +9 -1
  53. data/src/window.cpp +15 -0
  54. data/src/window.h +9 -0
  55. metadata +30 -14
data/src/osx/event.mm CHANGED
@@ -5,6 +5,8 @@
5
5
  #include <assert.h>
6
6
  #include <Carbon/Carbon.h>
7
7
  #import <Cocoa/Cocoa.h>
8
+ #include "reflex/exception.h"
9
+ #include "reflex/debug.h"
8
10
 
9
11
 
10
12
  namespace Reflex
@@ -12,9 +14,9 @@ namespace Reflex
12
14
 
13
15
 
14
16
  static uint
15
- get_modifiers (const NSEvent* e)
17
+ get_modifiers (const NSEvent* event)
16
18
  {
17
- NSUInteger flags = e.modifierFlags;
19
+ NSUInteger flags = event ? event.modifierFlags : NSEvent.modifierFlags;
18
20
  return
19
21
  (flags & NSAlphaShiftKeyMask) ? MOD_CAPS : 0 |
20
22
  (flags & NSShiftKeyMask) ? MOD_SHIFT : 0 |
@@ -26,6 +28,12 @@ namespace Reflex
26
28
  (flags & NSFunctionKeyMask) ? MOD_FUNCTION : 0;
27
29
  }
28
30
 
31
+ uint
32
+ get_key_modifiers ()
33
+ {
34
+ return get_modifiers(nil);
35
+ }
36
+
29
37
  static Point
30
38
  get_pointer_position (NSEvent* e, NSView* view)
31
39
  {
@@ -161,4 +169,4 @@ namespace Reflex
161
169
  }
162
170
 
163
171
 
164
- };// Reflex
172
+ }// Reflex
@@ -0,0 +1,40 @@
1
+ // -*- objc -*-
2
+ #include "../gamepad.h"
3
+
4
+
5
+ #include "reflex/exception.h"
6
+ #include "../gamepad.h"
7
+ #include "application.h"
8
+
9
+
10
+ namespace Reflex
11
+ {
12
+
13
+
14
+ void init_gc_gamepads (Application* app);
15
+
16
+ void fin_gc_gamepads (Application* app);
17
+
18
+ void init_hid_gamepads (Application* app);
19
+
20
+ void fin_hid_gamepads (Application* app);
21
+
22
+
23
+ void
24
+ Gamepad_init (Application* app)
25
+ {
26
+ init_gc_gamepads(app);
27
+ init_hid_gamepads(app);
28
+ }
29
+
30
+ void
31
+ Gamepad_fin (Application* app)
32
+ {
33
+ fin_gc_gamepads(app);
34
+ fin_hid_gamepads(app);
35
+
36
+ Gamepad_remove_all(app);
37
+ }
38
+
39
+
40
+ }// Reflex
@@ -0,0 +1,299 @@
1
+ // -*- objc -*-
2
+ #include "../gamepad.h"
3
+
4
+
5
+ #import <GameController/GameController.h>
6
+ #include "reflex/exception.h"
7
+ #include "reflex/debug.h"
8
+ #include "event.h"
9
+ #include "window.h"
10
+
11
+
12
+ namespace Reflex
13
+ {
14
+
15
+
16
+ struct GameControllerGamepadData : Gamepad::Data
17
+ {
18
+
19
+ typedef Gamepad::Data Super;
20
+
21
+ GCController* controller = nil;
22
+
23
+ GameControllerGamepadData (GCController* controller)
24
+ : controller([controller retain])
25
+ {
26
+ prev.reset(new Gamepad());
27
+ }
28
+
29
+ ~GameControllerGamepadData ()
30
+ {
31
+ //clear_event_handlers(controller);
32
+ [controller release];
33
+ }
34
+
35
+ const char* name () const override
36
+ {
37
+ return controller.vendorName.UTF8String;
38
+ }
39
+
40
+ bool is_valid () const override
41
+ {
42
+ return Super::is_valid() && controller;
43
+ }
44
+
45
+ bool has_handle (void* handle) const override
46
+ {
47
+ return handle == controller;
48
+ }
49
+
50
+ };// GameControllerGamepadData
51
+
52
+
53
+ static Gamepad*
54
+ Gamepad_create (GCController* controller)
55
+ {
56
+ Gamepad* g = Gamepad_create();
57
+ g->self.reset(new GameControllerGamepadData(controller));
58
+ return g;
59
+ }
60
+
61
+ static void
62
+ call_gamepad_event (int key_code, bool pressed)
63
+ {
64
+ Window* win = Window_get_active();
65
+ if (!win) return;
66
+
67
+ auto action = pressed ? KeyEvent::DOWN : KeyEvent::UP;
68
+ KeyEvent e(action, NULL, key_code, get_key_modifiers(), 0);
69
+ Window_call_key_event(win, &e);
70
+ }
71
+
72
+ static void
73
+ call_button_event (
74
+ Gamepad* gamepad, ulonglong button, int key_code, float value)
75
+ {
76
+ Gamepad::Data* self = gamepad->self.get();
77
+
78
+ bool pressed = value > Gamepad_get_button_press_threshold();
79
+ bool current = self->state.buttons & button;
80
+ if (pressed == current) return;
81
+
82
+ self->update_prev();
83
+ if (pressed)
84
+ self->state.buttons |= button;
85
+ else
86
+ self->state.buttons &= ~button;
87
+
88
+ call_gamepad_event(key_code, pressed);
89
+ }
90
+
91
+ static void
92
+ handle_button_event (
93
+ Gamepad* gamepad, GCControllerButtonInput* input,
94
+ ulonglong button, int key_code)
95
+ {
96
+ [input setPressedChangedHandler:
97
+ ^(GCControllerButtonInput*, float, BOOL pressed)
98
+ {
99
+ call_button_event(gamepad, button, key_code, pressed ? 1 : 0);
100
+ }];
101
+ }
102
+
103
+ static void
104
+ handle_stick_dpad_event (
105
+ Gamepad* gamepad, GCControllerButtonInput* input,
106
+ ulonglong button, int key_code)
107
+ {
108
+ [input setValueChangedHandler:
109
+ ^(GCControllerButtonInput*, float value, BOOL)
110
+ {
111
+ call_button_event(gamepad, button, key_code, value);
112
+ }];
113
+ }
114
+
115
+ static void
116
+ handle_stick_event (
117
+ Gamepad* gamepad, GCControllerDirectionPad* input, Gamepad::Index index)
118
+ {
119
+ [input setValueChangedHandler:
120
+ ^(GCControllerDirectionPad*, float x, float y)
121
+ {
122
+ gamepad->self->update_prev();
123
+ gamepad->self->state.sticks[index].reset(x, y);
124
+ }];
125
+ }
126
+
127
+ static void
128
+ handle_trigger_event (
129
+ Gamepad* gamepad, GCControllerButtonInput* input, Gamepad::Index index,
130
+ ulonglong button, int key_code)
131
+ {
132
+ [input setPressedChangedHandler:
133
+ ^(GCControllerButtonInput*, float, BOOL pressed)
134
+ {
135
+ call_button_event(gamepad, button, key_code, pressed ? 1 : 0);
136
+ }];
137
+
138
+ [input setValueChangedHandler:
139
+ ^(GCControllerButtonInput*, float value, BOOL)
140
+ {
141
+ Gamepad::Data* self = gamepad->self.get();
142
+
143
+ self->update_prev();
144
+ self->state.triggers[index] = value;
145
+ }];
146
+ }
147
+
148
+ static void
149
+ handle_gamepad_events (Gamepad* gamepad, GCController* controller)
150
+ {
151
+ GCExtendedGamepad* g = controller.extendedGamepad;
152
+ if (!gamepad) return;
153
+
154
+ static const Gamepad::Index L = Gamepad::INDEX_LEFT, R = Gamepad::INDEX_RIGHT;
155
+
156
+ auto* dpad = g.dpad;
157
+ handle_button_event(gamepad, dpad.left, Gamepad::LEFT, KEY_GAMEPAD_LEFT);
158
+ handle_button_event(gamepad, dpad.right, Gamepad::RIGHT, KEY_GAMEPAD_RIGHT);
159
+ handle_button_event(gamepad, dpad.up, Gamepad::UP, KEY_GAMEPAD_UP);
160
+ handle_button_event(gamepad, dpad.down, Gamepad::DOWN, KEY_GAMEPAD_DOWN);
161
+
162
+ auto* lstick = g.leftThumbstick;
163
+ handle_stick_event( gamepad, lstick, L);
164
+ handle_stick_dpad_event(gamepad, lstick.left, Gamepad::LSTICK_LEFT, KEY_GAMEPAD_LSTICK_LEFT);
165
+ handle_stick_dpad_event(gamepad, lstick.right, Gamepad::LSTICK_RIGHT, KEY_GAMEPAD_LSTICK_RIGHT);
166
+ handle_stick_dpad_event(gamepad, lstick.up, Gamepad::LSTICK_UP, KEY_GAMEPAD_LSTICK_UP);
167
+ handle_stick_dpad_event(gamepad, lstick.down, Gamepad::LSTICK_DOWN, KEY_GAMEPAD_LSTICK_DOWN);
168
+
169
+ auto* rstick = g.rightThumbstick;
170
+ handle_stick_event( gamepad, rstick, R);
171
+ handle_stick_dpad_event(gamepad, rstick.left, Gamepad::RSTICK_LEFT, KEY_GAMEPAD_RSTICK_LEFT);
172
+ handle_stick_dpad_event(gamepad, rstick.right, Gamepad::RSTICK_RIGHT, KEY_GAMEPAD_RSTICK_RIGHT);
173
+ handle_stick_dpad_event(gamepad, rstick.up, Gamepad::RSTICK_UP, KEY_GAMEPAD_RSTICK_UP);
174
+ handle_stick_dpad_event(gamepad, rstick.down, Gamepad::RSTICK_DOWN, KEY_GAMEPAD_RSTICK_DOWN);
175
+
176
+ handle_button_event(gamepad, g.buttonA, Gamepad::BUTTON_A, KEY_GAMEPAD_A);
177
+ handle_button_event(gamepad, g.buttonB, Gamepad::BUTTON_B, KEY_GAMEPAD_B);
178
+ handle_button_event(gamepad, g.buttonX, Gamepad::BUTTON_X, KEY_GAMEPAD_X);
179
+ handle_button_event(gamepad, g.buttonY, Gamepad::BUTTON_Y, KEY_GAMEPAD_Y);
180
+
181
+ handle_button_event( gamepad, g. leftShoulder, Gamepad::LSHOULDER, KEY_GAMEPAD_LSHOULDER);
182
+ handle_button_event( gamepad, g.rightShoulder, Gamepad::RSHOULDER, KEY_GAMEPAD_RSHOULDER);
183
+ handle_trigger_event(gamepad, g. leftTrigger, L, Gamepad::LTRIGGER, KEY_GAMEPAD_LTRIGGER);
184
+ handle_trigger_event(gamepad, g.rightTrigger, R, Gamepad::RTRIGGER, KEY_GAMEPAD_RTRIGGER);
185
+
186
+ if (@available(macOS 10.14.1, *))
187
+ {
188
+ handle_button_event(gamepad, g. leftThumbstickButton, Gamepad::LTHUMB, KEY_GAMEPAD_LTHUMB);
189
+ handle_button_event(gamepad, g.rightThumbstickButton, Gamepad::RTHUMB, KEY_GAMEPAD_RTHUMB);
190
+ }
191
+
192
+ if (@available(macOS 10.15, *))
193
+ {
194
+ handle_button_event(gamepad, g.buttonMenu, Gamepad::MENU, KEY_GAMEPAD_MENU);
195
+ handle_button_event(gamepad, g.buttonOptions, Gamepad::OPTION, KEY_GAMEPAD_OPTION);
196
+ }
197
+
198
+ if (@available(macOS 11.0, *))
199
+ handle_button_event(gamepad, g.buttonHome, Gamepad::HOME, KEY_GAMEPAD_HOME);
200
+
201
+ if (@available(macOS 11.0, *))
202
+ {
203
+ if ([g isKindOfClass: GCDualShockGamepad.class])
204
+ {
205
+ GCDualShockGamepad* dualshock = (GCDualShockGamepad*) g;
206
+ handle_button_event(
207
+ gamepad, dualshock.touchpadButton,
208
+ Gamepad::BUTTON_TOUCH, KEY_GAMEPAD_BUTTON_TOUCH);
209
+ }
210
+ }
211
+
212
+ if (@available(macOS 11.3, *))
213
+ {
214
+ if ([g isKindOfClass: GCDualSenseGamepad.class])
215
+ {
216
+ GCDualSenseGamepad* dualsense = (GCDualSenseGamepad*) g;
217
+ handle_button_event(
218
+ gamepad, dualsense.touchpadButton,
219
+ Gamepad::BUTTON_TOUCH, KEY_GAMEPAD_BUTTON_TOUCH);
220
+ }
221
+ }
222
+
223
+ if (@available(macOS 11.0, *))
224
+ {
225
+ if ([g isKindOfClass: GCXboxGamepad.class])
226
+ {
227
+ GCXboxGamepad* xbox = (GCXboxGamepad*) g;
228
+ handle_button_event(
229
+ gamepad, xbox.paddleButton1, Gamepad::RPADDLE_0, KEY_GAMEPAD_RPADDLE_0);
230
+ handle_button_event(
231
+ gamepad, xbox.paddleButton2, Gamepad::LPADDLE_0, KEY_GAMEPAD_LPADDLE_0);
232
+ handle_button_event(
233
+ gamepad, xbox.paddleButton3, Gamepad::RPADDLE_1, KEY_GAMEPAD_RPADDLE_1);
234
+ handle_button_event(
235
+ gamepad, xbox.paddleButton4, Gamepad::LPADDLE_1, KEY_GAMEPAD_LPADDLE_1);
236
+ }
237
+ }
238
+ }
239
+
240
+ static void
241
+ add_gamepad (Application* app, GCController* controller)
242
+ {
243
+ Gamepad* gamepad = Gamepad_create(controller);
244
+ handle_gamepad_events(gamepad, controller);
245
+
246
+ Gamepad_add(app, gamepad);
247
+ }
248
+
249
+ static void
250
+ remove_gamepad (Application* app, GCController* controller)
251
+ {
252
+ Gamepad* gamepad = Gamepad_find(controller);
253
+ if (!gamepad) return;
254
+
255
+ Gamepad_remove(app, gamepad);
256
+ }
257
+
258
+ static id connect_observer = nil;
259
+
260
+ static id disconnect_observer = nil;
261
+
262
+ void
263
+ init_gc_gamepads (Application* app)
264
+ {
265
+ if (connect_observer || disconnect_observer)
266
+ invalid_state_error(__FILE__, __LINE__);
267
+
268
+ connect_observer = [NSNotificationCenter.defaultCenter
269
+ addObserverForName: GCControllerDidConnectNotification
270
+ object: nil
271
+ queue: NSOperationQueue.mainQueue
272
+ usingBlock: ^(NSNotification* n) {add_gamepad(app, n.object);}];
273
+
274
+ disconnect_observer = [NSNotificationCenter.defaultCenter
275
+ addObserverForName: GCControllerDidDisconnectNotification
276
+ object: nil
277
+ queue: NSOperationQueue.mainQueue
278
+ usingBlock: ^(NSNotification* n) {remove_gamepad(app, n.object);}];
279
+
280
+ for (GCController* c in GCController.controllers)
281
+ add_gamepad(app, c);
282
+ }
283
+
284
+ void
285
+ fin_gc_gamepads (Application* app)
286
+ {
287
+ if (!connect_observer || !disconnect_observer)
288
+ invalid_state_error(__FILE__, __LINE__);
289
+
290
+ [NSNotificationCenter.defaultCenter
291
+ removeObserver: connect_observer];
292
+ [NSNotificationCenter.defaultCenter
293
+ removeObserver: disconnect_observer];
294
+
295
+ connect_observer = disconnect_observer = nil;
296
+ }
297
+
298
+
299
+ }// Reflex