reflexion 0.3.14 → 0.3.15
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/key_event.cpp +10 -4
- data/.doc/ext/reflex/view.cpp +1 -2
- data/.github/workflows/release-gem.yml +3 -0
- data/.github/workflows/utils.rb +88 -17
- data/ChangeLog.md +12 -0
- data/VERSION +1 -1
- data/ext/reflex/extconf.rb +1 -6
- data/ext/reflex/key_event.cpp +10 -4
- data/ext/reflex/view.cpp +1 -2
- data/include/reflex/defs.h +316 -196
- data/include/reflex/ruby.h +2 -2
- data/include/reflex.h +2 -2
- data/lib/reflex/extension.rb +8 -2
- data/reflex.gemspec +4 -5
- data/src/application.cpp +12 -0
- data/src/application.h +2 -0
- data/src/midi.cpp +4 -0
- data/src/osx/device.mm +3 -0
- data/src/sdl/application.cpp +40 -16
- data/src/sdl/event.cpp +176 -0
- data/src/sdl/event.h +58 -0
- data/src/sdl/window.cpp +103 -22
- data/src/shape.cpp +1 -7
- data/src/style.cpp +1 -1
- data/src/timer.cpp +3 -0
- data/src/win32/event.cpp +0 -1
- metadata +10 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8766cf5812e53e4f488c3001691e2635435d0e40a92b336df21a86341d7e810c
|
|
4
|
+
data.tar.gz: 294139e6497bf2418f1e8f7b0a216b614825d5403ea0badb758e8ac522ca278d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 872e3a7813e25cc17f481c57baf736204bae91a4f43e03b5f3b5b0273bd5892b8cd018c6cbba2c041d721afdea6103383ea8d54752bf3e01f208107591e72956
|
|
7
|
+
data.tar.gz: baa908a9c4f4286abc4cf3aa0888ba280e15434348848a21c333f5462a8d4548a4cc3d4fa99b95a89fde45e8b865959307050a6a7cdc2ebb8396aee5cf99e3a5
|
|
@@ -119,11 +119,11 @@ VALUE get_key(VALUE self)
|
|
|
119
119
|
CASE(LBRACKET): SYMBOL1(lbracket);
|
|
120
120
|
CASE(RBRACKET): SYMBOL1(rbracket);
|
|
121
121
|
|
|
122
|
-
#if defined(OSX) || defined(IOS) || defined(WIN32) || defined(LINUX)
|
|
122
|
+
#if defined(OSX) || defined(IOS) || defined(WIN32) || defined(LINUX) || defined(WASM)
|
|
123
123
|
CASE(ENTER): SYMBOL1(enter);
|
|
124
124
|
#else
|
|
125
125
|
CASE(ENTER): SYMBOL1(enter);
|
|
126
|
-
CASE(RETURN):
|
|
126
|
+
CASE(RETURN): SYMBOL2(_return, "return");
|
|
127
127
|
#endif
|
|
128
128
|
CASE(SPACE): SYMBOL1(space);
|
|
129
129
|
CASE(TAB): SYMBOL1(tab);
|
|
@@ -141,25 +141,29 @@ VALUE get_key(VALUE self)
|
|
|
141
141
|
CASE(PAGEUP): SYMBOL1(pageup);
|
|
142
142
|
CASE(PAGEDOWN): SYMBOL1(pagedown);
|
|
143
143
|
|
|
144
|
-
#if !defined(OSX) && !defined(IOS) && !defined(LINUX)
|
|
144
|
+
#if !defined(OSX) && !defined(IOS) && !defined(LINUX) && !defined(WASM)
|
|
145
145
|
CASE(SHIFT):
|
|
146
146
|
#endif
|
|
147
147
|
CASE(LSHIFT):
|
|
148
148
|
CASE(RSHIFT): SYMBOL1(shift);
|
|
149
|
-
#if !defined(OSX) && !defined(IOS) && !defined(LINUX)
|
|
149
|
+
#if !defined(OSX) && !defined(IOS) && !defined(LINUX) && !defined(WASM)
|
|
150
150
|
CASE(CONTROL):
|
|
151
151
|
#endif
|
|
152
152
|
CASE(LCONTROL):
|
|
153
153
|
CASE(RCONTROL): SYMBOL1(control);
|
|
154
154
|
CASE(ALT):
|
|
155
|
+
#if !defined(LINUX)
|
|
155
156
|
CASE(LALT):
|
|
157
|
+
#endif
|
|
156
158
|
CASE(RALT): SYMBOL1(alt);
|
|
157
159
|
CASE(LWIN):
|
|
158
160
|
CASE(RWIN): SYMBOL1(win);
|
|
161
|
+
#if !defined(LINUX)
|
|
159
162
|
CASE(LCOMMAND):
|
|
160
163
|
CASE(RCOMMAND): SYMBOL1(command);
|
|
161
164
|
CASE(LOPTION):
|
|
162
165
|
CASE(ROPTION): SYMBOL1(option);
|
|
166
|
+
#endif
|
|
163
167
|
CASE(FUNCTION): SYMBOL1(function);
|
|
164
168
|
|
|
165
169
|
CASE(F1): SYMBOL1(f1);
|
|
@@ -194,7 +198,9 @@ VALUE get_key(VALUE self)
|
|
|
194
198
|
CASE(NUM_EQUAL): SYMBOL1(equal);
|
|
195
199
|
CASE(NUM_COMMA): SYMBOL1(comma);
|
|
196
200
|
CASE(NUM_DECIMAL): SYMBOL1(decimal);
|
|
201
|
+
#if !defined(LINUX)
|
|
197
202
|
CASE(NUM_CLEAR): SYMBOL1(clear);
|
|
203
|
+
#endif
|
|
198
204
|
CASE(NUM_ENTER): SYMBOL1(enter);
|
|
199
205
|
|
|
200
206
|
CASE(CAPSLOCK): SYMBOL1(capslock);
|
data/.doc/ext/reflex/view.cpp
CHANGED
|
@@ -197,8 +197,7 @@ VALUE each_child(VALUE self)
|
|
|
197
197
|
CHECK;
|
|
198
198
|
|
|
199
199
|
Value ret;
|
|
200
|
-
|
|
201
|
-
for (Reflex::View::child_iterator it = THIS->child_begin(); it != end; ++it)
|
|
200
|
+
for (auto it = THIS->child_begin(), end = THIS->child_end(); it != end; ++it)
|
|
202
201
|
ret = rb_yield(value(it->get()));
|
|
203
202
|
return ret;
|
|
204
203
|
}
|
data/.github/workflows/utils.rb
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
require 'shellwords'
|
|
2
|
+
|
|
3
|
+
ALL_REPO = 'xord/all'
|
|
4
|
+
ALL_DIR = '../all'
|
|
5
|
+
ALL_FETCH_DEPTH = 100
|
|
6
|
+
|
|
1
7
|
RENAMES = {reflex: 'reflexion'}
|
|
2
8
|
|
|
3
9
|
def sh(cmd)
|
|
@@ -5,7 +11,7 @@ def sh(cmd)
|
|
|
5
11
|
system cmd
|
|
6
12
|
end
|
|
7
13
|
|
|
8
|
-
def setup_dependencies(
|
|
14
|
+
def setup_dependencies(only: nil)
|
|
9
15
|
gemspec_path = `git ls-files`.lines(chomp: true).find {|l| l =~ /\.gemspec$/}
|
|
10
16
|
return unless gemspec_path
|
|
11
17
|
|
|
@@ -13,44 +19,109 @@ def setup_dependencies(build: true, only: nil)
|
|
|
13
19
|
name = File.basename gemspec_path, '.gemspec'
|
|
14
20
|
|
|
15
21
|
exts = File.readlines('Rakefile')
|
|
16
|
-
.map {|l| l[%r|^\s*require\W+(\w+)/extension\W+$|, 1]}
|
|
22
|
+
.map {|l| l[%r|^\s*require\W+([\w\-\_]+)/extension\W+$|, 1]}
|
|
17
23
|
.compact
|
|
18
24
|
.reject {|ext| ext == name}
|
|
19
25
|
exts = exts & [only].flatten.map(&:to_s) if only
|
|
26
|
+
return if exts.empty?
|
|
27
|
+
|
|
28
|
+
unless setup_dependencies_via_monorepo(exts)
|
|
29
|
+
setup_dependencies_via_each_repo_by_version(gemspec, exts)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
exts.each {|ext| sh %( cd ../#{ext} && rake ext )}
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def setup_dependencies_via_monorepo(exts)
|
|
36
|
+
return false unless checkout_monorepo
|
|
37
|
+
exts.each {|ext| sh %( ln -snf all/#{ext} ../#{ext} )}
|
|
38
|
+
true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def checkout_monorepo()
|
|
42
|
+
uuid = `git log -1 --format=%B`[/^\[\[([0-9a-fA-F-]+)\]\]$/, 1]
|
|
43
|
+
return false unless uuid
|
|
44
|
+
|
|
45
|
+
commit = setup_monorepo uuid
|
|
46
|
+
return false unless commit
|
|
47
|
+
|
|
48
|
+
Dir.chdir(ALL_DIR) {sh %( git checkout -q #{commit} )}
|
|
49
|
+
true
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def setup_monorepo(uuid)
|
|
53
|
+
unless File.directory? ALL_DIR
|
|
54
|
+
url = "https://github.com/#{ALL_REPO}.git"
|
|
55
|
+
sh %( git clone --no-tags --depth #{ALL_FETCH_DEPTH} #{url} #{ALL_DIR} )
|
|
56
|
+
end
|
|
57
|
+
loop do
|
|
58
|
+
commit = find_monorepo_commit uuid
|
|
59
|
+
return commit if commit
|
|
60
|
+
|
|
61
|
+
deepened = Dir.chdir ALL_DIR do
|
|
62
|
+
before = `git rev-list --count HEAD`.to_i
|
|
63
|
+
sh %( git fetch --deepen #{ALL_FETCH_DEPTH} )
|
|
64
|
+
`git rev-list --count HEAD`.to_i > before
|
|
65
|
+
end
|
|
66
|
+
return nil unless deepened
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def find_monorepo_commit(uuid)
|
|
71
|
+
Dir.chdir ALL_DIR do
|
|
72
|
+
out = `git log origin/HEAD -F --grep="[[#{uuid}]]" --format=%H -1`.strip
|
|
73
|
+
out.empty? ? nil : out
|
|
74
|
+
end
|
|
75
|
+
end
|
|
20
76
|
|
|
77
|
+
def setup_dependencies_via_each_repo_by_version(gemspec, exts)
|
|
21
78
|
exts.each do |ext|
|
|
22
79
|
gem = RENAMES[ext.to_sym].then {|s| s || ext}
|
|
23
|
-
ver = gemspec[/add_dependency.*['"]#{gem}['"].*['"]\s
|
|
80
|
+
ver = gemspec[/add_dependency.*['"]#{gem}['"].*['"]\s*~>\s*([\d\.]+)\s*['"]/, 1]
|
|
24
81
|
opts = '-c advice.detachedHead=false --depth 1'
|
|
25
82
|
clone = "git clone #{opts} https://github.com/xord/#{ext}.git ../#{ext}"
|
|
26
83
|
|
|
27
84
|
# 'rake subtree:push' pushes all subrepos, so cloning by new tag
|
|
28
85
|
# often fails before tagging each new tag
|
|
29
86
|
sh %( #{clone} --branch v#{ver} || #{clone} )
|
|
30
|
-
sh %( cd ../#{ext} && rake ext )
|
|
31
87
|
end
|
|
32
88
|
end
|
|
33
89
|
|
|
34
90
|
def tag_versions()
|
|
35
|
-
|
|
36
|
-
|
|
91
|
+
changes = changelogs
|
|
92
|
+
tags = `git tag`.lines chomp: true
|
|
93
|
+
vers = `git log --oneline ./VERSION`
|
|
37
94
|
.lines(chomp: true)
|
|
38
95
|
.map {|line| line.split.first[/^\w+$/]}
|
|
39
|
-
.map {|
|
|
40
|
-
.select {|ver,
|
|
96
|
+
.map {|sha| [`git cat-file -p #{sha}:./VERSION 2>/dev/null`[/[\d\.]+/], sha]}
|
|
97
|
+
.select {|ver, sha| ver && sha}
|
|
41
98
|
.reverse
|
|
42
99
|
.to_h
|
|
43
100
|
|
|
44
|
-
|
|
45
|
-
.split(/^\s*##\s*\[\s*v([\d\.]+)\s*\].*$/)
|
|
46
|
-
.slice(1..-1)
|
|
47
|
-
.each_slice(2)
|
|
48
|
-
.to_h
|
|
49
|
-
.transform_values(&:strip!)
|
|
50
|
-
|
|
51
|
-
vers.to_a.reverse.each do |ver, hash|
|
|
101
|
+
vers.to_a.reverse.each do |ver, sha|
|
|
52
102
|
tag = "v#{ver}"
|
|
53
103
|
break if tags.include?(tag)
|
|
54
|
-
sh %( git tag -a -m \"#{changes[
|
|
104
|
+
sh %( git tag -a -m \"#{changes[tag]&.gsub '"', '\\"'}\" #{tag} #{sha} )
|
|
55
105
|
end
|
|
56
106
|
end
|
|
107
|
+
|
|
108
|
+
def release(*paths)
|
|
109
|
+
tag = ENV['GITHUB_REF']&.sub(%r|^refs/tags/|, '') || raise('GITHUB_REF tag not set')
|
|
110
|
+
notes = (changelogs[tag] || '').shellescape
|
|
111
|
+
paths = paths.flatten.join ' '
|
|
112
|
+
|
|
113
|
+
sh(%( gh release create #{tag} #{paths} --notes #{notes} )) ||
|
|
114
|
+
sh(%( gh release upload #{tag} #{paths} --clobber )) ||
|
|
115
|
+
raise('failed to upload to releases')
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def changelogs()
|
|
119
|
+
File.read('ChangeLog.md')
|
|
120
|
+
.split(/^\s*##\s*\[\s*(v[\d\.]+)\s*\].*$/)
|
|
121
|
+
.slice(1..)
|
|
122
|
+
.each_slice(2)
|
|
123
|
+
.to_h
|
|
124
|
+
.transform_values(&:strip!)
|
|
125
|
+
rescue Errno::ENOENT
|
|
126
|
+
raise 'failed to get changelogs'
|
|
127
|
+
end
|
data/ChangeLog.md
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
# reflex ChangeLog
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## [v0.3.15] - 2026-05-10
|
|
5
|
+
|
|
6
|
+
- Support WebAssembly
|
|
7
|
+
- Dispatch SDL touch events as multi-pointer PointerEvents
|
|
8
|
+
- Add SDL scancode mapping and input event handling
|
|
9
|
+
- Enable HiDPI support on SDL backend
|
|
10
|
+
- Handle SDL_QUIT via app->quit() instead of breaking loop
|
|
11
|
+
- Remove deprecated has_rdoc= from gemspecs
|
|
12
|
+
|
|
13
|
+
- Fix quit re-entrancy in Application_call_quit
|
|
14
|
+
|
|
15
|
+
|
|
4
16
|
## [v0.3.14] - 2026-04-17
|
|
5
17
|
|
|
6
18
|
- Fix HID gamepad stick direction release not firing on direction switch
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.3.
|
|
1
|
+
0.3.15
|
data/ext/reflex/extconf.rb
CHANGED
|
@@ -15,12 +15,7 @@ Xot::ExtConf.new Xot, Rucy, Rays, Reflex do
|
|
|
15
15
|
headers << 'ruby.h'
|
|
16
16
|
libs.unshift 'gdi32', 'winmm', 'opengl32', 'glew32', 'xinput' if win32?
|
|
17
17
|
frameworks << 'Cocoa' << 'GameController' if osx?
|
|
18
|
-
$LDFLAGS << ' -Wl,--out-implib=
|
|
19
|
-
|
|
20
|
-
unless osx? || linux?
|
|
21
|
-
lib_dirs << Rays::Extension.ext_dir
|
|
22
|
-
libs << 'rays_ext'
|
|
23
|
-
end
|
|
18
|
+
$LDFLAGS << ' -Wl,--out-implib=libreflex.dll.a' if mingw? || cygwin?
|
|
24
19
|
end
|
|
25
20
|
|
|
26
21
|
create_makefile 'reflex_ext'
|
data/ext/reflex/key_event.cpp
CHANGED
|
@@ -123,11 +123,11 @@ RUCY_DEF0(get_key)
|
|
|
123
123
|
CASE(LBRACKET): SYMBOL1(lbracket);
|
|
124
124
|
CASE(RBRACKET): SYMBOL1(rbracket);
|
|
125
125
|
|
|
126
|
-
#if defined(OSX) || defined(IOS) || defined(WIN32) || defined(LINUX)
|
|
126
|
+
#if defined(OSX) || defined(IOS) || defined(WIN32) || defined(LINUX) || defined(WASM)
|
|
127
127
|
CASE(ENTER): SYMBOL1(enter);
|
|
128
128
|
#else
|
|
129
129
|
CASE(ENTER): SYMBOL1(enter);
|
|
130
|
-
CASE(RETURN):
|
|
130
|
+
CASE(RETURN): SYMBOL2(_return, "return");
|
|
131
131
|
#endif
|
|
132
132
|
CASE(SPACE): SYMBOL1(space);
|
|
133
133
|
CASE(TAB): SYMBOL1(tab);
|
|
@@ -145,25 +145,29 @@ RUCY_DEF0(get_key)
|
|
|
145
145
|
CASE(PAGEUP): SYMBOL1(pageup);
|
|
146
146
|
CASE(PAGEDOWN): SYMBOL1(pagedown);
|
|
147
147
|
|
|
148
|
-
#if !defined(OSX) && !defined(IOS) && !defined(LINUX)
|
|
148
|
+
#if !defined(OSX) && !defined(IOS) && !defined(LINUX) && !defined(WASM)
|
|
149
149
|
CASE(SHIFT):
|
|
150
150
|
#endif
|
|
151
151
|
CASE(LSHIFT):
|
|
152
152
|
CASE(RSHIFT): SYMBOL1(shift);
|
|
153
|
-
#if !defined(OSX) && !defined(IOS) && !defined(LINUX)
|
|
153
|
+
#if !defined(OSX) && !defined(IOS) && !defined(LINUX) && !defined(WASM)
|
|
154
154
|
CASE(CONTROL):
|
|
155
155
|
#endif
|
|
156
156
|
CASE(LCONTROL):
|
|
157
157
|
CASE(RCONTROL): SYMBOL1(control);
|
|
158
158
|
CASE(ALT):
|
|
159
|
+
#if !defined(LINUX)
|
|
159
160
|
CASE(LALT):
|
|
161
|
+
#endif
|
|
160
162
|
CASE(RALT): SYMBOL1(alt);
|
|
161
163
|
CASE(LWIN):
|
|
162
164
|
CASE(RWIN): SYMBOL1(win);
|
|
165
|
+
#if !defined(LINUX)
|
|
163
166
|
CASE(LCOMMAND):
|
|
164
167
|
CASE(RCOMMAND): SYMBOL1(command);
|
|
165
168
|
CASE(LOPTION):
|
|
166
169
|
CASE(ROPTION): SYMBOL1(option);
|
|
170
|
+
#endif
|
|
167
171
|
CASE(FUNCTION): SYMBOL1(function);
|
|
168
172
|
|
|
169
173
|
CASE(F1): SYMBOL1(f1);
|
|
@@ -198,7 +202,9 @@ RUCY_DEF0(get_key)
|
|
|
198
202
|
CASE(NUM_EQUAL): SYMBOL1(equal);
|
|
199
203
|
CASE(NUM_COMMA): SYMBOL1(comma);
|
|
200
204
|
CASE(NUM_DECIMAL): SYMBOL1(decimal);
|
|
205
|
+
#if !defined(LINUX)
|
|
201
206
|
CASE(NUM_CLEAR): SYMBOL1(clear);
|
|
207
|
+
#endif
|
|
202
208
|
CASE(NUM_ENTER): SYMBOL1(enter);
|
|
203
209
|
|
|
204
210
|
CASE(CAPSLOCK): SYMBOL1(capslock);
|
data/ext/reflex/view.cpp
CHANGED
|
@@ -217,8 +217,7 @@ RUCY_DEF0(each_child)
|
|
|
217
217
|
CHECK;
|
|
218
218
|
|
|
219
219
|
Value ret;
|
|
220
|
-
|
|
221
|
-
for (Reflex::View::child_iterator it = THIS->child_begin(); it != end; ++it)
|
|
220
|
+
for (auto it = THIS->child_begin(), end = THIS->child_end(); it != end; ++it)
|
|
222
221
|
ret = rb_yield(value(it->get()));
|
|
223
222
|
return ret;
|
|
224
223
|
}
|