reflexion 0.3.6 → 0.3.8

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/midi.cpp +82 -0
  3. data/.doc/ext/reflex/native.cpp +4 -0
  4. data/.doc/ext/reflex/note_event.cpp +121 -0
  5. data/.doc/ext/reflex/reflex.cpp +23 -2
  6. data/.doc/ext/reflex/view.cpp +11 -16
  7. data/.doc/ext/reflex/window.cpp +24 -0
  8. data/ChangeLog.md +13 -0
  9. data/Rakefile +7 -0
  10. data/VERSION +1 -1
  11. data/ext/reflex/midi.cpp +87 -0
  12. data/ext/reflex/native.cpp +4 -0
  13. data/ext/reflex/note_event.cpp +130 -0
  14. data/ext/reflex/reflex.cpp +24 -2
  15. data/ext/reflex/view.cpp +11 -16
  16. data/ext/reflex/window.cpp +27 -0
  17. data/include/reflex/event.h +39 -2
  18. data/include/reflex/gamepad.h +2 -2
  19. data/include/reflex/midi.h +53 -0
  20. data/include/reflex/reflex.h +2 -0
  21. data/include/reflex/ruby/event.h +11 -0
  22. data/include/reflex/ruby/midi.h +84 -0
  23. data/include/reflex/ruby/window.h +27 -0
  24. data/include/reflex/view.h +9 -1
  25. data/include/reflex/window.h +6 -0
  26. data/lib/reflex/note_event.rb +34 -0
  27. data/lib/reflex/view.rb +2 -1
  28. data/lib/reflex.rb +9 -8
  29. data/reflex.gemspec +3 -3
  30. data/src/application.cpp +5 -2
  31. data/src/event.cpp +95 -7
  32. data/src/event.h +5 -0
  33. data/src/gamepad.cpp +14 -14
  34. data/src/gamepad.h +9 -9
  35. data/src/ios/event.mm +10 -2
  36. data/src/ios/gamepad.mm +2 -1
  37. data/src/midi.cpp +379 -0
  38. data/src/midi.h +32 -0
  39. data/src/osx/event.h +0 -3
  40. data/src/osx/event.mm +6 -6
  41. data/src/osx/gamepad_gc.mm +1 -1
  42. data/src/osx/gamepad_hid.mm +1 -1
  43. data/src/queue.h +71 -0
  44. data/src/reflex.cpp +18 -0
  45. data/src/timer.cpp +3 -10
  46. data/src/view.cpp +39 -0
  47. data/src/view.h +2 -0
  48. data/src/win32/event.cpp +5 -5
  49. data/src/win32/event.h +0 -2
  50. data/src/win32/gamepad.cpp +1 -1
  51. data/src/window.cpp +61 -10
  52. data/src/window.h +2 -0
  53. data/test/test_capture_event.rb +20 -16
  54. data/test/test_key_event.rb +8 -1
  55. data/test/test_note_event.rb +43 -0
  56. data/test/test_view.rb +24 -12
  57. metadata +29 -14
@@ -65,7 +65,7 @@ namespace Reflex
65
65
  if (!win) return;
66
66
 
67
67
  auto action = pressed ? KeyEvent::DOWN : KeyEvent::UP;
68
- KeyEvent e(action, NULL, key_code, get_key_modifiers(), 0);
68
+ KeyEvent e(action, NULL, key_code, KeyEvent_get_modifiers(), 0);
69
69
  Window_call_key_event(win, &e);
70
70
  }
71
71
 
@@ -308,7 +308,7 @@ namespace Reflex
308
308
  if (!win) return;
309
309
 
310
310
  auto action = pressed ? KeyEvent::DOWN : KeyEvent::UP;
311
- KeyEvent e(action, NULL, key_code, get_key_modifiers(), 0);
311
+ KeyEvent e(action, NULL, key_code, KeyEvent_get_modifiers(), 0);
312
312
  Window_call_key_event(win, &e);
313
313
  }
314
314
 
