SDLRuby 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +31 -0
- data/Rakefile +12 -0
- data/lib/SDLRuby/audio.rb +65 -0
- data/lib/SDLRuby/cursor.rb +46 -0
- data/lib/SDLRuby/display.rb +79 -0
- data/lib/SDLRuby/event/accessor.rb +127 -0
- data/lib/SDLRuby/event/type.rb +75 -0
- data/lib/SDLRuby/event.rb +80 -0
- data/lib/SDLRuby/font.rb +227 -0
- data/lib/SDLRuby/hint.rb +36 -0
- data/lib/SDLRuby/image/image.rb +23 -0
- data/lib/SDLRuby/image/include/SDL_image.h.rb +61 -0
- data/lib/SDLRuby/image.rb +69 -0
- data/lib/SDLRuby/keyboard.rb +58 -0
- data/lib/SDLRuby/mixer/channel.rb +43 -0
- data/lib/SDLRuby/mixer/chunk.rb +49 -0
- data/lib/SDLRuby/mixer/controller.rb +44 -0
- data/lib/SDLRuby/mixer/include/SDL_mixer.h.rb +95 -0
- data/lib/SDLRuby/mixer/sdl_mixer.rb +60 -0
- data/lib/SDLRuby/mixer.rb +87 -0
- data/lib/SDLRuby/mouse.rb +52 -0
- data/lib/SDLRuby/music.rb +158 -0
- data/lib/SDLRuby/palette.rb +49 -0
- data/lib/SDLRuby/pixel_formatter.rb +67 -0
- data/lib/SDLRuby/rect.rb +11 -0
- data/lib/SDLRuby/renderer/accessor.rb +70 -0
- data/lib/SDLRuby/renderer/drawer.rb +107 -0
- data/lib/SDLRuby/renderer/renderer_info.rb +27 -0
- data/lib/SDLRuby/renderer.rb +101 -0
- data/lib/SDLRuby/rw_ops/rw_object.rb +128 -0
- data/lib/SDLRuby/rw_ops.rb +216 -0
- data/lib/SDLRuby/sdl/include/SDL.h.rb +33 -0
- data/lib/SDLRuby/sdl/include/SDL_audio.h.rb +49 -0
- data/lib/SDLRuby/sdl/include/SDL_blendmode.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_clipboard.h.rb +10 -0
- data/lib/SDLRuby/sdl/include/SDL_config.h.rb +13 -0
- data/lib/SDLRuby/sdl/include/SDL_cpuinfo.h.rb +27 -0
- data/lib/SDLRuby/sdl/include/SDL_endian.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_error.h.rb +9 -0
- data/lib/SDLRuby/sdl/include/SDL_events.h.rb +32 -0
- data/lib/SDLRuby/sdl/include/SDL_filesystem.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_gamecontroller.h.rb +66 -0
- data/lib/SDLRuby/sdl/include/SDL_gesture.h.rb +12 -0
- data/lib/SDLRuby/sdl/include/SDL_guid.h.rb +7 -0
- data/lib/SDLRuby/sdl/include/SDL_hints.h.rb +14 -0
- data/lib/SDLRuby/sdl/include/SDL_joystick.h.rb +69 -0
- data/lib/SDLRuby/sdl/include/SDL_keyboard.h.rb +26 -0
- data/lib/SDLRuby/sdl/include/SDL_keycode.h.rb +7 -0
- data/lib/SDLRuby/sdl/include/SDL_locale.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_main.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_messagebox.h.rb +10 -0
- data/lib/SDLRuby/sdl/include/SDL_misc.h.rb +5 -0
- data/lib/SDLRuby/sdl/include/SDL_mouse.h.rb +26 -0
- data/lib/SDLRuby/sdl/include/SDL_pixels.h.rb +25 -0
- data/lib/SDLRuby/sdl/include/SDL_platform.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_power.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_rect.h.rb +17 -0
- data/lib/SDLRuby/sdl/include/SDL_render.h.rb +94 -0
- data/lib/SDLRuby/sdl/include/SDL_revision.h.rb +2 -0
- data/lib/SDLRuby/sdl/include/SDL_rwops.h.rb +34 -0
- data/lib/SDLRuby/sdl/include/SDL_scancode.h.rb +5 -0
- data/lib/SDLRuby/sdl/include/SDL_sensor.h.rb +25 -0
- data/lib/SDLRuby/sdl/include/SDL_shape.h.rb +13 -0
- data/lib/SDLRuby/sdl/include/SDL_stdinc.h.rb +24 -0
- data/lib/SDLRuby/sdl/include/SDL_surface.h.rb +37 -0
- data/lib/SDLRuby/sdl/include/SDL_system.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_syswm.h.rb +16 -0
- data/lib/SDLRuby/sdl/include/SDL_timer.h.rb +13 -0
- data/lib/SDLRuby/sdl/include/SDL_touch.h.rb +15 -0
- data/lib/SDLRuby/sdl/include/SDL_types.h.rb +3 -0
- data/lib/SDLRuby/sdl/include/SDL_version.h.rb +6 -0
- data/lib/SDLRuby/sdl/include/SDL_video.h.rb +117 -0
- data/lib/SDLRuby/sdl/sdl.rb +55 -0
- data/lib/SDLRuby/sdl/sdl_audio.rb +75 -0
- data/lib/SDLRuby/sdl/sdl_blendmode.rb +10 -0
- data/lib/SDLRuby/sdl/sdl_error.rb +5 -0
- data/lib/SDLRuby/sdl/sdl_events.rb +470 -0
- data/lib/SDLRuby/sdl/sdl_hints.rb +9 -0
- data/lib/SDLRuby/sdl/sdl_keyboard.rb +12 -0
- data/lib/SDLRuby/sdl/sdl_locale.rb +8 -0
- data/lib/SDLRuby/sdl/sdl_message_box.rb +7 -0
- data/lib/SDLRuby/sdl/sdl_mouse.rb +32 -0
- data/lib/SDLRuby/sdl/sdl_palette.rb +12 -0
- data/lib/SDLRuby/sdl/sdl_pixels.rb +138 -0
- data/lib/SDLRuby/sdl/sdl_rect.rb +11 -0
- data/lib/SDLRuby/sdl/sdl_render.rb +35 -0
- data/lib/SDLRuby/sdl/sdl_rw_ops.rb +29 -0
- data/lib/SDLRuby/sdl/sdl_scancode.rb +255 -0
- data/lib/SDLRuby/sdl/sdl_surface.rb +27 -0
- data/lib/SDLRuby/sdl/sdl_version.rb +5 -0
- data/lib/SDLRuby/sdl/sdl_video.rb +104 -0
- data/lib/SDLRuby/sdl.rb +192 -0
- data/lib/SDLRuby/sdl_error.rb +8 -0
- data/lib/SDLRuby/surface/pixel_format.rb +51 -0
- data/lib/SDLRuby/surface/surface_renderer.rb +26 -0
- data/lib/SDLRuby/surface.rb +179 -0
- data/lib/SDLRuby/text_input.rb +38 -0
- data/lib/SDLRuby/texture.rb +93 -0
- data/lib/SDLRuby/ttf/include/SDL_ttf.h.rb +54 -0
- data/lib/SDLRuby/ttf/ttf.rb +41 -0
- data/lib/SDLRuby/ttf.rb +54 -0
- data/lib/SDLRuby/version.rb +5 -0
- data/lib/SDLRuby/window/accessor.rb +125 -0
- data/lib/SDLRuby/window/controller.rb +53 -0
- data/lib/SDLRuby/window/display_info.rb +48 -0
- data/lib/SDLRuby/window/flag.rb +42 -0
- data/lib/SDLRuby/window/hit_tester.rb +61 -0
- data/lib/SDLRuby/window/input.rb +68 -0
- data/lib/SDLRuby/window/shaper.rb +68 -0
- data/lib/SDLRuby/window/surfacer.rb +37 -0
- data/lib/SDLRuby/window/window_renderer.rb +31 -0
- data/lib/SDLRuby/window.rb +90 -0
- data/lib/SDLRuby.rb +16 -0
- data/sig/SDLRuby/event.rbs +104 -0
- data/sig/SDLRuby/pixel_formmater.rbs +24 -0
- data/sig/SDLRuby/rect.rbs +5 -0
- data/sig/SDLRuby/sdl.rbs +606 -0
- data/sig/SDLRuby.rbs +4 -0
- metadata +168 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7516a8b356b287a6f985881964b1a44f76922354a13d70000b9990dd2a67badd
|
4
|
+
data.tar.gz: 358b7f4a6b40bd7a31e7249beaac18f77d3d7a08b21c9802f30203fce36628ed
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b5f6c08130fa89f6aa74009a02a5d4a7ada123839f0a2eef2894347ac358e0e75b188bbfd0a657004be3d54207166484b8b842b43edb5ee5dbf6340c4f13f095
|
7
|
+
data.tar.gz: 26017bbb155bb41c032396b13e9981ee62c72954b66501b2ab818356a9cedcbb295a74f810f742ecaf83b1ba52dd6c69b658e39859b35443a59f575fe0d72423
|
data/CHANGELOG.md
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2023 shinokaro
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# SDLRuby
|
2
|
+
|
3
|
+
SDLRuby is a GEM that allows calling the SDL library from Ruby, enabling window creation, image display, audio playback, and more. It easily manages C pointers as Ruby objects, all written in 100% Ruby. Achieve multimedia programming simplicity.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Install the gem and add to the application's Gemfile by executing:
|
8
|
+
|
9
|
+
$ bundle add SDLRuby
|
10
|
+
|
11
|
+
If bundler is not being used to manage dependencies, install the gem by executing:
|
12
|
+
|
13
|
+
$ gem install SDLRuby
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
**⚠️UNDER CONSTRUCTION⚠️**
|
18
|
+
|
19
|
+
## Development
|
20
|
+
|
21
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
22
|
+
|
23
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
24
|
+
|
25
|
+
## Contributing
|
26
|
+
|
27
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/shinokaro/SDLRuby.
|
28
|
+
|
29
|
+
## License
|
30
|
+
|
31
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
module Audio
|
3
|
+
include SDL
|
4
|
+
|
5
|
+
class << self
|
6
|
+
include SDL
|
7
|
+
|
8
|
+
def default_device(capture: nil)
|
9
|
+
name = SDL.tmp_value("void*")
|
10
|
+
spec = SDL_AudioSpec.malloc(Fiddle::RUBY_FREE)
|
11
|
+
is_capture = capture ? 1 : 0
|
12
|
+
err = SDL. SDL_GetDefaultAudioInfo(name, spec, is_capture)
|
13
|
+
raise SDLError if err != 0
|
14
|
+
|
15
|
+
ptr = name.value
|
16
|
+
s = if ptr.null?
|
17
|
+
nil
|
18
|
+
else
|
19
|
+
ptr.free = SDL_FREE
|
20
|
+
ptr.to_s.force_encoding("UTF-8")
|
21
|
+
end
|
22
|
+
|
23
|
+
[s, spec.to_h]
|
24
|
+
end
|
25
|
+
|
26
|
+
def devices(capture: nil)
|
27
|
+
is_capture = capture ? 1 : 0
|
28
|
+
num = SDL.SDL_GetNumAudioDevices(is_capture)
|
29
|
+
num.times.map do |idx|
|
30
|
+
SDL.SDL_GetAudioDeviceName(idx, is_capture).to_s.force_encoding("UTF-8")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def device_spec(name, capture: nil)
|
35
|
+
idx = devices(capture: capture).index(name.encode("UTF-8"))
|
36
|
+
|
37
|
+
return unless idx
|
38
|
+
|
39
|
+
is_capture = capture ? 1 : 0
|
40
|
+
spec = SDL_AudioSpec.malloc(Fiddle::RUBY_FREE)
|
41
|
+
|
42
|
+
if SDL.SDL_GetAudioDeviceSpec(idx, is_capture, spec) == 0
|
43
|
+
spec.to_h
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def driver
|
48
|
+
ptr = SDL.SDL_GetCurrentAudioDriver
|
49
|
+
ptr.null? ? nil : ptr.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
def drivers
|
53
|
+
num = SDL.SDL_GetNumAudioDrivers
|
54
|
+
num.times.map { |idx| SDL.SDL_GetAudioDriver(idx).to_s }
|
55
|
+
end
|
56
|
+
|
57
|
+
def init(driver)
|
58
|
+
err = SDL.SDL_AudioInit(driver)
|
59
|
+
raise SDLError if err < 0
|
60
|
+
end
|
61
|
+
|
62
|
+
def quit = SDL.SDL_AudioQuit
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
class Cursor
|
3
|
+
include SDL
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def [](obj, hot: nil)
|
7
|
+
case obj
|
8
|
+
when Surface
|
9
|
+
SDL.SDL_CreateColorCursor(obj, *hot && [0, 0])
|
10
|
+
when Integer
|
11
|
+
SDL.SDL_CreateSystemCursor(obj)
|
12
|
+
else
|
13
|
+
raise ArgumentError
|
14
|
+
end => ptr
|
15
|
+
|
16
|
+
raise SDLError if ptr.null?
|
17
|
+
|
18
|
+
new(ptr)
|
19
|
+
end
|
20
|
+
|
21
|
+
def default! = SDL.SDL_SetCursor(SDL.SDL_GetDefaultCursor)
|
22
|
+
|
23
|
+
def hide = SDL.SDL_ShowCursor(0)
|
24
|
+
|
25
|
+
def redraw = SDL.SDL_SetCursor(nil)
|
26
|
+
|
27
|
+
def show = SDL.SDL_ShowCursor(1)
|
28
|
+
|
29
|
+
def shown? = SDL.SDL_ShowCursor(-1) == 1
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(ptr)
|
33
|
+
ptr.free = SDL_FREE_CURSOR
|
34
|
+
@ptr = ptr
|
35
|
+
end
|
36
|
+
|
37
|
+
def current? = SDL.SDL_GetCursor == @ptr
|
38
|
+
|
39
|
+
def show
|
40
|
+
SDL.SDL_SetCursor(self)
|
41
|
+
Cursor.show
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_ptr = @ptr
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require_relative 'pixel_formatter'
|
2
|
+
|
3
|
+
module SDLRuby
|
4
|
+
class DisplayMode
|
5
|
+
include PixelFormatter, SDL
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@st = SDL_DisplayMode.malloc(Fiddle::RUBY_FREE)
|
10
|
+
end
|
11
|
+
|
12
|
+
def_delegators :@st, :format, :w, :h, :refresh_rate
|
13
|
+
|
14
|
+
def to_ptr = @st.to_ptr
|
15
|
+
end
|
16
|
+
|
17
|
+
class Display
|
18
|
+
class << self
|
19
|
+
include SDL
|
20
|
+
|
21
|
+
# Videoの初期化がされていなければ0を戻す。
|
22
|
+
#
|
23
|
+
def count = (i = SDL.SDL_GetNumVideoDisplays) < 0 ? 0 : i
|
24
|
+
|
25
|
+
def orientation(idx) = SDL.SDL_GetDisplayOrientation(idx)
|
26
|
+
|
27
|
+
def orientation_name(idx)
|
28
|
+
case orientation(idx)
|
29
|
+
when SDL_ORIENTATION_UNKNOWN then ""
|
30
|
+
when SDL_ORIENTATION_LANDSCAPE then "landscape"
|
31
|
+
when SDL_ORIENTATION_LANDSCAPE_FLIPPED then "landscape_flipped"
|
32
|
+
when SDL_ORIENTATION_PORTRAIT then "portrait"
|
33
|
+
when SDL_ORIENTATION_PORTRAIT_FLIPPED then "portrait_flipped"
|
34
|
+
else
|
35
|
+
""
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
attr_reader :bounds, :current_display_mode, :desktop_display_mode,
|
41
|
+
:display_modes, :name, :orientation, :usable_bounds
|
42
|
+
|
43
|
+
def initialize(num)
|
44
|
+
# この実装では例外を出さない。
|
45
|
+
# 基本的にSDLの内部構造体を読み出しているだけであり、
|
46
|
+
# 関数からのエラー報告はインデックス境界に関するものである。
|
47
|
+
#
|
48
|
+
# ディスプレイの状態はユーザのハードウェアやOS操作によって常に変化する。
|
49
|
+
# 一纏めにデータを取得する必要がある。
|
50
|
+
#
|
51
|
+
@bounds = Rect[].tap { |r| SDL.SDL_GetDisplayBounds(num, r) }.to_a
|
52
|
+
|
53
|
+
@current_display_mode = DisplayMode.new.tap do |st|
|
54
|
+
SDL.SDL_GetCurrentDisplayMode(num, st)
|
55
|
+
end
|
56
|
+
|
57
|
+
@desktop_display_mode = DisplayMode.new.tap do |st|
|
58
|
+
SDL.SDL_GetDesktopDisplayMode(num, st)
|
59
|
+
end
|
60
|
+
|
61
|
+
@display_modes = SDL.SDL_GetNumDisplayModes(num).times.map do |idx|
|
62
|
+
DisplayMode.new.tap { |st| SDL.SDL_GetDisplayMode(num, idx, st) }
|
63
|
+
end
|
64
|
+
|
65
|
+
ptr = SDL.SDL_GetDisplayName(num)
|
66
|
+
@name = (ptr.null? ? nil : ptr).to_s.force_encoding("UTF-8")
|
67
|
+
|
68
|
+
@orientation = Display.orientation(num)
|
69
|
+
|
70
|
+
@usable_bounds = Rect[].tap do |r|
|
71
|
+
SDL.SDL_GetDisplayUsableBounds(num, r)
|
72
|
+
end.to_a
|
73
|
+
|
74
|
+
@num = num
|
75
|
+
end
|
76
|
+
|
77
|
+
def to_i = @num
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
class Event
|
3
|
+
module Accessor
|
4
|
+
include SDL
|
5
|
+
|
6
|
+
union_members = SDL_Event.members.inject([]) do |result, (name, members)|
|
7
|
+
if members
|
8
|
+
# ネストした構造体の場合は親のみを選択する。
|
9
|
+
result << [name, members.flatten(1).select { |a| !(Array === a) }]
|
10
|
+
end
|
11
|
+
|
12
|
+
result
|
13
|
+
end
|
14
|
+
|
15
|
+
@modules = Hash.new do |_, key|
|
16
|
+
raise KeyError, "undefined SDL_Event member(#{key})"
|
17
|
+
end
|
18
|
+
|
19
|
+
union_members.each do |name, members|
|
20
|
+
@modules[name.to_sym] = Module.new do
|
21
|
+
extend Forwardable
|
22
|
+
|
23
|
+
def_delegators :entity, *members
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class << self
|
28
|
+
def [](sym) = @modules[sym]
|
29
|
+
end
|
30
|
+
|
31
|
+
self[:adevice].module_eval do
|
32
|
+
def capture? = entity.iscapture != 0
|
33
|
+
end
|
34
|
+
|
35
|
+
self[:cbutton].module_eval do
|
36
|
+
def pressed? = state == SDL_PRESSED
|
37
|
+
end
|
38
|
+
|
39
|
+
self[:drop].module_eval do
|
40
|
+
undef file
|
41
|
+
|
42
|
+
def file = char_ptr_to_str(entity.file)
|
43
|
+
|
44
|
+
alias_method :text, :file
|
45
|
+
|
46
|
+
def self.extended(obj)
|
47
|
+
@_ptr ||= entity.file.tap { |ptr| ptr.free = SDL_FREE unless ptr.null? }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
self[:edit].module_eval do
|
52
|
+
undef text
|
53
|
+
|
54
|
+
def text = char_ary_to_str(entity.text)
|
55
|
+
end
|
56
|
+
|
57
|
+
self[:editExt].module_eval do
|
58
|
+
undef text
|
59
|
+
|
60
|
+
def text = char_ptr_to_str(entity.text)
|
61
|
+
|
62
|
+
def self.extended(obj)
|
63
|
+
@_ptr ||= entity.text.tap { |ptr| ptr.free = SDL_FREE }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
self[:jbutton].module_eval do
|
68
|
+
def pressed? = state == SDL_PRESSED
|
69
|
+
end
|
70
|
+
|
71
|
+
self[:key].module_eval do
|
72
|
+
undef keysym
|
73
|
+
|
74
|
+
def keysym = entity.keysym.to_h
|
75
|
+
end
|
76
|
+
|
77
|
+
self[:syswm].module_eval do
|
78
|
+
undef msg
|
79
|
+
|
80
|
+
def msg = entity.msg
|
81
|
+
end
|
82
|
+
|
83
|
+
self[:text].module_eval do
|
84
|
+
undef text
|
85
|
+
|
86
|
+
def text = char_ary_to_str(entity.text)
|
87
|
+
end
|
88
|
+
|
89
|
+
self[:user].module_eval do
|
90
|
+
undef data1, data2
|
91
|
+
|
92
|
+
def data1 = entity.data1
|
93
|
+
|
94
|
+
def data2 = entity.data2
|
95
|
+
end
|
96
|
+
|
97
|
+
# STIの実装としてメンバー全てのゲッターに例外を出さず応答するようにする。
|
98
|
+
# これは"y"メソッドにRubyが応答してしまうため。事前にオーバーライドしておく。
|
99
|
+
#
|
100
|
+
all_members = union_members.map { |a| a.last }.flatten.uniq
|
101
|
+
|
102
|
+
attr_reader(*all_members)
|
103
|
+
|
104
|
+
# Ruby like accessor
|
105
|
+
#
|
106
|
+
alias_method :d_dist, :dDist
|
107
|
+
alias_method :d_theta, :dTheta
|
108
|
+
alias_method :finger_id, :fingerId
|
109
|
+
alias_method :gesture_id, :gestureId
|
110
|
+
alias_method :mouse_x, :mouseX
|
111
|
+
alias_method :mouse_y, :mouseY
|
112
|
+
alias_method :num_fingers, :numFingers
|
113
|
+
alias_method :precise_x, :preciseX
|
114
|
+
alias_method :precise_y, :preciseY
|
115
|
+
alias_method :touch_id, :touchId
|
116
|
+
alias_method :window_id, :windowID
|
117
|
+
|
118
|
+
private def char_ary_to_str(a)
|
119
|
+
a[0, a.find_index(0)].pack("C*").force_encoding("UTF-8")
|
120
|
+
end
|
121
|
+
|
122
|
+
private def char_ptr_to_str(ptr)
|
123
|
+
ptr.null? ? "" : ptr.to_s.force_encoding("UTF-8")
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module SDLRuby
|
2
|
+
class Event
|
3
|
+
module Type
|
4
|
+
include SDL
|
5
|
+
|
6
|
+
QUIT_EVENT = SDL_QUIT..SDL_QUIT
|
7
|
+
DISPLAY_EVENT = SDL_DISPLAYEVENT..SDL_DISPLAYEVENT
|
8
|
+
WINDOW_EVENT = SDL_WINDOWEVENT..SDL_WINDOWEVENT
|
9
|
+
SYSWM_EVENT = SDL_SYSWMEVENT..SDL_SYSWMEVENT
|
10
|
+
KEY_EVENT = SDL_KEYDOWN..SDL_KEYUP
|
11
|
+
EDIT_EVENT = SDL_TEXTEDITING..SDL_TEXTEDITING
|
12
|
+
TEXT_EVENT = SDL_TEXTINPUT..SDL_TEXTINPUT
|
13
|
+
EDIT_EXT_EVENT = SDL_TEXTEDITING_EXT..SDL_TEXTEDITING_EXT
|
14
|
+
MOTION_EVENT = SDL_MOUSEMOTION..SDL_MOUSEMOTION
|
15
|
+
BUTTON_EVENT = SDL_MOUSEBUTTONDOWN..SDL_MOUSEBUTTONUP
|
16
|
+
WHEEL_EVENT = SDL_MOUSEWHEEL..SDL_MOUSEWHEEL
|
17
|
+
JAXIS_EVENT = SDL_JOYAXISMOTION..SDL_JOYAXISMOTION
|
18
|
+
JBALL_EVENT = SDL_JOYBALLMOTION..SDL_JOYBALLMOTION
|
19
|
+
JHAT_EVENT = SDL_JOYHATMOTION..SDL_JOYHATMOTION
|
20
|
+
JBUTTON_EVENT = SDL_JOYBUTTONDOWN..SDL_JOYBUTTONUP
|
21
|
+
JDEVICE_EVENT = SDL_JOYDEVICEADDED..SDL_JOYDEVICEREMOVED
|
22
|
+
JBATTERY_EVENT = SDL_JOYBATTERYUPDATED..SDL_JOYBATTERYUPDATED
|
23
|
+
CAXIS_EVENT = SDL_CONTROLLERAXISMOTION..SDL_CONTROLLERAXISMOTION
|
24
|
+
CBUTTON_EVENT = SDL_CONTROLLERBUTTONDOWN..SDL_CONTROLLERBUTTONUP
|
25
|
+
CDEVICE_EVENT = SDL_CONTROLLERDEVICEADDED..SDL_CONTROLLERDEVICEREMAPPED
|
26
|
+
CTOUCHPAD_EVENT = SDL_CONTROLLERTOUCHPADDOWN..SDL_CONTROLLERTOUCHPADUP
|
27
|
+
CSENSOR_EVENT = SDL_CONTROLLERSENSORUPDATE..SDL_CONTROLLERSENSORUPDATE
|
28
|
+
TFINGER_EVENT = SDL_FINGERDOWN..SDL_FINGERMOTION
|
29
|
+
DGESTURE_EVENT = SDL_DOLLARGESTURE..SDL_DOLLARRECORD
|
30
|
+
MGESTURE_EVENT = SDL_MULTIGESTURE..SDL_MULTIGESTURE
|
31
|
+
DROP_EVENT = SDL_DROPFILE..SDL_DROPCOMPLETE
|
32
|
+
ADEVICE_EVENT = SDL_AUDIODEVICEADDED..SDL_AUDIODEVICEREMOVED
|
33
|
+
SENSOR_EVENT = SDL_SENSORUPDATE..SDL_SENSORUPDATE
|
34
|
+
USER_EVENT = SDL_USEREVENT...SDL_LASTEVENT
|
35
|
+
|
36
|
+
class << self
|
37
|
+
def to_sym(type)
|
38
|
+
case type
|
39
|
+
when DISPLAY_EVENT then :display
|
40
|
+
when WINDOW_EVENT then :window
|
41
|
+
when KEY_EVENT then :key
|
42
|
+
when EDIT_EVENT then :edit
|
43
|
+
when EDIT_EXT_EVENT then :editExt
|
44
|
+
when TEXT_EVENT then :text
|
45
|
+
when MOTION_EVENT then :motion
|
46
|
+
when BUTTON_EVENT then :button
|
47
|
+
when WHEEL_EVENT then :wheel
|
48
|
+
when JAXIS_EVENT then :jaxis
|
49
|
+
when JBALL_EVENT then :jball
|
50
|
+
when JHAT_EVENT then :jhat
|
51
|
+
when JBUTTON_EVENT then :jbutton
|
52
|
+
when JDEVICE_EVENT then :jdevice
|
53
|
+
when JBATTERY_EVENT then :jbattery
|
54
|
+
when CAXIS_EVENT then :caxis
|
55
|
+
when CBUTTON_EVENT then :cbutton
|
56
|
+
when CDEVICE_EVENT then :cdevice
|
57
|
+
when CTOUCHPAD_EVENT then :ctouchpad
|
58
|
+
when CSENSOR_EVENT then :csensor
|
59
|
+
when ADEVICE_EVENT then :adevice
|
60
|
+
when SENSOR_EVENT then :sensor
|
61
|
+
when QUIT_EVENT then :quit
|
62
|
+
when USER_EVENT then :user
|
63
|
+
when SYSWM_EVENT then :syswm
|
64
|
+
when TFINGER_EVENT then :tfinger
|
65
|
+
when MGESTURE_EVENT then :mgesture
|
66
|
+
when DGESTURE_EVENT then :dgesture
|
67
|
+
when DROP_EVENT then :drop
|
68
|
+
else
|
69
|
+
:common
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require_relative 'event/accessor'
|
2
|
+
require_relative 'event/type'
|
3
|
+
|
4
|
+
module SDLRuby
|
5
|
+
class Event
|
6
|
+
include Accessor, Fiddle, SDL
|
7
|
+
|
8
|
+
class << self
|
9
|
+
include SDL
|
10
|
+
|
11
|
+
# SDL_WaitEvent, SDL_WaitEventTimeoutはRubyのスレッドを停止させるため実装しない。
|
12
|
+
# ※C関数呼び出し時にGVLを外せれば可能か?
|
13
|
+
# SDL_RegisterEventsはSDLに対応するゲッターがないため実装しない。
|
14
|
+
# SDL_PushEventは必要ならば実装する。ただしEventコンストラクターを含むため規模が大きい。
|
15
|
+
#
|
16
|
+
# SDL_AddEventWatch, SDL_SetEventFilterおよびSDL_FilterEventsは実装しない。
|
17
|
+
# イベントにポインターを含む場合、RubyのGCの管理下に置く方法が複雑なため。
|
18
|
+
# ※現実装ではイベントを取り込んだ時点でポインターをRubyの管理下に置いている。
|
19
|
+
# メンバーのポインター管理をファイナライザーに移行できれば可能だろう。
|
20
|
+
# ※そしてファイナライザーを設定するかどうか選択する。
|
21
|
+
# いずれもSDL_EventPumpを呼び出さなければ動作しない。
|
22
|
+
# 非同期にイベントを取得できるわけではない。
|
23
|
+
# SDL_PeepEventsは実装しない。
|
24
|
+
# SDL_ADDEVENT:
|
25
|
+
# イベントのメンバーにポインターを含む場合、それのSDL側へのコピーが必要になる。
|
26
|
+
# SDL_PushEventが実装されれば、それが同等の機能を持つ。
|
27
|
+
# SDL_PEEKEVENT:
|
28
|
+
# SDL_FilterEventsが実装できれば、それが同等の機能を持つ。
|
29
|
+
# SDL_GETEVENT:
|
30
|
+
# キューの削除が目的だと思う。それを行うならSDL_PollEventを利用して欲しい。
|
31
|
+
# イベントキューはコレクションではない。
|
32
|
+
#
|
33
|
+
# SDL_PeepEventsは実行中にキューをロックすることに注意。
|
34
|
+
# また、SDL_SYSWMEVENTのmsgメンバーにコピーが必要か分からない。(要調査)
|
35
|
+
# ※このポインターだけSDLが管理しているようだ。
|
36
|
+
|
37
|
+
def clear = (pump or flash)
|
38
|
+
|
39
|
+
def count = SDL.SDL_PeepEvents(nil, 0, SDL_PEEKEVENT, 0, -1)
|
40
|
+
|
41
|
+
def disable(type) = SDL.SDL_EventState(type, 0)
|
42
|
+
|
43
|
+
def enable(type) = SDL.SDL_EventState(type, 1)
|
44
|
+
|
45
|
+
def flash = SDL.SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT)
|
46
|
+
|
47
|
+
def get = poll(e = new)
|
48
|
+
|
49
|
+
private :new
|
50
|
+
|
51
|
+
private def poll(e) = (SDL.SDL_PollEvent(e).nonzero? and e.update)
|
52
|
+
|
53
|
+
def pump = SDL.SDL_PumpEvents
|
54
|
+
|
55
|
+
alias update pump
|
56
|
+
|
57
|
+
def quit? = (pump or SDL.SDL_HasEvent(SDL_QUIT) != 0)
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialize
|
61
|
+
@st = SDL_Event.malloc(RUBY_FREE)
|
62
|
+
end
|
63
|
+
|
64
|
+
private attr_reader :entity
|
65
|
+
|
66
|
+
def to_ptr = @st.to_ptr
|
67
|
+
|
68
|
+
def to_sym = Type.to_sym(@st.type)
|
69
|
+
|
70
|
+
def update
|
71
|
+
unless @entity
|
72
|
+
sym = to_sym
|
73
|
+
@entity = @st.__send__(sym)
|
74
|
+
extend(Accessor[sym])
|
75
|
+
end
|
76
|
+
|
77
|
+
self
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|