reflexion 0.4.2 → 0.5.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 385852765cb2073b46cffebf4c22bcd1e432f4d17b911f7cde7d67864add658b
4
- data.tar.gz: 8645ad9b05be24a1f69c241757b4dda8004a36411704932729872d6a0410ee79
3
+ metadata.gz: 347a1a598730b4db06360251a75936112311616a9113945e235c088a729a04f6
4
+ data.tar.gz: a65ae5255b06a205c712c6c96b13fad2715fc5161518f3be3b8c59ab44a77c2f
5
5
  SHA512:
6
- metadata.gz: 1577fd876c000d34cb1435732f83292fcb27a940493926f1d8209f77cac8bc58da08e9782e629894a683b7e0624dba9c1786a1c4526732c051d17d3d3d40c628
7
- data.tar.gz: 121844b893ea518437ab0eb2cd255af14c9c804af32281624ecde6629358b633339294530944b209dac3cfe4fcf1b242363a208df747a5b181f9c269aa60340b
6
+ metadata.gz: 52d1461840d8ce455c3ca42e52816dc8ca54e3a2182f8007ae2a3c8e1ae87c85934c91c86511ddc9d8209458f39bd2ebe3748e4f49f0d8c9a85126ab10ae0623
7
+ data.tar.gz: cc9c1299b07f204b0f1d3602f694ceb36f657815576a85ba08371576af0ae865afbb6929ad055e73f1652b698f90bd3fc29c38572bc2f324a85451a253461b01
@@ -145,6 +145,8 @@ Init_reflex_application ()
145
145
  rb_define_method(cApplication, "on_preference", RUBY_METHOD_FUNC(on_preference), 1);
146
146
  rb_define_method(cApplication, "on_about", RUBY_METHOD_FUNC(on_about), 1);
147
147
  rb_define_singleton_method(cApplication, "instance", RUBY_METHOD_FUNC(instance), 0);
148
+
149
+ define_wrapper_equality_methods<Reflex::Application>(cApplication);
148
150
  }
149
151
 
150
152
 
@@ -39,12 +39,13 @@ void
39
39
  Init_reflex_device ()
40
40
  {
41
41
  Module mReflex = rb_define_module("Reflex");
42
+ rb_define_singleton_method(mReflex, "vibrate", RUBY_METHOD_FUNC(s_vibrate), 0);
42
43
 
43
44
  cDevice = mReflex.define_class("Device", Reflex::device_class());
44
45
  rb_define_alloc_func(cDevice, alloc);
45
46
  rb_define_method(cDevice, "name", RUBY_METHOD_FUNC(name), 0);
46
47
 
47
- rb_define_singleton_method(mReflex, "vibrate", RUBY_METHOD_FUNC(s_vibrate), 0);
48
+ define_wrapper_equality_methods<Reflex::Device>(cDevice);
48
49
  }
49
50
 
50
51
 
@@ -99,6 +99,8 @@ Init_reflex_ellipse_shape ()
99
99
  rb_define_method(cEllipseShape, "hole_size", RUBY_METHOD_FUNC(get_hole_size), 0);
100
100
  rb_define_method(cEllipseShape, "nsegment=", RUBY_METHOD_FUNC(set_nsegment), 1);
101
101
  rb_define_method(cEllipseShape, "nsegment", RUBY_METHOD_FUNC(get_nsegment), 0);
102
+
103
+ define_wrapper_equality_methods<Reflex::EllipseShape>(cEllipseShape);
102
104
  }
103
105
 
104
106
 
@@ -64,6 +64,8 @@ Init_reflex_filter ()
64
64
  rb_define_method(cFilter, "apply", RUBY_METHOD_FUNC(apply), 2);
65
65
  rb_define_method(cFilter, "shader=", RUBY_METHOD_FUNC(set_shader), 1);
66
66
  rb_define_method(cFilter, "shader", RUBY_METHOD_FUNC(get_shader), 0);
67
+
68
+ define_wrapper_equality_methods<Reflex::Filter>(cFilter);
67
69
  }
68
70
 
69
71
 
@@ -49,6 +49,8 @@ Init_reflex_image_view ()
49
49
  rb_define_alloc_func(cImageView, alloc);
