ruby-sdl-ffi 0.2 → 0.3
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.
- data/ChangeLog.txt +203 -0
- data/NEWS.rdoc +37 -1
- data/README.rdoc +5 -5
- data/lib/ruby-sdl-ffi.rb +1 -1
- data/lib/ruby-sdl-ffi/gfx/rotozoom.rb +9 -9
- data/lib/ruby-sdl-ffi/sdl.rb +13 -8
- data/lib/ruby-sdl-ffi/sdl/audio.rb +5 -4
- data/lib/ruby-sdl-ffi/sdl/event.rb +7 -7
- data/lib/ruby-sdl-ffi/sdl/keyboard.rb +13 -3
- data/lib/ruby-sdl-ffi/sdl/mac.rb +437 -0
- data/lib/ruby-sdl-ffi/sdl/mouse.rb +6 -6
- data/lib/ruby-sdl-ffi/sdl/video.rb +73 -22
- data/lib/ruby-sdl-ffi/ttf.rb +14 -14
- metadata +27 -9
data/ChangeLog.txt
CHANGED
@@ -1,3 +1,206 @@
|
|
1
|
+
------------------------------------------------------------
|
2
|
+
Author: John Croisant <jacius@gmail.com>
|
3
|
+
Date: Sun Aug 8 00:03:34 2010 -0500
|
4
|
+
|
5
|
+
Ruby-SDL-FFI 0.3 released.
|
6
|
+
|
7
|
+
------------------------------------------------------------
|
8
|
+
Author: John Croisant <jacius@gmail.com>
|
9
|
+
Date: Sat Aug 7 23:49:19 2010 -0500
|
10
|
+
|
11
|
+
Updated copyright on files modified in 2010.
|
12
|
+
|
13
|
+
M README.rdoc
|
14
|
+
M lib/ruby-sdl-ffi.rb
|
15
|
+
M lib/ruby-sdl-ffi/sdl.rb
|
16
|
+
M lib/ruby-sdl-ffi/sdl/video.rb
|
17
|
+
|
18
|
+
------------------------------------------------------------
|
19
|
+
Author: John Croisant <jacius@gmail.com>
|
20
|
+
Date: Sat Aug 7 23:19:44 2010 -0500
|
21
|
+
|
22
|
+
Fixed examples to use '#!/usr/bin/env ruby'.
|
23
|
+
|
24
|
+
'#!/bin/env ruby' doesn't work on Mac.
|
25
|
+
|
26
|
+
Also fixed a NameError in load_music.rb, due to FFI API changes.
|
27
|
+
|
28
|
+
M examples/load_image.rb
|
29
|
+
M examples/load_music.rb
|
30
|
+
|
31
|
+
------------------------------------------------------------
|
32
|
+
Author: John Croisant <jacius@gmail.com>
|
33
|
+
Date: Sat Aug 7 23:13:40 2010 -0500
|
34
|
+
|
35
|
+
Updated NEWS.rdoc, README.rdoc, and ruby-sdl-ffi.gemspec for version 0.3.
|
36
|
+
|
37
|
+
M NEWS.rdoc
|
38
|
+
M README.rdoc
|
39
|
+
M ruby-sdl-ffi.gemspec
|
40
|
+
|
41
|
+
------------------------------------------------------------
|
42
|
+
Author: John Croisant <jacius@gmail.com>
|
43
|
+
Date: Sat Aug 7 23:11:40 2010 -0500
|
44
|
+
|
45
|
+
Improved how RUBYSDLFFI_PATH and SDL_PATHS are processed.
|
46
|
+
|
47
|
+
M lib/ruby-sdl-ffi/sdl.rb
|
48
|
+
|
49
|
+
------------------------------------------------------------
|
50
|
+
Author: John Croisant <jacius@gmail.com>
|
51
|
+
Date: Fri Aug 6 04:07:07 2010 -0500
|
52
|
+
|
53
|
+
Added SDL.set_app_name (and SDL::Mac.set_app_name).
|
54
|
+
|
55
|
+
M lib/ruby-sdl-ffi/sdl/mac.rb
|
56
|
+
M lib/ruby-sdl-ffi/sdl/video.rb
|
57
|
+
|
58
|
+
------------------------------------------------------------
|
59
|
+
Author: John Croisant <jacius@gmail.com>
|
60
|
+
Date: Fri Aug 6 01:35:14 2010 -0500
|
61
|
+
|
62
|
+
Removed unused Mac code and nibs.
|
63
|
+
|
64
|
+
D lib/ruby-sdl-ffi/sdl/EmptyMacMenu.nib/designable.nib
|
65
|
+
D lib/ruby-sdl-ffi/sdl/EmptyMacMenu.nib/keyedobjects.nib
|
66
|
+
D lib/ruby-sdl-ffi/sdl/MacMenu.nib/designable.nib
|
67
|
+
D lib/ruby-sdl-ffi/sdl/MacMenu.nib/keyedobjects.nib
|
68
|
+
D lib/ruby-sdl-ffi/sdl/SparseMacMenu.nib/designable.nib
|
69
|
+
D lib/ruby-sdl-ffi/sdl/SparseMacMenu.nib/keyedobjects.nib
|
70
|
+
M lib/ruby-sdl-ffi/sdl/mac.rb
|
71
|
+
M lib/ruby-sdl-ffi/sdl/video.rb
|
72
|
+
|
73
|
+
------------------------------------------------------------
|
74
|
+
Author: John Croisant <jacius@gmail.com>
|
75
|
+
Date: Tue Aug 3 22:53:14 2010 -0500
|
76
|
+
|
77
|
+
Extract paths from ENV["RUBYSDLFFI_PATH"] if present.
|
78
|
+
|
79
|
+
RUBYSDLFFI_PATH should be a colon (on *nix/Mac) or semicolon
|
80
|
+
(Windows) separated list of paths to search for SDL libraries.
|
81
|
+
|
82
|
+
(Alternative to setting the SDL_PATHS constant in Ruby.)
|
83
|
+
|
84
|
+
M lib/ruby-sdl-ffi/sdl.rb
|
85
|
+
|
86
|
+
------------------------------------------------------------
|
87
|
+
Author: John Croisant <jacius@gmail.com>
|
88
|
+
Date: Sat Jul 10 22:53:30 2010 -0500
|
89
|
+
|
90
|
+
More progress on Mac support.
|
91
|
+
|
92
|
+
M lib/ruby-sdl-ffi/sdl/mac.rb
|
93
|
+
M lib/ruby-sdl-ffi/sdl/video.rb
|
94
|
+
|
95
|
+
------------------------------------------------------------
|
96
|
+
Author: John Croisant <jacius@gmail.com>
|
97
|
+
Date: Fri Jul 9 03:16:12 2010 -0500
|
98
|
+
|
99
|
+
More object-oriented style for Mac ObjC/Cocoa bindings.
|
100
|
+
|
101
|
+
M lib/ruby-sdl-ffi/sdl/mac.rb
|
102
|
+
|
103
|
+
------------------------------------------------------------
|
104
|
+
Author: John Croisant <jacius@gmail.com>
|
105
|
+
Date: Thu Jul 8 05:03:35 2010 -0500
|
106
|
+
|
107
|
+
WIP experimental mac menu support
|
108
|
+
|
109
|
+
A lib/ruby-sdl-ffi/sdl/EmptyMacMenu.nib/designable.nib
|
110
|
+
A lib/ruby-sdl-ffi/sdl/EmptyMacMenu.nib/keyedobjects.nib
|
111
|
+
A lib/ruby-sdl-ffi/sdl/MacMenu.nib/designable.nib
|
112
|
+
A lib/ruby-sdl-ffi/sdl/MacMenu.nib/keyedobjects.nib
|
113
|
+
A lib/ruby-sdl-ffi/sdl/SparseMacMenu.nib/designable.nib
|
114
|
+
A lib/ruby-sdl-ffi/sdl/SparseMacMenu.nib/keyedobjects.nib
|
115
|
+
M lib/ruby-sdl-ffi/sdl/mac.rb
|
116
|
+
M lib/ruby-sdl-ffi/sdl/video.rb
|
117
|
+
|
118
|
+
------------------------------------------------------------
|
119
|
+
Author: John Croisant <jacius@gmail.com>
|
120
|
+
Date: Fri Jul 2 23:10:58 2010 -0500
|
121
|
+
|
122
|
+
Disable Mac magic if using rsdl or ENV["RUBYSDLFFI_NOCOCOA"] is true.
|
123
|
+
|
124
|
+
M lib/ruby-sdl-ffi/sdl/mac.rb
|
125
|
+
M lib/ruby-sdl-ffi/sdl/video.rb
|
126
|
+
|
127
|
+
------------------------------------------------------------
|
128
|
+
Author: John Croisant <jacius@gmail.com>
|
129
|
+
Date: Wed Jun 30 18:39:16 2010 -0500
|
130
|
+
|
131
|
+
Improved integration with the Mac window manager.
|
132
|
+
|
133
|
+
The app now gets an application menu and dock icon, and the
|
134
|
+
SDL window can gain focus and have a title.
|
135
|
+
|
136
|
+
M lib/ruby-sdl-ffi/sdl/mac.rb
|
137
|
+
M lib/ruby-sdl-ffi/sdl/video.rb
|
138
|
+
|
139
|
+
------------------------------------------------------------
|
140
|
+
Author: John Croisant <jacius@gmail.com>
|
141
|
+
Date: Tue Jun 29 03:45:58 2010 -0500
|
142
|
+
|
143
|
+
Preliminary support for Mac without rsdl.
|
144
|
+
|
145
|
+
This allows the normal ruby interpreter to create a window on
|
146
|
+
Mac OS X. No special interpreter (i.e. rsdl) is needed.
|
147
|
+
However, some SDL functions have memory leaks, so we should wrap
|
148
|
+
those functions in NS{Push,Pop}AutoreleasePool.
|
149
|
+
|
150
|
+
Eternal thanks to erisdiscord for pointing the way!
|
151
|
+
|
152
|
+
M lib/ruby-sdl-ffi/sdl.rb
|
153
|
+
A lib/ruby-sdl-ffi/sdl/mac.rb
|
154
|
+
|
155
|
+
------------------------------------------------------------
|
156
|
+
Author: John Croisant <jacius@gmail.com>
|
157
|
+
Date: Fri Jun 4 18:17:54 2010 -0500
|
158
|
+
|
159
|
+
Fixed SDL.GL_GetAttribute returning FFI::Buffer instead of integer.
|
160
|
+
|
161
|
+
M lib/ruby-sdl-ffi/sdl/video.rb
|
162
|
+
|
163
|
+
------------------------------------------------------------
|
164
|
+
Author: John Croisant <jacius@gmail.com>
|
165
|
+
Date: Sun Apr 11 05:13:04 2010 -0500
|
166
|
+
|
167
|
+
Made SDL::Palette enumerable, defined #each and #at.
|
168
|
+
|
169
|
+
M lib/ruby-sdl-ffi/sdl/video.rb
|
170
|
+
|
171
|
+
------------------------------------------------------------
|
172
|
+
Author: John Croisant <jacius@gmail.com>
|
173
|
+
Date: Thu Dec 10 14:20:10 2009 -0600
|
174
|
+
|
175
|
+
Made a nice wrapper around SDL::GetKeyRepeat().
|
176
|
+
|
177
|
+
M lib/ruby-sdl-ffi/sdl/keyboard.rb
|
178
|
+
|
179
|
+
------------------------------------------------------------
|
180
|
+
Author: John Croisant <jacius@gmail.com>
|
181
|
+
Date: Thu Dec 10 13:53:53 2009 -0600
|
182
|
+
|
183
|
+
Use Buffer instad of MemoryPointer in many places.
|
184
|
+
|
185
|
+
There may be other places where Buffer should be used,
|
186
|
+
but these are the obvious ones.
|
187
|
+
|
188
|
+
M lib/ruby-sdl-ffi/gfx/rotozoom.rb
|
189
|
+
M lib/ruby-sdl-ffi/sdl/audio.rb
|
190
|
+
M lib/ruby-sdl-ffi/sdl/event.rb
|
191
|
+
M lib/ruby-sdl-ffi/sdl/keyboard.rb
|
192
|
+
M lib/ruby-sdl-ffi/sdl/mouse.rb
|
193
|
+
M lib/ruby-sdl-ffi/sdl/video.rb
|
194
|
+
M lib/ruby-sdl-ffi/ttf.rb
|
195
|
+
|
196
|
+
------------------------------------------------------------
|
197
|
+
Author: John Croisant <jacius@gmail.com>
|
198
|
+
Date: Thu Dec 10 02:53:55 2009 -0600
|
199
|
+
|
200
|
+
Fixed a mistake in SDL::WaitEvent().
|
201
|
+
|
202
|
+
M lib/ruby-sdl-ffi/sdl/event.rb
|
203
|
+
|
1
204
|
------------------------------------------------------------
|
2
205
|
Author: John Croisant <jacius@gmail.com>
|
3
206
|
Date: Fri Oct 30 18:29:33 2009 -0500
|
data/NEWS.rdoc
CHANGED
@@ -1,5 +1,42 @@
|
|
1
1
|
= NEWS
|
2
2
|
|
3
|
+
|
4
|
+
== Ruby-SDL-FFI 0.3
|
5
|
+
|
6
|
+
* Ruby-SDL-FFI can now work on Mac OS X without the need for a special
|
7
|
+
interpreter (i.e. rsdl). If this causes issues for you, you can
|
8
|
+
disable it by setting the RUBYSDLFFI_NOCOCOA environment variable to
|
9
|
+
"true".
|
10
|
+
|
11
|
+
* Added the SDL::set_app_name() method. This sets the application name
|
12
|
+
in a platform-appropriate way, or does nothing if the platform is
|
13
|
+
not supported. On Mac OS X, it changes the text in the menu bar.
|
14
|
+
Support for other platforms may be added in the future.
|
15
|
+
|
16
|
+
* Ruby-SDL-FFI now reads the RUBYSDLFFI_PATH environment variable for
|
17
|
+
additional library load paths. It should be a colon-separated
|
18
|
+
(Linux/Mac) or semicolon-separated (Windows) list of directories to
|
19
|
+
search for libraries.
|
20
|
+
|
21
|
+
* The SDL::Palette class is now Enumerable. You can iterate over it
|
22
|
+
with #each, #collect, etc. You can also read a specific index using
|
23
|
+
#at (but not #[], which is reserved for struct access).
|
24
|
+
|
25
|
+
* SDL.GL_GetAttribute() now returns an integer, like it should.
|
26
|
+
Before, it would return an FFI::Buffer.
|
27
|
+
|
28
|
+
* SDL.GetKeyRepeat() is now easier to use. It returns an Array of two
|
29
|
+
integers: [delay, interval]. Before, you had to pass two output
|
30
|
+
buffers, then extract the integers afterwards.
|
31
|
+
|
32
|
+
* Fixed a NoMethodError in SDL.WaitEvent().
|
33
|
+
|
34
|
+
* Ruby-SDL-FFI now uses FFI::Buffer instead of FFI::MemoryPointer in
|
35
|
+
many places. This should give a slight performance boost on JRuby,
|
36
|
+
and potentially other platforms.
|
37
|
+
|
38
|
+
|
39
|
+
|
3
40
|
== Ruby-SDL-FFI 0.2
|
4
41
|
|
5
42
|
* The values of SDL::AUDIO_U16SYS and SDL::AUDIO_S16SYS are now
|
@@ -18,7 +55,6 @@
|
|
18
55
|
|
19
56
|
|
20
57
|
|
21
|
-
|
22
58
|
== Ruby-SDL-FFI 0.1
|
23
59
|
|
24
60
|
* Initial release of Ruby-SDL-FFI. Bindings are provided for these
|
data/README.rdoc
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
|
2
2
|
= Ruby-SDL-FFI
|
3
3
|
|
4
|
-
Version:: 0.
|
5
|
-
Date::
|
4
|
+
Version:: 0.3
|
5
|
+
Date:: 2010-08-08
|
6
6
|
|
7
7
|
Homepage:: http://github.com/jacius/ruby-sdl-ffi/
|
8
8
|
Author:: John Croisant <jacius@gmail.com>
|
9
|
-
Copyright:: 2009 John Croisant
|
9
|
+
Copyright:: 2009, 2010 John Croisant
|
10
10
|
|
11
11
|
|
12
12
|
== Description
|
@@ -31,7 +31,7 @@ libraries (Rubygame [4], Gosu [5], etc.).
|
|
31
31
|
|
32
32
|
== Caveats
|
33
33
|
|
34
|
-
Ruby-SDL-FFI is still in
|
34
|
+
Ruby-SDL-FFI is still in EARLY DEVELOPMENT STAGES. That means:
|
35
35
|
|
36
36
|
* It may not work correctly (or at all).
|
37
37
|
* It may not be complete.
|
@@ -62,7 +62,7 @@ Ruby-SDL-FFI may work with older versions, but hasn't been tried on them.
|
|
62
62
|
|
63
63
|
Ruby-SDL-FFI is licensed under the following terms (the "MIT License"):
|
64
64
|
|
65
|
-
Copyright (c) 2009 John Croisant
|
65
|
+
Copyright (c) 2009, 2010 John Croisant
|
66
66
|
|
67
67
|
Permission is hereby granted, free of charge, to any person obtaining
|
68
68
|
a copy of this software and associated documentation files (the
|
data/lib/ruby-sdl-ffi.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
#
|
5
5
|
# Ruby-SDL-FFI - Ruby-FFI bindings to SDL
|
6
6
|
#
|
7
|
-
# Copyright (c) 2009 John Croisant
|
7
|
+
# Copyright (c) 2009, 2010 John Croisant
|
8
8
|
#
|
9
9
|
# Permission is hereby granted, free of charge, to any person obtaining
|
10
10
|
# a copy of this software and associated documentation files (the
|
@@ -54,11 +54,11 @@ module SDL
|
|
54
54
|
SDL::Surface.typed_pointer
|
55
55
|
|
56
56
|
func :__rotozoomSurfaceSize, :rotozoomSurfaceSize,
|
57
|
-
[ :int, :int, :double, :double, :
|
57
|
+
[ :int, :int, :double, :double, :buffer_out, :buffer_out ], :void
|
58
58
|
|
59
59
|
def self.rotozoomSurfaceSize( width, height, angle, zoom )
|
60
|
-
w = FFI::
|
61
|
-
h = FFI::
|
60
|
+
w = FFI::Buffer.new( :int )
|
61
|
+
h = FFI::Buffer.new( :int )
|
62
62
|
__rotozoomSurfaceSize( width, height, angle, zoom, w, h )
|
63
63
|
return [w.get_int(0), h.get_int(0)]
|
64
64
|
end
|
@@ -70,11 +70,11 @@ module SDL
|
|
70
70
|
|
71
71
|
func :__rotozoomSurfaceSizeXY, :rotozoomSurfaceSizeXY,
|
72
72
|
[ :int, :int, :double, :double, :double,
|
73
|
-
:
|
73
|
+
:buffer_out, :buffer_out ], :void
|
74
74
|
|
75
75
|
def self.rotozoomSurfaceSizeXY( width, height, angle, zoomx, zoomy )
|
76
|
-
w = FFI::
|
77
|
-
h = FFI::
|
76
|
+
w = FFI::Buffer.new( :int )
|
77
|
+
h = FFI::Buffer.new( :int )
|
78
78
|
__rotozoomSurfaceSizeXY( width, height, angle, zoomx, zoomy, w, h )
|
79
79
|
return [w.get_int(0), h.get_int(0)]
|
80
80
|
end
|
@@ -86,11 +86,11 @@ module SDL
|
|
86
86
|
|
87
87
|
|
88
88
|
func :__zoomSurfaceSize, :zoomSurfaceSize,
|
89
|
-
[ :int, :int, :double, :double, :
|
89
|
+
[ :int, :int, :double, :double, :buffer_out, :buffer_out ], :void
|
90
90
|
|
91
91
|
def self.zoomSurfaceSize( width, height, zoomx, zoomy )
|
92
|
-
w = FFI::
|
93
|
-
h = FFI::
|
92
|
+
w = FFI::Buffer.new( :int )
|
93
|
+
h = FFI::Buffer.new( :int )
|
94
94
|
__zoomSurfaceSize( width, height, zoomx, zoomy, w, h )
|
95
95
|
return [w.get_int(0), h.get_int(0)]
|
96
96
|
end
|
data/lib/ruby-sdl-ffi/sdl.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
#
|
5
5
|
# Ruby-SDL-FFI - Ruby-FFI bindings to SDL
|
6
6
|
#
|
7
|
-
# Copyright (c) 2009 John Croisant
|
7
|
+
# Copyright (c) 2009, 2010 John Croisant
|
8
8
|
#
|
9
9
|
# Permission is hereby granted, free of charge, to any person obtaining
|
10
10
|
# a copy of this software and associated documentation files (the
|
@@ -35,13 +35,17 @@ module SDL
|
|
35
35
|
extend NiceFFI::Library
|
36
36
|
|
37
37
|
unless defined? SDL::LOAD_PATHS
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
38
|
+
SDL::LOAD_PATHS = NiceFFI::PathSet::DEFAULT.dup
|
39
|
+
|
40
|
+
rubysdlffi_path = ENV["RUBYSDLFFI_PATH"]
|
41
|
+
if rubysdlffi_path and not rubysdlffi_path.empty?
|
42
|
+
paths = rubysdlffi_path.split( File::PATH_SEPARATOR ).compact
|
43
|
+
SDL::LOAD_PATHS.prepend!(paths)
|
44
|
+
end
|
45
|
+
|
46
|
+
if defined? ::SDL_PATHS
|
47
|
+
SDL::LOAD_PATHS.prepend!(::SDL_PATHS)
|
48
|
+
end
|
45
49
|
end
|
46
50
|
|
47
51
|
load_library "SDL", SDL::LOAD_PATHS
|
@@ -59,6 +63,7 @@ this_dir = File.expand_path( File.dirname(__FILE__) )
|
|
59
63
|
# because event and mouse depend on them, respectively.
|
60
64
|
|
61
65
|
%w{
|
66
|
+
mac
|
62
67
|
core
|
63
68
|
keyboard
|
64
69
|
video
|
@@ -91,12 +91,13 @@ module SDL
|
|
91
91
|
# end
|
92
92
|
|
93
93
|
|
94
|
-
sdl_func :AudioInit, [ :string
|
95
|
-
sdl_func :AudioQuit, [
|
96
|
-
sdl_func :OpenAudio, [ :
|
94
|
+
sdl_func :AudioInit, [ :string ], :int
|
95
|
+
sdl_func :AudioQuit, [ ], :void
|
96
|
+
sdl_func :OpenAudio, [ :buffer_in, :buffer_out ], :int
|
97
97
|
|
98
98
|
|
99
|
-
func :__AudioDriverName, "SDL_AudioDriverName",
|
99
|
+
func :__AudioDriverName, "SDL_AudioDriverName",
|
100
|
+
[:buffer_out, :int], :pointer
|
100
101
|
|
101
102
|
def self.AudioDriverName
|
102
103
|
b = FFI::Buffer.new(:char, 1024)
|
@@ -310,10 +310,10 @@ module SDL
|
|
310
310
|
end
|
311
311
|
|
312
312
|
|
313
|
-
func :__SDL_PollEvent, "SDL_PollEvent", [ :
|
313
|
+
func :__SDL_PollEvent, "SDL_PollEvent", [ :buffer_out ], :int
|
314
314
|
|
315
315
|
def self.PollEvent()
|
316
|
-
mp = FFI::
|
316
|
+
mp = FFI::Buffer.new( SDL::Event, 1 )
|
317
317
|
n = __SDL_PollEvent( mp )
|
318
318
|
if n == 0
|
319
319
|
nil
|
@@ -323,24 +323,24 @@ module SDL
|
|
323
323
|
end
|
324
324
|
|
325
325
|
|
326
|
-
func :__SDL_WaitEvent, "SDL_WaitEvent", [ :
|
326
|
+
func :__SDL_WaitEvent, "SDL_WaitEvent", [ :buffer_out ], :int
|
327
327
|
|
328
328
|
def self.WaitEvent()
|
329
|
-
mp = FFI::
|
329
|
+
mp = FFI::Buffer.new( SDL::Event, 1 )
|
330
330
|
n = __SDL_WaitEvent( mp )
|
331
331
|
if n == 0
|
332
332
|
nil
|
333
333
|
else
|
334
|
-
|
334
|
+
Event.new(mp).unwrap
|
335
335
|
end
|
336
336
|
end
|
337
337
|
|
338
338
|
|
339
|
-
sdl_func :PushEvent, [ :
|
339
|
+
sdl_func :PushEvent, [ :buffer_in ], :int
|
340
340
|
|
341
341
|
|
342
342
|
|
343
|
-
callback(:eventfilter_cb, [ :
|
343
|
+
callback(:eventfilter_cb, [ :buffer_out ], :int)
|
344
344
|
|
345
345
|
func :__SDL_SetEventFilter, "SDL_SetEventFilter",
|
346
346
|
[ :eventfilter_cb ], :void
|
@@ -47,13 +47,23 @@ module SDL
|
|
47
47
|
DEFAULT_REPEAT_INTERVAL = 30
|
48
48
|
|
49
49
|
sdl_func :EnableKeyRepeat, [ :int, :int ], :int
|
50
|
-
sdl_func :GetKeyRepeat, [ :pointer, :pointer ], :void
|
51
50
|
|
52
51
|
|
53
|
-
func :
|
52
|
+
func :__SDL_GetKeyRepeat, "SDL_GetKeyRepeat",
|
53
|
+
[ :buffer_out, :buffer_out ], :void
|
54
|
+
|
55
|
+
def self.GetKeyRepeat()
|
56
|
+
delay = FFI::Buffer.new( :int )
|
57
|
+
interval = FFI::Buffer.new( :int )
|
58
|
+
__SDL_GetKeyRepeat( delay, interval )
|
59
|
+
return [delay.get_int(0), interval.get_int(0)]
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
func :__SDL_GetKeyState, "SDL_GetKeyState", [ :buffer_out ], :pointer
|
54
64
|
|
55
65
|
def self.GetKeyState()
|
56
|
-
numkeys = FFI::
|
66
|
+
numkeys = FFI::Buffer.new( :int )
|
57
67
|
keys = __SDL_GetKeyState( numkeys )
|
58
68
|
return keys.get_array_of_uint8( 0, numkeys.get_int(0) )
|
59
69
|
end
|
@@ -0,0 +1,437 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# This file is one part of:
|
4
|
+
#
|
5
|
+
# Ruby-SDL-FFI - Ruby-FFI bindings to SDL
|
6
|
+
#
|
7
|
+
# Copyright (c) 2010 John Croisant
|
8
|
+
#
|
9
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
10
|
+
# a copy of this software and associated documentation files (the
|
11
|
+
# "Software"), to deal in the Software without restriction, including
|
12
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
13
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
14
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
15
|
+
# the following conditions:
|
16
|
+
#
|
17
|
+
# The above copyright notice and this permission notice shall be
|
18
|
+
# included in all copies or substantial portions of the Software.
|
19
|
+
#
|
20
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
21
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
23
|
+
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
24
|
+
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
25
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
26
|
+
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27
|
+
#
|
28
|
+
#++
|
29
|
+
|
30
|
+
#--
|
31
|
+
# Some bindings to Mac OS X system framework to allow Ruby-SDL-FFI
|
32
|
+
# to create a window on Mac without a special Ruby interpreter (rsdl).
|
33
|
+
# These are for internal use only. They are NOT part of the API.
|
34
|
+
#
|
35
|
+
# Eternal thanks to erisdiscord and jlnr for pointing the way!
|
36
|
+
|
37
|
+
|
38
|
+
# Only define this stuff if running on a Mac and not using rsdl and
|
39
|
+
# the RUBYSDLFFI_NOCOCOA environment variable is not true-ish.
|
40
|
+
if FFI::Platform.mac? and ($0 != "rsdl") and \
|
41
|
+
not (/^(1|t|true|y|yes)$/i =~ ENV["RUBYSDLFFI_NOCOCOA"])
|
42
|
+
|
43
|
+
module SDL::Mac
|
44
|
+
|
45
|
+
class << self
|
46
|
+
|
47
|
+
def make_menus( app_name )
|
48
|
+
ptr = FFI.find_type(:pointer)
|
49
|
+
|
50
|
+
nsapp = Cocoa.NSApp
|
51
|
+
menubar = Cocoa::NSMenu.new.initWithTitle("AMainMenu")
|
52
|
+
nsapp.msg( "setMainMenu:", ptr, menubar )
|
53
|
+
|
54
|
+
remove_bold_menu( nsapp, menubar )
|
55
|
+
make_app_menu( menubar, app_name )
|
56
|
+
make_window_menu( nsapp, menubar )
|
57
|
+
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
def set_app_name( app_name )
|
63
|
+
ptr = FFI.find_type(:pointer)
|
64
|
+
|
65
|
+
if @appmenuitem
|
66
|
+
@appmenuitem.title = app_name
|
67
|
+
@hideitem.title = "Hide #{app_name}" if @hideitem
|
68
|
+
@quititem.title = "Quit #{app_name}" if @quititem
|
69
|
+
else
|
70
|
+
make_menus( app_name )
|
71
|
+
end
|
72
|
+
|
73
|
+
nil
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
# Hack to remove the bold "ruby" menu (aka the "Apple" menu).
|
80
|
+
# It's a ghost menu, it haunts us but can't be modified.
|
81
|
+
def remove_bold_menu( nsapp, menubar )
|
82
|
+
item = Cocoa::NSMenuItem.new.initWithTitle("AppleMenu")
|
83
|
+
menu = Cocoa::NSMenu.new.initWithTitle("AppleMenu")
|
84
|
+
item.submenu = menu
|
85
|
+
|
86
|
+
nsapp.msg("setAppleMenu:", FFI.find_type(:pointer), menu)
|
87
|
+
menubar.addItem(item)
|
88
|
+
menubar.removeItem(item)
|
89
|
+
|
90
|
+
item.release
|
91
|
+
menu.release
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
# Create the main menu with the app's name (Hide, Quit, etc.)
|
96
|
+
def make_app_menu( menubar, app_name )
|
97
|
+
item = Cocoa::NSMenuItem.new.initWithTitle( app_name )
|
98
|
+
menu = Cocoa::NSMenu.new.initWithTitle( app_name )
|
99
|
+
item.submenu = menu
|
100
|
+
menubar.addItem(item)
|
101
|
+
|
102
|
+
@hideitem = menu.addItemWithTitle("Hide #{app_name}", "hide:")
|
103
|
+
menu.addItemWithTitle("Hide Others", "hideOtherApplications:")
|
104
|
+
menu.addItemWithTitle("Show All", "unhideAllApplications:")
|
105
|
+
|
106
|
+
# Can't get the Quit menu item to work right yet.
|
107
|
+
# menu.addItem( Cocoa::NSMenuItem.separatorItem )
|
108
|
+
# @quititem = menu.addItemWithTitle("Quit #{app_name}", "terminate:")
|
109
|
+
|
110
|
+
@appmenuitem = item
|
111
|
+
menu.release
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
# Create the "Window" menu (Minimize, etc.)
|
116
|
+
def make_window_menu( nsapp, menubar )
|
117
|
+
ptr = FFI.find_type(:pointer)
|
118
|
+
|
119
|
+
item = Cocoa::NSMenuItem.new.initWithTitle("Window")
|
120
|
+
menu = Cocoa::NSMenu.new.initWithTitle("Window")
|
121
|
+
item.submenu = menu
|
122
|
+
menubar.addItem(item)
|
123
|
+
nsapp.msg("setWindowsMenu:", ptr, menu)
|
124
|
+
|
125
|
+
menu.addItemWithTitle("Minimize", "performMiniaturize:")
|
126
|
+
|
127
|
+
item.release
|
128
|
+
menu.release
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
def inspect_menu( menu, indent="" )
|
133
|
+
puts "%s-%s (%s \"%s\", %d items)"%[indent, menu, menu.classname,
|
134
|
+
menu.title, menu.length]
|
135
|
+
menu.each do |ob|
|
136
|
+
if ob.hasSubmenu?
|
137
|
+
inspect_menu( ob.submenu, indent+" " )
|
138
|
+
else
|
139
|
+
puts "%s -%s (%s \"%s\")"%[indent, ob, ob.classname, ob.title]
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
146
|
+
|
147
|
+
module ObjC
|
148
|
+
extend NiceFFI::Library
|
149
|
+
load_library 'objc'
|
150
|
+
|
151
|
+
typedef :pointer, :id
|
152
|
+
typedef :pointer, :sel
|
153
|
+
typedef :pointer, :ivar
|
154
|
+
typedef :pointer, :nsclass
|
155
|
+
callback :imp, [:id, :sel, :varargs], :id
|
156
|
+
|
157
|
+
|
158
|
+
class NSObject < NiceFFI::OpaqueStruct
|
159
|
+
def self.nsclassname; name.split("::")[-1]; end
|
160
|
+
|
161
|
+
# define msg, msg_ptr, msg_str, msg_int, msg_bool (and class methods)
|
162
|
+
["", "_ptr", "_str", "_int", "_bool"].each do |suffix|
|
163
|
+
module_eval("
|
164
|
+
def msg#{suffix}( message, *args )
|
165
|
+
ObjC.msgSend#{suffix}( @pointer, message, *args )
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.msg#{suffix}( message, *args )
|
169
|
+
ObjC.msgSend#{suffix}( ObjC.NSClass(self.nsclassname),
|
170
|
+
message, *args )
|
171
|
+
end")
|
172
|
+
end
|
173
|
+
|
174
|
+
def inspect; msg_str("description").to_s; end
|
175
|
+
def nsclassname; ObjC.object_getClassName(@pointer); end
|
176
|
+
def release; msg("release"); end
|
177
|
+
end
|
178
|
+
|
179
|
+
def self.NSObject( *args )
|
180
|
+
NSObject.new( *args )
|
181
|
+
end
|
182
|
+
|
183
|
+
|
184
|
+
class NSClass < NSObject
|
185
|
+
def initialize( str_or_ptr )
|
186
|
+
if str_or_ptr.is_a? String
|
187
|
+
super( ObjC.getClass(str_or_ptr) )
|
188
|
+
else
|
189
|
+
super
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def self.NSClass( *args )
|
195
|
+
NSClass.new( *args )
|
196
|
+
end
|
197
|
+
|
198
|
+
|
199
|
+
class NSString < NSObject
|
200
|
+
def initialize( str_or_ptr )
|
201
|
+
if str_or_ptr.is_a? String
|
202
|
+
super( ObjC::NSClass("NSString").\
|
203
|
+
msg_ptr("stringWithUTF8String:",
|
204
|
+
FFI.find_type(:string), str_or_ptr) )
|
205
|
+
else
|
206
|
+
super
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def to_s
|
211
|
+
str = msg_ptr( "UTF8String" )
|
212
|
+
(str.null?) ? "(NULL)" : str.read_string()
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def self.NSString( *args )
|
217
|
+
NSString.new( *args )
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
func :__msgSend, :objc_msgSend, [:id, :sel, :varargs], :id
|
222
|
+
func :__msgSend_int, :objc_msgSend, [:id, :sel, :varargs], :long
|
223
|
+
|
224
|
+
def self.msgSend( id, selector, *args )
|
225
|
+
selector = self.sel(selector) if selector.is_a? String
|
226
|
+
NSObject.new( __msgSend( id, selector, *args ) )
|
227
|
+
end
|
228
|
+
def self.msgSend_ptr( id, selector, *args )
|
229
|
+
selector = self.sel(selector) if selector.is_a? String
|
230
|
+
__msgSend( id, selector, *args )
|
231
|
+
end
|
232
|
+
def self.msgSend_str( id, selector, *args )
|
233
|
+
selector = self.sel(selector) if selector.is_a? String
|
234
|
+
NSString.new( __msgSend( id, selector, *args ) )
|
235
|
+
end
|
236
|
+
def self.msgSend_int( id, selector, *args )
|
237
|
+
selector = self.sel(selector) if selector.is_a? String
|
238
|
+
__msgSend_int( id, selector, *args )
|
239
|
+
end
|
240
|
+
def self.msgSend_bool( id, selector, *args )
|
241
|
+
selector = self.sel(selector) if selector.is_a? String
|
242
|
+
( __msgSend_int( id, selector, *args ) == 0 ) ? false : true
|
243
|
+
end
|
244
|
+
|
245
|
+
func :getClass, :objc_getClass, [:string], :id
|
246
|
+
func :class_replaceMethod, [:nsclass, :sel, :imp, :string], :imp
|
247
|
+
|
248
|
+
func :object_getClassName, [:id], :string
|
249
|
+
func :object_getInstanceVariable, [:id, :string, :pointer], :ivar
|
250
|
+
func :object_setInstanceVariable, [:id, :string, :pointer], :ivar
|
251
|
+
|
252
|
+
func :sel_registerName, [:string], :sel
|
253
|
+
func :sel_getName, [:sel], :string
|
254
|
+
|
255
|
+
def self.sel( name )
|
256
|
+
sel_registerName( name.to_s )
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
|
261
|
+
|
262
|
+
module Cocoa
|
263
|
+
extend NiceFFI::Library
|
264
|
+
load_library '/System/Library/Frameworks/Cocoa.framework/Cocoa'
|
265
|
+
|
266
|
+
func :NSApplicationLoad, [], :bool
|
267
|
+
|
268
|
+
func :NSPushAutoreleasePool, [], :void
|
269
|
+
func :NSPopAutoreleasePool, [], :void
|
270
|
+
|
271
|
+
NSApplicationLoad()
|
272
|
+
NSPushAutoreleasePool()
|
273
|
+
|
274
|
+
def self.NSApp
|
275
|
+
@nsapp ||= ObjC::NSClass("NSApplication").msg("sharedApplication")
|
276
|
+
end
|
277
|
+
|
278
|
+
class NSMenu < ObjC::NSObject
|
279
|
+
include Enumerable
|
280
|
+
|
281
|
+
def initialize( *args )
|
282
|
+
if args.empty?
|
283
|
+
super( ObjC::NSClass("NSMenu").msg_ptr("alloc") )
|
284
|
+
else
|
285
|
+
super( args[0] )
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def initWithTitle( title )
|
290
|
+
msg( "initWithTitle:", FFI.find_type(:pointer), ObjC::NSString(title) )
|
291
|
+
self
|
292
|
+
end
|
293
|
+
|
294
|
+
def title
|
295
|
+
msg_str("title")
|
296
|
+
end
|
297
|
+
|
298
|
+
def title=( t )
|
299
|
+
msg("setTitle:", FFI.find_type(:pointer), ObjC::NSString(t))
|
300
|
+
end
|
301
|
+
|
302
|
+
def addItem( item )
|
303
|
+
msg("addItem:", FFI.find_type(:pointer), item)
|
304
|
+
self
|
305
|
+
end
|
306
|
+
|
307
|
+
def addItemWithTitle( title, action=nil, keyEquivalent="" )
|
308
|
+
ptr = FFI.find_type(:pointer)
|
309
|
+
action = ObjC.sel(action) if action.is_a? String
|
310
|
+
item = msg_ptr( "addItemWithTitle:action:keyEquivalent:",
|
311
|
+
ptr, ObjC::NSString(title),
|
312
|
+
ptr, action,
|
313
|
+
ptr, ObjC::NSString(keyEquivalent))
|
314
|
+
NSMenuItem.new(item)
|
315
|
+
end
|
316
|
+
|
317
|
+
def removeItem( item )
|
318
|
+
msg("removeItem:", FFI.find_type(:pointer), item)
|
319
|
+
self
|
320
|
+
end
|
321
|
+
|
322
|
+
def removeItemAtIndex( index )
|
323
|
+
msg("removeItemAtIndex:", FFI.find_type(:long), index)
|
324
|
+
self
|
325
|
+
end
|
326
|
+
|
327
|
+
def length
|
328
|
+
msg_int( "numberOfItems" )
|
329
|
+
end
|
330
|
+
|
331
|
+
def [](index)
|
332
|
+
Cocoa::NSMenuItem( msg_ptr("itemAtIndex:", FFI.find_type(:long), index) )
|
333
|
+
end
|
334
|
+
|
335
|
+
def each
|
336
|
+
length.times{ |i| yield self[i] }
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
def self.NSMenu( *args )
|
341
|
+
NSMenu.new( *args )
|
342
|
+
end
|
343
|
+
|
344
|
+
|
345
|
+
class NSMenuItem < ObjC::NSObject
|
346
|
+
def self.separatorItem
|
347
|
+
new( msg_ptr("separatorItem") )
|
348
|
+
end
|
349
|
+
|
350
|
+
def initialize( *args )
|
351
|
+
if args.empty?
|
352
|
+
super( ObjC::NSClass("NSMenuItem").msg_ptr("alloc") )
|
353
|
+
else
|
354
|
+
super( args[0] )
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
def initWithTitle( title, action=nil, keyEquivalent="" )
|
359
|
+
ptr = FFI.find_type(:pointer)
|
360
|
+
action = ObjC.sel(action) if action.is_a? String
|
361
|
+
msg( "initWithTitle:action:keyEquivalent:",
|
362
|
+
ptr, ObjC::NSString(title),
|
363
|
+
ptr, action,
|
364
|
+
ptr, ObjC::NSString(keyEquivalent))
|
365
|
+
self
|
366
|
+
end
|
367
|
+
|
368
|
+
def title
|
369
|
+
msg_str("title")
|
370
|
+
end
|
371
|
+
|
372
|
+
def title=( t )
|
373
|
+
msg("setTitle:", FFI.find_type(:pointer), ObjC::NSString(t))
|
374
|
+
end
|
375
|
+
|
376
|
+
def hasSubmenu?
|
377
|
+
msg_bool("hasSubmenu")
|
378
|
+
end
|
379
|
+
|
380
|
+
def submenu
|
381
|
+
Cocoa::NSMenu( msg_ptr("submenu") ) if hasSubmenu?
|
382
|
+
end
|
383
|
+
|
384
|
+
def submenu=( menu )
|
385
|
+
msg("setSubmenu:", FFI.find_type(:pointer), menu)
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
def self.NSMenuItem( *args )
|
390
|
+
NSMenuItem.new( *args )
|
391
|
+
end
|
392
|
+
|
393
|
+
|
394
|
+
attach_variable "vNSNibOwner", "NSNibOwner", :pointer
|
395
|
+
NSNibOwner =
|
396
|
+
ObjC::NSString( ObjC::NSString(self.vNSNibOwner).to_s )
|
397
|
+
|
398
|
+
attach_variable "vNSNibTopLevelObjects", "NSNibTopLevelObjects", :pointer
|
399
|
+
NSNibTopLevelObjects =
|
400
|
+
ObjC::NSString( ObjC::NSString(self.vNSNibTopLevelObjects).to_s )
|
401
|
+
|
402
|
+
NSAlphaShiftKeyMask = 1 << 16
|
403
|
+
NSShiftKeyMask = 1 << 17
|
404
|
+
NSControlKeyMask = 1 << 18
|
405
|
+
NSAlternateKeyMask = 1 << 19
|
406
|
+
NSCommandKeyMask = 1 << 20
|
407
|
+
NSNumericPadKeyMask = 1 << 21
|
408
|
+
NSHelpKeyMask = 1 << 22
|
409
|
+
NSFunctionKeyMask = 1 << 23
|
410
|
+
end
|
411
|
+
|
412
|
+
|
413
|
+
module HIServices
|
414
|
+
extend NiceFFI::Library
|
415
|
+
load_library '/System/Library/Frameworks/ApplicationServices.framework/Frameworks/HIServices.framework/HIServices'
|
416
|
+
|
417
|
+
class ProcessSerialNumber < NiceFFI::Struct
|
418
|
+
layout :highLongOfPSN, :ulong, :lowLongOfPSN, :ulong
|
419
|
+
end
|
420
|
+
|
421
|
+
# Some relevant constants (but not part of the same enum)
|
422
|
+
KCurrentProcess = 2
|
423
|
+
KProcessTransformToForegroundApplication = 1
|
424
|
+
|
425
|
+
func :TransformProcessType, [:pointer, :long], :long
|
426
|
+
func :SetFrontProcess, [:pointer], :long
|
427
|
+
|
428
|
+
# Does the magic to make the current process a front process.
|
429
|
+
def self.make_current_front
|
430
|
+
current = ProcessSerialNumber.new( [0, KCurrentProcess] )
|
431
|
+
TransformProcessType(current,KProcessTransformToForegroundApplication)
|
432
|
+
SetFrontProcess( current )
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
end
|
437
|
+
end
|
@@ -49,29 +49,29 @@ module SDL
|
|
49
49
|
end
|
50
50
|
|
51
51
|
func :__SDL_GetMouseState, "SDL_GetMouseState",
|
52
|
-
[ :
|
52
|
+
[ :buffer_out, :buffer_out ], :uint8
|
53
53
|
|
54
54
|
# Returns [buttons, x, y].
|
55
55
|
# buttons: buttons currently pressed (bitmask of BUTTON_*MASK constants).
|
56
56
|
# x, y: current position of the mouse cursor.
|
57
57
|
def self.GetMouseState()
|
58
|
-
xmp = FFI::
|
59
|
-
ymp = FFI::
|
58
|
+
xmp = FFI::Buffer.new( :int )
|
59
|
+
ymp = FFI::Buffer.new( :int )
|
60
60
|
buttons = __SDL_GetMouseState( xmp, ymp )
|
61
61
|
return [buttons, xmp.get_int(0), ymp.get_int(0)]
|
62
62
|
end
|
63
63
|
|
64
64
|
|
65
65
|
func :__SDL_GetRelativeMouseState, "SDL_GetRelativeMouseState",
|
66
|
-
[ :
|
66
|
+
[ :buffer_out, :buffer_out ], :uint8
|
67
67
|
|
68
68
|
# Returns [buttons, x, y].
|
69
69
|
# buttons: buttons currently pressed (bitmask of BUTTON_*MASK constants).
|
70
70
|
# x, y: movement of the mouse cursor since last call of this method.
|
71
71
|
#
|
72
72
|
def self.GetRelativeMouseState()
|
73
|
-
xmp = FFI::
|
74
|
-
ymp = FFI::
|
73
|
+
xmp = FFI::Buffer.new( :int )
|
74
|
+
ymp = FFI::Buffer.new( :int )
|
75
75
|
buttons = __SDL_GetRelativeMouseState( xmp, ymp )
|
76
76
|
return [buttons, xmp.get_int(0), ymp.get_int(0)]
|
77
77
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
#
|
5
5
|
# Ruby-SDL-FFI - Ruby-FFI bindings to SDL
|
6
6
|
#
|
7
|
-
# Copyright (c) 2009 John Croisant
|
7
|
+
# Copyright (c) 2009, 2010 John Croisant
|
8
8
|
#
|
9
9
|
# Permission is hereby granted, free of charge, to any person obtaining
|
10
10
|
# a copy of this software and associated documentation files (the
|
@@ -50,11 +50,30 @@ module SDL
|
|
50
50
|
|
51
51
|
end
|
52
52
|
|
53
|
+
|
53
54
|
class Palette < NiceFFI::Struct
|
54
55
|
layout( :ncolors, :int,
|
55
56
|
:colors, :pointer )
|
57
|
+
|
58
|
+
include Enumerable
|
59
|
+
|
60
|
+
# Returns the color at the given index in the palette, as an
|
61
|
+
# SDL::Color instance.
|
62
|
+
def at( index )
|
63
|
+
index = (0...ncolors).to_a.at(index)
|
64
|
+
if index
|
65
|
+
SDL::Color.new( self[:colors] + index * SDL::Color.size )
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Yields an SDL::Color for each color in the palette.
|
70
|
+
def each
|
71
|
+
ncolors.times{ |i| yield at(i) }
|
72
|
+
end
|
73
|
+
|
56
74
|
end
|
57
75
|
|
76
|
+
|
58
77
|
class PixelFormat < NiceFFI::Struct
|
59
78
|
layout( :palette, Palette.typed_pointer,
|
60
79
|
:BitsPerPixel, :uint8,
|
@@ -252,9 +271,40 @@ module SDL
|
|
252
271
|
## Don't know how to implement this one. :-\
|
253
272
|
# sdl_func :ListModes, [ :pointer, :uint32 ], :pointer
|
254
273
|
|
255
|
-
sdl_func :SetVideoMode, [ :int, :int, :int, :uint32 ],
|
256
|
-
SDL::Surface.typed_pointer( :autorelease => false )
|
257
274
|
|
275
|
+
func :__SetVideoMode, "SDL_SetVideoMode", [ :int, :int, :int, :uint32 ],
|
276
|
+
SDL::Surface.typed_pointer( :autorelease => false )
|
277
|
+
|
278
|
+
def self.SetVideoMode( *args )
|
279
|
+
result = __SetVideoMode(*args)
|
280
|
+
if defined? SDL::Mac
|
281
|
+
SDL::Mac::HIServices.make_current_front
|
282
|
+
SDL::Mac.make_menus("ruby")
|
283
|
+
end
|
284
|
+
return result
|
285
|
+
end
|
286
|
+
|
287
|
+
|
288
|
+
# Sets the application name, if the platform supports it. This
|
289
|
+
# method is safe to call even on platforms which do not support it
|
290
|
+
# (but does nothing). Currently this method only has an effect on
|
291
|
+
# Mac OS X.
|
292
|
+
#
|
293
|
+
# The effect of this method depends on the platform. On Mac OS X, it
|
294
|
+
# sets the text used in the main application menu.
|
295
|
+
#
|
296
|
+
# (Note: this method does not correspond to any part of the SDL API.
|
297
|
+
# It communicates with the platform directly.)
|
298
|
+
#
|
299
|
+
# Example:
|
300
|
+
# SDL.set_app_name("SpaceQuest 4000")
|
301
|
+
#
|
302
|
+
def self.set_app_name( app_name )
|
303
|
+
if defined? SDL::Mac
|
304
|
+
SDL::Mac.set_app_name( app_name )
|
305
|
+
end
|
306
|
+
nil
|
307
|
+
end
|
258
308
|
|
259
309
|
|
260
310
|
func :__UpdateRects, "SDL_UpdateRects", [ :pointer, :int, :pointer ], :void
|
@@ -280,7 +330,7 @@ module SDL
|
|
280
330
|
|
281
331
|
|
282
332
|
func :__SDL_GetGammaRamp, "SDL_GetGammaRamp",
|
283
|
-
[ :
|
333
|
+
[ :buffer_out, :buffer_out, :buffer_out ], :int
|
284
334
|
|
285
335
|
def self.GetGammaRamp()
|
286
336
|
rtable = FFI::Buffer.new( :uint16, 256 )
|
@@ -306,12 +356,12 @@ module SDL
|
|
306
356
|
|
307
357
|
|
308
358
|
func :__SDL_GetRGB, "SDL_GetRGB",
|
309
|
-
[ :uint32, :pointer, :
|
359
|
+
[ :uint32, :pointer, :buffer_out, :buffer_out, :buffer_out ], :void
|
310
360
|
|
311
361
|
def self.GetRGB( uint32, format )
|
312
|
-
r = FFI::
|
313
|
-
g = FFI::
|
314
|
-
b = FFI::
|
362
|
+
r = FFI::Buffer.new( :uint8 )
|
363
|
+
g = FFI::Buffer.new( :uint8 )
|
364
|
+
b = FFI::Buffer.new( :uint8 )
|
315
365
|
__SDL_GetRGB( uint32, format, r, g, b )
|
316
366
|
return [r.get_uint8(0), g.get_uint8(0), b.get_uint8(0)]
|
317
367
|
end
|
@@ -319,13 +369,14 @@ module SDL
|
|
319
369
|
|
320
370
|
|
321
371
|
func :__SDL_GetRGBA, "SDL_GetRGBA",
|
322
|
-
[ :uint32, :pointer, :
|
372
|
+
[ :uint32, :pointer, :buffer_out,
|
373
|
+
:buffer_out, :buffer_out, :buffer_out ], :void
|
323
374
|
|
324
375
|
def self.GetRGBA( uint32, format )
|
325
|
-
r = FFI::
|
326
|
-
g = FFI::
|
327
|
-
b = FFI::
|
328
|
-
a = FFI::
|
376
|
+
r = FFI::Buffer.new( :uint8 )
|
377
|
+
g = FFI::Buffer.new( :uint8 )
|
378
|
+
b = FFI::Buffer.new( :uint8 )
|
379
|
+
a = FFI::Buffer.new( :uint8 )
|
329
380
|
__SDL_GetRGBA( uint32, format, r, g, b, a )
|
330
381
|
return [r.get_uint8(0), g.get_uint8(0), b.get_uint8(0), a.get_uint8(0)]
|
331
382
|
end
|
@@ -358,10 +409,10 @@ module SDL
|
|
358
409
|
|
359
410
|
sdl_func :SetClipRect, [ :pointer, :pointer ], SDL::BOOL
|
360
411
|
|
361
|
-
func :__SDL_GetClipRect, "SDL_GetClipRect", [ :pointer, :
|
412
|
+
func :__SDL_GetClipRect, "SDL_GetClipRect", [ :pointer, :buffer_out ], :void
|
362
413
|
|
363
414
|
def self.GetClipRect( surface )
|
364
|
-
mp = FFI::
|
415
|
+
mp = FFI::Buffer.new( Rect )
|
365
416
|
__SDL_GetClipRect( surface, mp )
|
366
417
|
return Rect.new( mp )
|
367
418
|
end
|
@@ -397,15 +448,15 @@ module SDL
|
|
397
448
|
|
398
449
|
|
399
450
|
func :__GL_GetAttribute, "SDL_GL_GetAttribute",
|
400
|
-
[ SDL::GLATTR, :
|
451
|
+
[ SDL::GLATTR, :buffer_out ], :int
|
401
452
|
|
402
453
|
def self.GL_GetAttribute( attrib )
|
403
|
-
|
404
|
-
result = __GL_GetAttribute( attrib,
|
454
|
+
buffer = FFI::Buffer.new( :int )
|
455
|
+
result = __GL_GetAttribute( attrib, buffer )
|
405
456
|
if( result == -1 )
|
406
457
|
return nil
|
407
458
|
else
|
408
|
-
return
|
459
|
+
return buffer.get_int(0)
|
409
460
|
end
|
410
461
|
end
|
411
462
|
|
@@ -420,11 +471,11 @@ module SDL
|
|
420
471
|
sdl_func :WM_SetCaption, [ :string, :string ], :void
|
421
472
|
|
422
473
|
func :__SDL_WM_GetCaption, "SDL_WM_GetCaption",
|
423
|
-
[ :
|
474
|
+
[ :buffer_out, :buffer_out ], :void
|
424
475
|
|
425
476
|
def self.WM_GetCaption()
|
426
|
-
title = FFI::
|
427
|
-
icont = FFI::
|
477
|
+
title = FFI::Buffer.new( :pointer )
|
478
|
+
icont = FFI::Buffer.new( :pointer )
|
428
479
|
__SDL_WM_GetCaption( title, icont )
|
429
480
|
return [ title.get_pointer(0).get_string(0),
|
430
481
|
icont.get_pointer(0).get_string(0) ]
|
data/lib/ruby-sdl-ffi/ttf.rb
CHANGED
@@ -103,15 +103,15 @@ module SDL
|
|
103
103
|
|
104
104
|
|
105
105
|
func :__GlyphMetrics, "TTF_GlyphMetrics",
|
106
|
-
[ :pointer, :uint16, :
|
107
|
-
:
|
106
|
+
[ :pointer, :uint16, :buffer_out, :buffer_out,
|
107
|
+
:buffer_out, :buffer_out, :buffer_out ], :int
|
108
108
|
|
109
109
|
# Returns:: [minx, maxx, miny, maxy, advance], or nil on failure.
|
110
110
|
#
|
111
111
|
def self.GlyphMetrics( font, char )
|
112
|
-
minx, maxx = FFI::
|
113
|
-
miny, maxy = FFI::
|
114
|
-
advance = FFI::
|
112
|
+
minx, maxx = FFI::Buffer.new(:int), FFI::Buffer.new(:int)
|
113
|
+
miny, maxy = FFI::Buffer.new(:int), FFI::Buffer.new(:int)
|
114
|
+
advance = FFI::Buffer.new(:int)
|
115
115
|
result = __GlyphMetrics( font, char, minx, maxx, miny, maxy, advance )
|
116
116
|
if( result == 0 )
|
117
117
|
return [minx.get_int(0), maxx.get_int(0),
|
@@ -124,11 +124,11 @@ module SDL
|
|
124
124
|
|
125
125
|
|
126
126
|
func :__SizeText, "TTF_SizeText",
|
127
|
-
[ :pointer, :string, :
|
127
|
+
[ :pointer, :string, :buffer_out, :buffer_out ], :int
|
128
128
|
|
129
129
|
def self.SizeText( font, text )
|
130
|
-
w = FFI::
|
131
|
-
h = FFI::
|
130
|
+
w = FFI::Buffer.new( :int )
|
131
|
+
h = FFI::Buffer.new( :int )
|
132
132
|
__SizeText( font, text, w, h )
|
133
133
|
return [w.get_int(0),h.get_int(0)]
|
134
134
|
end
|
@@ -136,11 +136,11 @@ module SDL
|
|
136
136
|
|
137
137
|
|
138
138
|
func :__SizeUTF8, "TTF_SizeUTF8",
|
139
|
-
[ :pointer, :string, :
|
139
|
+
[ :pointer, :string, :buffer_out, :buffer_out ], :int
|
140
140
|
|
141
141
|
def self.SizeUTF( font, text )
|
142
|
-
w = FFI::
|
143
|
-
h = FFI::
|
142
|
+
w = FFI::Buffer.new( :int )
|
143
|
+
h = FFI::Buffer.new( :int )
|
144
144
|
__SizeUTF( font, text, w, h )
|
145
145
|
return [w.get_int(0),h.get_int(0)]
|
146
146
|
end
|
@@ -148,11 +148,11 @@ module SDL
|
|
148
148
|
|
149
149
|
|
150
150
|
func :__SizeUNICODE, "TTF_SizeUNICODE",
|
151
|
-
[ :pointer, :pointer, :
|
151
|
+
[ :pointer, :pointer, :buffer_out, :buffer_out ], :int
|
152
152
|
|
153
153
|
def self.SizeUNICODE( font, text )
|
154
|
-
w = FFI::
|
155
|
-
h = FFI::
|
154
|
+
w = FFI::Buffer.new( :int )
|
155
|
+
h = FFI::Buffer.new( :int )
|
156
156
|
__SizeUNICODE( font, text, w, h )
|
157
157
|
return [w.get_int(0),h.get_int(0)]
|
158
158
|
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-sdl-ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 13
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
version: "0.3"
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- John Croisant
|
@@ -9,19 +14,24 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2010-08-08 00:00:00 -05:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: nice-ffi
|
17
|
-
|
18
|
-
|
19
|
-
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
20
25
|
requirements:
|
21
26
|
- - ">="
|
22
27
|
- !ruby/object:Gem::Version
|
28
|
+
hash: 15
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
- 2
|
23
32
|
version: "0.2"
|
24
|
-
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
25
35
|
description: |
|
26
36
|
Ruby-SDL-FFI is a low-level binding to SDL and related libraries
|
27
37
|
using Ruby-FFI. It provides very basic access to SDL from
|
@@ -48,6 +58,7 @@ files:
|
|
48
58
|
- lib/ruby-sdl-ffi/sdl/cdrom.rb
|
49
59
|
- lib/ruby-sdl-ffi/sdl/video.rb
|
50
60
|
- lib/ruby-sdl-ffi/sdl/core.rb
|
61
|
+
- lib/ruby-sdl-ffi/sdl/mac.rb
|
51
62
|
- lib/ruby-sdl-ffi/sdl/keysyms.rb
|
52
63
|
- lib/ruby-sdl-ffi/sdl/timer.rb
|
53
64
|
- lib/ruby-sdl-ffi/sdl/audio.rb
|
@@ -72,17 +83,24 @@ rdoc_options: []
|
|
72
83
|
require_paths:
|
73
84
|
- lib
|
74
85
|
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
75
87
|
requirements:
|
76
88
|
- - ">="
|
77
89
|
- !ruby/object:Gem::Version
|
90
|
+
hash: 31
|
91
|
+
segments:
|
92
|
+
- 1
|
93
|
+
- 8
|
78
94
|
version: "1.8"
|
79
|
-
version:
|
80
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
81
97
|
requirements:
|
82
98
|
- - ">="
|
83
99
|
- !ruby/object:Gem::Version
|
100
|
+
hash: 3
|
101
|
+
segments:
|
102
|
+
- 0
|
84
103
|
version: "0"
|
85
|
-
version:
|
86
104
|
requirements:
|
87
105
|
- SDL >= 1.2.13
|
88
106
|
- SDL_image >= 1.2.7 (optional)
|
@@ -90,7 +108,7 @@ requirements:
|
|
90
108
|
- SDL_mixer >= 1.2.8 (optional)
|
91
109
|
- SDL_ttf >= 2.0.9 (optional)
|
92
110
|
rubyforge_project: ruby-sdl-ffi
|
93
|
-
rubygems_version: 1.3.
|
111
|
+
rubygems_version: 1.3.7
|
94
112
|
signing_key:
|
95
113
|
specification_version: 3
|
96
114
|
summary: Ruby-FFI bindings to SDL
|