data/src/queue.h ADDED
@@ -0,0 +1,71 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __REFLEX_SRC_QUEUE_H__
4
+ #define __REFLEX_SRC_QUEUE_H__
5
+
6
+
7
+ #include <queue>
8
+ #include <mutex>
9
+ #include <condition_variable>
10
+
11
+
12
+ namespace Reflex
13
+ {
14
+
15
+
16
+ template <typename T>
17
+ class Queue
18
+ {
19
+
20
+ public:
21
+
22
+ void push (const T& value)
23
+ {
24
+ {
25
+ std::lock_guard<std::mutex> lock(mutex);
26
+ queue.push(value);
27
+ }
28
+ condvar.notify_one();
29
+ }
30
+
31
+ T pop ()
32
+ {
33
+ std::unique_lock<std::mutex> lock(mutex);
34
+ condvar.wait(lock, [this] {return !queue.empty();});
35
+
36
+ T value = queue.front();
37
+ queue.pop();
38
+ return value;
39
+ }
40
+
41
+ bool try_pop (T* value)
42
+ {
43
+ std::lock_guard<std::mutex> lock(mutex);
44
+ if (queue.empty()) return false;
45
+
46
+ *value = queue.front();
47
+ queue.pop();
48
+ return true;
49
+ }
50
+
51
+ bool empty () const
52
+ {
53
+ std::lock_guard<std::mutex> lock(mutex);
54
+ return queue.empty();
55
+ }
56
+
57
+ private:
58
+
59
+ std::queue<T> queue;
60
+
61
+ std::mutex mutex;
62
+
63
+ std::condition_variable condvar;
64
+
65
+ };// Queue
66
+
67
+
68
+ }// Reflex
69
+
70
+
71
+ #endif//EOH
data/src/reflex.cpp ADDED
@@ -0,0 +1,18 @@
1
+ #include "reflex/reflex.h"
2
+
3
+
4
+ #include "midi.h"
5
+
6
+
7
+ namespace Reflex
8
+ {
9
+
10
+
11
+ void
12
+ process_events ()
13
+ {
14
+ MIDI_process_events();
15
+ }
16
+
17
+
18
+ }// Reflex
data/src/timer.cpp CHANGED
@@ -40,25 +40,18 @@ namespace Reflex
40
40
  };// Data
41
41
 
42
42
 
43
- namespace global
44
- {
45
-
46
- static Timer_CreateFun create_fun = NULL;
47
-
48
- }// global
43
+ static Timer_CreateFun timer_create_fun = NULL;
49
44
 
50
45
  void
51
46
  Timer_set_create_fun (Timer_CreateFun fun)
52
47
  {
53
- global::create_fun = fun;
48
+ timer_create_fun = fun;
54
49
  }
55
50
 
56
51
  static Timer*
57
52
  Timer_create ()
58
53
  {
59
- return global::create_fun
60
- ? global::create_fun()
61
- : new Timer();
54
+ return timer_create_fun ? timer_create_fun() : new Timer();
62
55
  }
63
56
 
64
57
 
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
@@ -42,6 +42,8 @@ namespace Reflex
42
42
 
43
43
  void View_call_wheel_event (View* view, WheelEvent* event);
44
44
 
45
+ void View_call_note_event (View* view, NoteEvent* event);
46
+
45
47
  void View_call_contact_event (View* view, ContactEvent* event);
46
48
 
47
49
 
data/src/win32/event.cpp CHANGED
@@ -12,7 +12,7 @@ namespace Reflex
12
12
 
13
13
 
14
14
  uint
15
- get_key_modifiers ()
15
+ KeyEvent_get_modifiers ()
16
16
  {
17
17
  return
18
18
  (GetKeyState(VK_SHIFT) & 0x8000 ? MOD_SHIFT : 0) |
@@ -37,7 +37,7 @@ namespace Reflex
37
37
  }
38
38
 
39
39
  NativeKeyEvent::NativeKeyEvent (UINT msg, WPARAM wp, LPARAM lp, const char* chars)
40
- : KeyEvent(get_key_action(msg), chars, (int) wp, get_key_modifiers(), lp & 0xFF)
40
+ : KeyEvent(get_key_action(msg), chars, (int) wp, KeyEvent_get_modifiers(), lp & 0xFF)
41
41
  {
42
42
  }
43
43
 
@@ -135,7 +135,7 @@ namespace Reflex
135
135
  get_mouse_type(msg, wp),
136
136
  get_mouse_action(msg),
137
137
  Point(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)),
138
- get_key_modifiers(),
138
+ KeyEvent_get_modifiers(),
139
139
  get_mouse_click_count(msg),
140
140
  is_mouse_dragging(msg, wp),
141
141
  Xot::time()));
@@ -196,7 +196,7 @@ namespace Reflex
196
196
  get_touch_type(touch),
197
197
  action,
198
198
  get_touch_position(hwnd, touch),
199
- get_key_modifiers(),
199
+ KeyEvent_get_modifiers(),
200
200
  action == Pointer::DOWN ? 1 : 0,
201
201
  action == Pointer::MOVE,
202
202
  get_touch_time(touch));
@@ -212,7 +212,7 @@ namespace Reflex
212
212
  : WheelEvent(
213
213
  GET_X_LPARAM(lp), GET_Y_LPARAM(lp), 0,
214
214
  GET_WHEEL_DELTA_WPARAM(wp_x), -GET_WHEEL_DELTA_WPARAM(wp_y), 0,
215
- get_key_modifiers())
215
+ KeyEvent_get_modifiers())
216
216
  {
217
217
  }
218
218
 
data/src/win32/event.h CHANGED
@@ -44,8 +44,6 @@ namespace Reflex
44
44
  };// NativeWheelEvent
45
45
 
46
46
 
47
- uint get_key_modifiers ();
48
-
49
47
  void Gamepad_poll ();
50
48
 
51
49
 
@@ -18,7 +18,7 @@ namespace Reflex
18
18
  call_gamepad_event (Window* win, int code, bool pressed)