50
50
  rb_define_private_method(cImageView, "set_image", RUBY_METHOD_FUNC(set_image), 1);
51
51
  rb_define_method(cImageView, "image", RUBY_METHOD_FUNC(get_image), 0);
52
+
53
+ define_wrapper_equality_methods<Reflex::ImageView>(cImageView);
52
54
  }
53
55
 
54
56
 
@@ -82,6 +82,8 @@ Init_reflex_line_shape ()
82
82
  rb_define_method(cLineShape, "add_points", RUBY_METHOD_FUNC(add_points), -1);
83
83
  rb_define_method(cLineShape, "loop=", RUBY_METHOD_FUNC(set_loop), 1);
84
84
  rb_define_method(cLineShape, "loop", RUBY_METHOD_FUNC(get_loop), 0);
85
+
86
+ define_wrapper_equality_methods<Reflex::LineShape>(cLineShape);
85
87
  }
86
88
 
87
89
 
@@ -79,8 +79,9 @@ Init_reflex_midi ()
79
79
  rb_define_method(cMIDI, "on_note_on", RUBY_METHOD_FUNC(on_note_on), 1);
80
80
  rb_define_method(cMIDI, "on_note_off", RUBY_METHOD_FUNC(on_note_off), 1);
81
81
  rb_define_method(cMIDI, "on_control_change", RUBY_METHOD_FUNC(on_control_change), 1);
82
-
83
82
  rb_define_singleton_method(cMIDI, "all", RUBY_METHOD_FUNC(s_get_all), 0);
83
+
84
+ define_wrapper_equality_methods<Reflex::MIDI>(cMIDI);
84
85
  }
85
86
 
86
87
 
@@ -48,6 +48,8 @@ Init_reflex_polygon_shape ()
48
48
  rb_define_alloc_func(cPolygonShape, alloc);
49
49
  rb_define_method(cPolygonShape, "polygon=", RUBY_METHOD_FUNC(set_polygon), 1);
50
50
  rb_define_method(cPolygonShape, "polygon", RUBY_METHOD_FUNC(get_polygon), 0);
51
+
52
+ define_wrapper_equality_methods<Reflex::PolygonShape>(cPolygonShape);
51
53
  }
52
54
 
53
55
 
@@ -145,6 +145,8 @@ Init_reflex_rect_shape ()
145
145
  rb_define_method(cRectShape, "round_right_bottom", RUBY_METHOD_FUNC(get_round_right_bottom), 0);
146
146
  rb_define_method(cRectShape, "nsegment=", RUBY_METHOD_FUNC(set_nsegment), 1);
147
147
  rb_define_method(cRectShape, "nsegment", RUBY_METHOD_FUNC(get_nsegment), 0);
148
+
149
+ define_wrapper_equality_methods<Reflex::RectShape>(cRectShape);
148
150
  }
149
151
 
150
152
 
@@ -167,6 +167,7 @@ Init_reflex_shape ()
167
167
  cShape.define_private_method("call_contact_begin!", on_contact_begin);
168
168
  cShape.define_private_method("call_contact_end!", on_contact_end);
169
169
 
170
+ define_wrapper_equality_methods<Reflex::Shape>(cShape);
170
171
  define_selector_methods<Reflex::Shape>(cShape);
171
172
  }
172
173
 
@@ -91,6 +91,7 @@ Init_reflex_timer ()
91
91
  rb_define_method(cTimer, "count", RUBY_METHOD_FUNC(get_count), 0);
92
92
  cTimer.define_method("finished?", is_finished);
93
93
 
94
+ define_wrapper_equality_methods<Reflex::Timer>(cTimer);
94
95
  define_selector_methods<Reflex::Timer>(cTimer);
95
96
  }
96
97
 
@@ -1267,6 +1267,7 @@ Init_reflex_view ()
1267
1267
  cView.define_const("CAPTURE_MIDI", Reflex::View::CAPTURE_MIDI);
1268
1268
  cView.define_const("CAPTURE_ALL", Reflex::View::CAPTURE_ALL);
1269
1269
 
1270
+ define_wrapper_equality_methods<Reflex::View>(cView);
1270
1271
  define_selector_methods<Reflex::View>(cView);
1271
1272
  }
1272
1273
 
@@ -465,6 +465,8 @@ Init_reflex_window ()
465
465
 
466
466
  cWindow.define_const("ORIENTATION_PORTRAIT", Reflex::Window::FLAG_PORTRAIT);
467
467
  cWindow.define_const("ORIENTATION_LANDSCAPE", Reflex::Window::FLAG_LANDSCAPE);
468
+
469
+ define_wrapper_equality_methods<Reflex::Window>(cWindow);
468
470
  }
469
471
 
470
472
 
data/CLAUDE.md CHANGED
@@ -8,7 +8,7 @@ The published gem name is **`reflexion`** (not `reflex`).
8
8
 
9
9
  ## External Libraries
10
10
 
11
- - Box2D v2.4.1 — Physics engine
11
+ - Box2D v3.1.1 — Physics engine (single-threaded by default)
12
12
  - RtMidi 6.0.0 — MIDI device support
13
13
 
14
14
  ## Platform-Specific Code
data/ChangeLog.md CHANGED
@@ -1,6 +1,22 @@
1
1
  # reflex ChangeLog
2
2
 
3
3
 
4
+ ## [v0.5.1] - 2026-06-23
5
+
6
+ - Replace monorepo-based pod.rake with per-repo clone approach
7
+
8
+
9
+ ## [v0.5.0] - 2026-06-23
10
+
11
+ - Upgrade Box2D from 2.4.1 to 3.1.1
12
+ - Add Reflex.podspec and pod.rake for CocoaPods distribution
13
+ - Define ==/eql?/hash on RefCountable wrapper classes
14
+ - Build the menu in applicationWillFinishLaunching
15
+
16
+ - Fix Timer owner use-after-free with WeakRef
17
+ - Fix rect fixture bottom edge and wall shape setup
18
+
19
+
4
20
  ## [v0.4.2] - 2026-06-12
5
21
 
6
22
  - Share single offscreen GL context across windows
data/Rakefile CHANGED
@@ -19,9 +19,10 @@ TESTS_ALONE = ['test/test_reflex_init.rb']
19
19
  install_packages apt: %w[libsdl2-dev]
20
20
 
21
21
  use_external_library 'https://github.com/erincatto/box2d',
22
- tag: 'v2.4.1',
22
+ tag: 'v3.1.1',
23
23
  incdirs: %w[include src],
24
- srcdirs: 'src'
24
+ srcdirs: 'src',
25
+ defs: ['B2_MAX_WORLDS=256', *('BOX2D_DISABLE_SIMD' if wasm?)]
25
26
 
26
27
  use_external_library 'https://github.com/thestk/rtmidi',
27
28
  tag: '6.0.0',