19
19
  {
20
20
  auto action = pressed ? KeyEvent::DOWN : KeyEvent::UP;
21
- KeyEvent e(action, NULL, code, get_key_modifiers(), 0);
21
+ KeyEvent e(action, NULL, code, KeyEvent_get_modifiers(), 0);
22
22
  Window_call_key_event(win, &e);
23
23
  }
24
24
 
data/src/window.cpp CHANGED
@@ -103,25 +103,18 @@ namespace Reflex
103
103
  }
104
104
  }
105
105
 
106
- namespace global
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
- global::create_root_view_fun = fun;
111
+ create_root_view_fun = fun;
117
112
  }
118
113
 
119
114
  static View*
120
115
  create_root_view ()
121
116
  {
122
- return global::create_root_view_fun
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
@@ -139,6 +139,8 @@ namespace Reflex
139
139
 
140
140
  void Window_call_wheel_event (Window* window, WheelEvent* event);
141
141
 
142
+ void Window_call_note_event (Window* window, NoteEvent* event);
143
+
142
144
 
143
145
  typedef View* (*Window_CreateRootViewFun) ();
144
146
 
@@ -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, c.begin?(:key)
32
- assert_equal true, c.begin?(:pointer)
33
- assert_equal true, c.begin?(:all)
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, c.begin?(:key)
38
- assert_equal false, c.begin?(:pointer)
39
- assert_equal false, c.begin?(:all)
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, c.end?(:key)
46
- assert_equal true, c.end?(:pointer)
47
- assert_equal true, c.end?(:all)
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, c.end?(:key)
52
- assert_equal false, c.end?(:pointer)
53
- assert_equal false, c.end?(:all)
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
@@ -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
data/test/test_view.rb CHANGED
@@ -378,21 +378,22 @@ class TestView < Test::Unit::TestCase
378
378
  w.add v
379
379
  assert_equal [], v.capture
380
380
 
381
- v.capture = :key; assert_equal [:key], v.capture
382
- v.capture = :pointer; assert_equal [:pointer], v.capture
383
- v.capture = :all; assert_equal [:key, :pointer], v.capture
381
+ v.capture = :key; assert_equal [:key], v.capture
382
+ v.capture = :pointer; assert_equal [:pointer], v.capture
383
+ v.capture = :note; assert_equal [:note], v.capture
384
+ v.capture = :all; assert_equal [:key, :pointer, :note], v.capture
384
385
 
385
- v.capture -= [:key]; assert_equal [:pointer], v.capture
386
- v.capture += [:key]; assert_equal [:key, :pointer], v.capture
386
+ v.capture -= [:key]; assert_equal [:pointer, :note], v.capture
387
+ v.capture += [:key]; assert_equal [:key, :pointer, :note], v.capture
387
388
 
388
- v.capture = []; assert_equal [], v.capture
389
- v.capture += [:key, :pointer]; assert_equal [:key, :pointer], v.capture
390
- v.capture = []; assert_equal [], v.capture
391
- v.capture += [:all]; assert_equal [:key, :pointer], v.capture
389
+ v.capture = []; assert_equal [], v.capture
390
+ v.capture += [:key, :pointer, :note]; assert_equal [:key, :pointer, :note], v.capture
391
+ v.capture = []; assert_equal [], v.capture
392
+ v.capture += [:all]; assert_equal [:key, :pointer, :note], v.capture
392
393
 
393
- v.capture -= []; assert_equal [:key, :pointer], v.capture
394
- v.capture = []; assert_equal [], v.capture
395
- v.capture += []; assert_equal [], v.capture
394
+ v.capture -= []; assert_equal [:key, :pointer, :note], v.capture
395
+ v.capture = []; assert_equal [], v.capture
396
+ v.capture += []; assert_equal [], v.capture
396
397
  end
397
398
 
398
399
  def test_capturing()
@@ -403,24 +404,35 @@ class TestView < Test::Unit::TestCase
403
404
  assert_false v.capturing?
404
405
  assert_false v.capturing? :key
405
406
  assert_false v.capturing? :pointer
407
+ assert_false v.capturing? :note
406
408
  assert_false v.capturing? :all
407
409
 
408
410
  v.capture = :key
409
411
  assert_true v.capturing?
410
412
  assert_true v.capturing? :key
411
413
  assert_false v.capturing? :pointer
414
+ assert_false v.capturing? :note
412
415
  assert_false v.capturing? :all
413
416
 
414
417
  v.capture = :pointer
415
418
  assert_true v.capturing?
416
419
  assert_false v.capturing? :key
417
420
  assert_true v.capturing? :pointer
421
+ assert_false v.capturing? :note
422
+ assert_false v.capturing? :all
423
+
424
+ v.capture = :note
425
+ assert_true v.capturing?
426
+ assert_false v.capturing? :key
427
+ assert_false v.capturing? :pointer
428
+ assert_true v.capturing? :note
418
429
  assert_false v.capturing? :all
419
430
 
420
431
  v.capture = :all
421
432
  assert_true v.capturing?
422
433
  assert_true v.capturing? :key
423
434
  assert_true v.capturing? :pointer
435
+ assert_true v.capturing? :note
424
436
  assert_true v.capturing? :all
425
437
  end
426
438