data/Reflex.podspec ADDED
@@ -0,0 +1,108 @@
1
+ # -*- mode: ruby -*-
2
+
3
+
4
+ Pod::Spec.new do |s|
5
+ s.name = "Reflex"
6
+ s.version = File.read(File.expand_path 'VERSION', __dir__)[/[\d\.]+/]
7
+ s.summary = "A Graphical User Interface Tool Kit"
8
+ s.description = "A Graphical User Interface Tool Kit"
9
+ s.license = "MIT"
10
+ s.source = {:git => "https://github.com/xord/reflex.git"}
11
+ s.author = {"xordog" => "xordog@gmail.com"}
12
+ s.homepage = "https://github.com/xord/reflex"
13
+
14
+ s.osx.deployment_target = "10.10"
15
+ s.ios.deployment_target = "12.0"
16
+
17
+ root = "${PODS_ROOT}/#{s.name}"
18
+ exts = File.read(File.expand_path 'Rakefile', __dir__)
19
+ .lines(chomp: true)
20
+ .map {_1[%r|require\s*['"](\w+)/extension['"]|, 1]}
21
+ .compact - [s.name.downcase]
22
+
23
+ incdirs = exts.map {"#{root}/#{_1}/include"}.concat %W[
24
+ #{root}/include
25
+ #{root}/rays/vendor/glm
26
+ #{root}/rays/vendor/clipper/cpp
27
+ #{root}/rays/vendor/earcut.hpp/include/mapbox
28
+ #{root}/rays/vendor/splines-lib
29
+ #{root}/vendor/box2d/include
30
+ #{root}/vendor/box2d/src
31
+ #{root}/vendor/rtmidi/rtmidi
32
+ ${PODS_ROOT}/CRuby/CRuby/include
33
+ ]
34
+
35
+ s.prepare_command = 'rake -f pod.rake setup'
36
+ s.preserve_paths = exts + %w[src]
37
+ s.requires_arc = false
38
+ s.osx.compiler_flags = "-DOSX"
39
+ s.ios.compiler_flags = "-DIOS"
40
+ s.library = %w[c++]
41
+ s.xcconfig = {
42
+ "CLANG_CXX_LANGUAGE_STANDARD" => 'c++20',
43
+ "GCC_PREPROCESSOR_DEFINITIONS" => '$(inherited) B2_MAX_WORLDS=256',
44
+ "HEADER_SEARCH_PATHS" => incdirs.join(' ')
45
+ }
46
+
47
+ #s.dependency = 'CRuby', git: 'https://github.com/xord/cruby'
48
+
49
+ s.resource_bundles =
50
+ exts.each_with_object({'Reflex' => %w[lib VERSION]}) do |ext, hash|
51
+ hash[ext.capitalize] = %W[#{ext}/lib #{ext}/VERSION]
52
+ end
53
+
54
+ s.subspec "Xot" do |spec|
55
+ spec.source_files = "xot/src/*.cpp"
56
+ end
57
+
58
+ s.subspec "Rucy" do |spec|
59
+ spec.source_files = "rucy/src/*.cpp"
60
+
61
+ spec.subspec "Ext" do |ext|
62
+ ext.source_files = "rucy/ext/rucy/*.cpp"
63
+ end
64
+ end
65
+
66
+ s.subspec "Rays" do |spec|
67
+ spec .source_files = "rays/src/*.cpp", "rays/src/opengl/*.cpp"
68
+ spec.osx.source_files = "rays/src/**/osx/*.{cpp,mm}"
69
+ spec.ios.source_files = "rays/src/**/ios/*.{cpp,mm}"
70
+ spec.osx.frameworks = %w[AppKit OpenGL CoreImage CoreVideo CoreMedia AVFoundation]
71
+ spec.ios.frameworks = %w[GLKit MobileCoreServices AVFoundation]# ImageIO
72
+
73
+ spec.subspec "Clipper" do |sub|
74
+ sub.source_files = "rays/vendor/clipper/cpp/*.cpp"
75
+ end
76
+
77
+ spec.subspec "SplineLib" do |sub|
78
+ sub.source_files = "rays/vendor/splines-lib/Splines.cpp"
79
+ end
80
+
81
+ spec.subspec "Ext" do |ext|
82
+ ext.source_files = "rays/ext/rays/*.cpp"
83
+ end
84
+ end
85
+
86
+ s.subspec "Reflex" do |spec|
87
+ spec .source_files = "src/*.cpp"
88
+ spec.osx.source_files = "src/osx/*.{cpp,mm}"
89
+ spec.ios.source_files = "src/ios/*.{cpp,mm}"
90
+ spec.osx.frameworks = %w[Cocoa IOKit GameController]
91
+ spec.ios.frameworks = %w[CoreMotion GameController]
92
+
93
+ spec.subspec "Box2D" do |sub|
94
+ sub.source_files = "vendor/box2d/src/**/*.c"
95
+ end
96
+
97
+ spec.subspec "RtMidi" do |sub|
98
+ sub.source_files = "vendor/rtmidi/rtmidi/**/*.cpp"
99
+ sub.compiler_flags = '-D__MACOSX_CORE__'
100
+ sub.osx.frameworks = %w[CoreAudio CoreMIDI]
101
+ sub.ios.frameworks = %w[CoreMIDI]
102
+ end
103
+
104
+ spec.subspec "Ext" do |ext|
105
+ ext.source_files = "ext/reflex/*.cpp"
106
+ end
107
+ end
108
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.5.1
@@ -159,6 +159,8 @@ Init_reflex_application ()
159
159
  cApplication.define_method("on_preference", on_preference);
160
160
  cApplication.define_method("on_about", on_about);
161
161
  cApplication.define_singleton_method("instance", instance);
162
+
163
+ define_wrapper_equality_methods<Reflex::Application>(cApplication);
162
164
  }
163
165
 
164
166
 
@@ -42,12 +42,13 @@ void
42
42
  Init_reflex_device ()
43
43
  {
44
44
  Module mReflex = define_module("Reflex");
45
+ mReflex.define_singleton_method("vibrate", s_vibrate);
45
46
 
46
47
  cDevice = mReflex.define_class("Device", Reflex::device_class());
47
48
  cDevice.define_alloc_func(alloc);
48
49
  cDevice.define_method("name", name);
49
50
 
50
- mReflex.define_singleton_method("vibrate", s_vibrate);
51
+ define_wrapper_equality_methods<Reflex::Device>(cDevice);
51
52
  }
52
53
 
53
54
 
@@ -108,6 +108,8 @@ Init_reflex_ellipse_shape ()
108
108
  cEllipseShape.define_method("hole_size", get_hole_size);
109
109
  cEllipseShape.define_method("nsegment=", set_nsegment);
110
110
  cEllipseShape.define_method("nsegment", get_nsegment);
111
+
112
+ define_wrapper_equality_methods<Reflex::EllipseShape>(cEllipseShape);
111
113
  }
112
114
 
113
115
 
@@ -69,6 +69,8 @@ Init_reflex_filter ()
69
69
  cFilter.define_method("apply", apply);
70
70
  cFilter.define_method("shader=", set_shader);
71
71
  cFilter.define_method("shader", get_shader);
72
+
73
+ define_wrapper_equality_methods<Reflex::Filter>(cFilter);
72
74
  }
73
75
 
74
76
 
@@ -52,6 +52,8 @@ Init_reflex_image_view ()
52
52
  cImageView.define_alloc_func(alloc);
53
53
  cImageView.define_private_method("set_image", set_image);
54
54
  cImageView.define_method( "image", get_image);
55
+
56
+ define_wrapper_equality_methods<Reflex::ImageView>(cImageView);
55
57
  }
56
58
 
57
59
 
@@ -87,6 +87,8 @@ Init_reflex_line_shape ()
87
87
  cLineShape.define_method("add_points", add_points);
88
88
  cLineShape.define_method("loop=", set_loop);
89
89
  cLineShape.define_method("loop", get_loop);
90
+
91
+ define_wrapper_equality_methods<Reflex::LineShape>(cLineShape);
90
92
  }
91
93
 
92
94
 
data/ext/reflex/midi.cpp CHANGED
@@ -86,8 +86,9 @@ Init_reflex_midi ()
86
86
  cMIDI.define_method("on_note_on", on_note_on);
87
87
  cMIDI.define_method("on_note_off", on_note_off);
88
88
  cMIDI.define_method("on_control_change", on_control_change);
89
-
90
89
  cMIDI.define_singleton_method("all", s_get_all);
90
+
91
+ define_wrapper_equality_methods<Reflex::MIDI>(cMIDI);
91
92
  }
92
93
 
93
94
 
@@ -51,6 +51,8 @@ Init_reflex_polygon_shape ()
51
51
  cPolygonShape.define_alloc_func(alloc);
52
52
  cPolygonShape.define_method("polygon=", set_polygon);
53
53
  cPolygonShape.define_method("polygon", get_polygon);
54
+
55
+ define_wrapper_equality_methods<Reflex::PolygonShape>(cPolygonShape);
54
56
  }
55
57
 
56
58
 
@@ -158,6 +158,8 @@ Init_reflex_rect_shape ()
158
158
  cRectShape.define_method("round_right_bottom", get_round_right_bottom);
159
159
  cRectShape.define_method("nsegment=", set_nsegment);
160
160
  cRectShape.define_method("nsegment", get_nsegment);
161
+
162
+ define_wrapper_equality_methods<Reflex::RectShape>(cRectShape);
161
163
  }
162
164
 
163
165
 
data/ext/reflex/shape.cpp CHANGED
@@ -184,6 +184,7 @@ Init_reflex_shape ()
184
184
  cShape.define_private_method("call_contact_begin!", on_contact_begin);
185
185
  cShape.define_private_method("call_contact_end!", on_contact_end);
186
186
 
187
+ define_wrapper_equality_methods<Reflex::Shape>(cShape);
187
188
  define_selector_methods<Reflex::Shape>(cShape);
188
189
  }
189
190
 
data/ext/reflex/timer.cpp CHANGED
@@ -99,6 +99,7 @@ Init_reflex_timer ()
99
99
  cTimer.define_method("count", get_count);
100
100
  cTimer.define_method("finished?", is_finished);
101
101
 
102
+ define_wrapper_equality_methods<Reflex::Timer>(cTimer);
102
103
  define_selector_methods<Reflex::Timer>(cTimer);
103
104
  }
104
105
 
data/ext/reflex/view.cpp CHANGED
@@ -1393,6 +1393,7 @@ Init_reflex_view ()
1393
1393
  cView.define_const("CAPTURE_MIDI", Reflex::View::CAPTURE_MIDI);
1394
1394
  cView.define_const("CAPTURE_ALL", Reflex::View::CAPTURE_ALL);
1395
1395
 
1396
+ define_wrapper_equality_methods<Reflex::View>(cView);
1396
1397
  define_selector_methods<Reflex::View>(cView);
1397
1398
  }
1398
1399
 
@@ -514,6 +514,8 @@ Init_reflex_window ()
514
514
 
515
515
  cWindow.define_const("ORIENTATION_PORTRAIT", Reflex::Window::FLAG_PORTRAIT);
516
516
  cWindow.define_const("ORIENTATION_LANDSCAPE", Reflex::Window::FLAG_LANDSCAPE);
517
+
518
+ define_wrapper_equality_methods<Reflex::Window>(cWindow);
517
519
  }
518
520
 
519
521
 
data/pod.rake ADDED
@@ -0,0 +1,35 @@
1
+ # -*- mode: ruby -*-
2
+
3
+
4
+ github = 'https://github.com/xord'
5
+ renames = {reflexion: 'reflex'}
6
+ regexp = /add\w+dependency.*['"](\w+)['"].*['"]\s*~>\s*([\d\.]+)\s*['"]/
7
+ repos = File.readlines('reflex.gemspec', chomp: true)
8
+ .map {|s| regexp.match(s)&.values_at 1, 2}
9
+ .compact
10
+ .to_h
11
+ .transform_keys {|name| renames[name.to_sym].then {|s| s || name}}
12
+
13
+
14
+ task :clobber do
15
+ sh %( rm -rf #{repos.keys.join ' '} )
16
+ end
17
+
18
+ task :setup
19
+
20
+ repos.each do |repo, ver|
21
+ rakefile = "#{repo}/Rakefile"
22
+ opts = [
23
+ '-c advice.detachedHead=false',
24
+ '--no-single-branch',
25
+ '--depth 1',
26
+ "--branch #{ENV["#{repo.upcase}_BRANCH"] || ('v' + ver)}"
27
+ ]
28
+
29
+ task :setup => rakefile
30
+
31
+ file rakefile do
32
+ sh %( git clone #{opts.join ' '} #{github}/#{repo} )
33
+ sh %( cd #{repo} && VENDOR_NOCOMPILE=1 rake vendor erb )
34
+ end
35
+ end
data/reflex.gemspec CHANGED
@@ -25,9 +25,9 @@ Gem::Specification.new do |s|
25
25
  s.platform = Gem::Platform::RUBY
26
26
  s.required_ruby_version = '>= 3.0.0'
27
27
 
28
- s.add_dependency 'xot', '~> 0.3.14'
29
- s.add_dependency 'rucy', '~> 0.3.14'
30
- s.add_dependency 'rays', '~> 0.3.15'
28
+ s.add_dependency 'xot', '~> 0.3.15'
29
+ s.add_dependency 'rucy', '~> 0.3.15'
30
+ s.add_dependency 'rays', '~> 0.3.16'
31
31
 
32
32
  s.files = `git ls-files`.split $/
33
33
  s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}