sdl2-win93 1.0.0
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 +7 -0
- data/.dir-locals.el +2 -0
- data/.github/workflows/gempush.yml +29 -0
- data/.gitignore +14 -0
- data/COPYING.txt +165 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +24 -0
- data/Makefile +4 -0
- data/README.md +36 -0
- data/Rakefile +51 -0
- data/doc/po/ja.po +10357 -0
- data/ext/sdl2_ext/clipboard.c +61 -0
- data/ext/sdl2_ext/color.c +103 -0
- data/ext/sdl2_ext/color.h +4 -0
- data/ext/sdl2_ext/event.c +1298 -0
- data/ext/sdl2_ext/extconf.rb +22 -0
- data/ext/sdl2_ext/filesystem.c +63 -0
- data/ext/sdl2_ext/gamecontroller.c +408 -0
- data/ext/sdl2_ext/gamecontroller.c.m4 +408 -0
- data/ext/sdl2_ext/gl.c +351 -0
- data/ext/sdl2_ext/gl.c.m4 +351 -0
- data/ext/sdl2_ext/hint.c +99 -0
- data/ext/sdl2_ext/joystick.c +339 -0
- data/ext/sdl2_ext/joystick.c.m4 +339 -0
- data/ext/sdl2_ext/key.c +1302 -0
- data/ext/sdl2_ext/key.c.m4 +833 -0
- data/ext/sdl2_ext/main.c +258 -0
- data/ext/sdl2_ext/messagebox.c +233 -0
- data/ext/sdl2_ext/mixer.c +1205 -0
- data/ext/sdl2_ext/mixer.c.m4 +1205 -0
- data/ext/sdl2_ext/mouse.c +286 -0
- data/ext/sdl2_ext/rubysdl2_internal.h +127 -0
- data/ext/sdl2_ext/timer.c +63 -0
- data/ext/sdl2_ext/ttf.c +376 -0
- data/ext/sdl2_ext/ttf.c.m4 +376 -0
- data/ext/sdl2_ext/video.c +4093 -0
- data/ext/sdl2_ext/video.c.m4 +3867 -0
- data/lib/sdl2.rb +3 -0
- data/lib/sdl2/event.rb +55 -0
- data/lib/sdl2/version.rb +8 -0
- data/sample/chunk_destroy.rb +16 -0
- data/sample/gfxprimitives.rb +54 -0
- data/sample/icon.bmp +0 -0
- data/sample/memory_test/m1.rb +28 -0
- data/sample/memory_test/m2.rb +18 -0
- data/sample/memory_test/m3.rb +12 -0
- data/sample/message_box.rb +33 -0
- data/sample/music_player.rb +137 -0
- data/sample/playwave.rb +19 -0
- data/sample/primitives.rb +32 -0
- data/sample/test_clipboard.rb +16 -0
- data/sample/test_controller.rb +62 -0
- data/sample/test_joystick.rb +53 -0
- data/sample/test_keyboard.rb +52 -0
- data/sample/test_mouse.rb +50 -0
- data/sample/test_surface.rb +13 -0
- data/sample/test_ttf.rb +82 -0
- data/sample/test_video.rb +59 -0
- data/sample/testgl.rb +175 -0
- data/sample/testsprite.rb +296 -0
- data/sample/testspriteminimal.rb +75 -0
- data/sample/timer.rb +11 -0
- data/sample/version.rb +12 -0
- data/sample/video_info.rb +64 -0
- data/sdl2-win93.gemspec +31 -0
- metadata +158 -0
@@ -0,0 +1,351 @@
|
|
1
|
+
/* -*- mode: C -*- */
|
2
|
+
#include "rubysdl2_internal.h"
|
3
|
+
#include <SDL_video.h>
|
4
|
+
#include <SDL_version.h>
|
5
|
+
|
6
|
+
static VALUE mGL;
|
7
|
+
static VALUE cGLContext;
|
8
|
+
|
9
|
+
static VALUE current_context = Qnil;
|
10
|
+
|
11
|
+
typedef struct GLContext {
|
12
|
+
SDL_GLContext context;
|
13
|
+
} GLContext;
|
14
|
+
|
15
|
+
DEFINE_WRAPPER(SDL_GLContext, GLContext, context, cGLContext, "SDL2::GL::Context");
|
16
|
+
|
17
|
+
static void GLContext_free(GLContext* c)
|
18
|
+
{
|
19
|
+
if (c->context)
|
20
|
+
SDL_GL_DeleteContext(c->context);
|
21
|
+
free(c);
|
22
|
+
}
|
23
|
+
|
24
|
+
static VALUE GLContext_new(SDL_GLContext context)
|
25
|
+
{
|
26
|
+
GLContext* c = ALLOC(GLContext);
|
27
|
+
c->context = context;
|
28
|
+
return Data_Wrap_Struct(cGLContext, 0, GLContext_free, c);
|
29
|
+
}
|
30
|
+
|
31
|
+
/*
|
32
|
+
* Document-module: SDL2::GL
|
33
|
+
*
|
34
|
+
* This module provides the initialize/shutdown functions of OpenGL.
|
35
|
+
*
|
36
|
+
*/
|
37
|
+
|
38
|
+
/*
|
39
|
+
* Document-class: SDL2::GL::Context
|
40
|
+
*
|
41
|
+
* This class represents an OpenGL context.
|
42
|
+
*
|
43
|
+
* You must create a new OpenGL context before using
|
44
|
+
* OpenGL functions.
|
45
|
+
*
|
46
|
+
* @!method destroy?
|
47
|
+
* Return true if the context is {#destroy destroyed}.
|
48
|
+
*/
|
49
|
+
|
50
|
+
/*
|
51
|
+
* @overload create(window)
|
52
|
+
* Create an OpenGL context for use with an OpenGL window, and make it
|
53
|
+
* current.
|
54
|
+
*
|
55
|
+
* @param window [SDL2::Window] the window associate with a new context
|
56
|
+
* @return [SDL2::GL::Context]
|
57
|
+
*
|
58
|
+
* @see #delete
|
59
|
+
*
|
60
|
+
* @example
|
61
|
+
*
|
62
|
+
* SDL2.init(SDL2::INIT_EVERYTHING)
|
63
|
+
* # You need to create a window with `OPENGL' flag
|
64
|
+
* window = SDL2::Window.create("testgl", 0, 0, WINDOW_W, WINDOW_H,
|
65
|
+
* SDL2::Window::Flags::OPENGL)
|
66
|
+
*
|
67
|
+
* # Create a OpenGL context attached to the window
|
68
|
+
* context = SDL2::GL::Context.create(window)
|
69
|
+
*
|
70
|
+
* # You can use OpenGL functions
|
71
|
+
* :
|
72
|
+
*
|
73
|
+
* # Delete the context after using OpenGL functions
|
74
|
+
* context.destroy
|
75
|
+
*/
|
76
|
+
static VALUE GLContext_s_create(VALUE self, VALUE window)
|
77
|
+
{
|
78
|
+
SDL_GLContext context = SDL_GL_CreateContext(Get_SDL_Window(window));
|
79
|
+
if (!context)
|
80
|
+
SDL_ERROR();
|
81
|
+
|
82
|
+
return (current_context = GLContext_new(context));
|
83
|
+
}
|
84
|
+
|
85
|
+
/*
|
86
|
+
* Delete the OpenGL context.
|
87
|
+
*
|
88
|
+
* @return [nil]
|
89
|
+
*
|
90
|
+
* @see #destroy?
|
91
|
+
*/
|
92
|
+
static VALUE GLContext_destroy(VALUE self)
|
93
|
+
{
|
94
|
+
GLContext* c = Get_GLContext(self);
|
95
|
+
if (c->context)
|
96
|
+
SDL_GL_DeleteContext(c->context);
|
97
|
+
c->context = NULL;
|
98
|
+
return Qnil;
|
99
|
+
}
|
100
|
+
|
101
|
+
/*
|
102
|
+
* @overload make_current(window)
|
103
|
+
* Set the OpenGL context for rendering into an OpenGL window.
|
104
|
+
*
|
105
|
+
* @param window [SDL2::Window] the window to associate with the context
|
106
|
+
* @return [nil]
|
107
|
+
*/
|
108
|
+
static VALUE GLContext_make_current(VALUE self, VALUE window)
|
109
|
+
{
|
110
|
+
HANDLE_ERROR(SDL_GL_MakeCurrent(Get_SDL_Window(window), Get_SDL_GLContext(self)));
|
111
|
+
current_context = self;
|
112
|
+
return Qnil;
|
113
|
+
}
|
114
|
+
|
115
|
+
/*
|
116
|
+
* Get the current OpenGL context.
|
117
|
+
*
|
118
|
+
* @return [SDL2::GL::Context] the curren context
|
119
|
+
* @return [nil] if there is no current context
|
120
|
+
*
|
121
|
+
* @see #make_current
|
122
|
+
*/
|
123
|
+
static VALUE GLContext_s_current(VALUE self)
|
124
|
+
{
|
125
|
+
return current_context;
|
126
|
+
}
|
127
|
+
|
128
|
+
/*
|
129
|
+
* @overload extension_supported?(extension)
|
130
|
+
* Return true if the current context supports **extension**
|
131
|
+
*
|
132
|
+
* @param extension [String] the name of an extension
|
133
|
+
* @example
|
134
|
+
* SDL2::GL.extension_supported?("GL_EXT_framebuffer_blit")
|
135
|
+
*/
|
136
|
+
static VALUE GL_s_extension_supported_p(VALUE self, VALUE extension)
|
137
|
+
{
|
138
|
+
return INT2BOOL(SDL_GL_ExtensionSupported(StringValueCStr(extension)));
|
139
|
+
}
|
140
|
+
|
141
|
+
/*
|
142
|
+
* Get the state of swap interval of the current context.
|
143
|
+
*
|
144
|
+
* @return [Integer]
|
145
|
+
* return 0 when vsync is not used,
|
146
|
+
* return 1 when vsync is used,
|
147
|
+
* and return -1 when vsync is not supported by the system (OS).
|
148
|
+
*
|
149
|
+
*/
|
150
|
+
static VALUE GL_s_swap_interval(VALUE self)
|
151
|
+
{
|
152
|
+
return INT2NUM(SDL_GL_GetSwapInterval());
|
153
|
+
}
|
154
|
+
|
155
|
+
|
156
|
+
/*
|
157
|
+
* @overload swap_interval=(interval)
|
158
|
+
* Set the state of swap interval of the current context.
|
159
|
+
*
|
160
|
+
* @param interval [Integer]
|
161
|
+
* 0 if you don't want to wait for vsync,
|
162
|
+
* 1 if you want to wait for vsync,
|
163
|
+
* -1 if you want to use late swap tearing
|
164
|
+
* @return [nil]
|
165
|
+
*
|
166
|
+
*/
|
167
|
+
static VALUE GL_s_set_swap_interval(VALUE self, VALUE interval)
|
168
|
+
{
|
169
|
+
HANDLE_ERROR(SDL_GL_SetSwapInterval(NUM2INT(interval)));
|
170
|
+
return Qnil;
|
171
|
+
}
|
172
|
+
|
173
|
+
/*
|
174
|
+
* @overload get_attribute(attr)
|
175
|
+
* Get the acutal value for an attribute from current context.
|
176
|
+
*
|
177
|
+
* @param attr [Integer] the OpenGL attribute to query
|
178
|
+
* @return [Integer]
|
179
|
+
*/
|
180
|
+
static VALUE GL_s_get_attribute(VALUE self, VALUE attr)
|
181
|
+
{
|
182
|
+
int value;
|
183
|
+
HANDLE_ERROR(SDL_GL_GetAttribute(NUM2INT(attr), &value));
|
184
|
+
return INT2NUM(value);
|
185
|
+
}
|
186
|
+
|
187
|
+
/*
|
188
|
+
* @overload set_attribute(attr, value)
|
189
|
+
* Set an OpenGL window attribute before window creation.
|
190
|
+
*
|
191
|
+
* @param attr [Integer] the OpenGL attribute to set
|
192
|
+
* @param value [Integer] the desired value for the attribute
|
193
|
+
* @return [value]
|
194
|
+
*/
|
195
|
+
static VALUE GL_s_set_attribute(VALUE self, VALUE attr, VALUE value)
|
196
|
+
{
|
197
|
+
HANDLE_ERROR(SDL_GL_SetAttribute(NUM2INT(attr), NUM2INT(value)));
|
198
|
+
return value;
|
199
|
+
}
|
200
|
+
|
201
|
+
void rubysdl2_init_gl(void)
|
202
|
+
{
|
203
|
+
mGL = rb_define_module_under(mSDL2, "GL");
|
204
|
+
cGLContext = rb_define_class_under(mGL, "Context", rb_cObject);
|
205
|
+
|
206
|
+
rb_define_singleton_method(cGLContext, "create", GLContext_s_create, 1);
|
207
|
+
rb_define_singleton_method(cGLContext, "current", GLContext_s_current, 0);
|
208
|
+
|
209
|
+
rb_define_method(cGLContext, "destroy?", GLContext_destroy_p, 0);
|
210
|
+
rb_define_method(cGLContext, "destroy", GLContext_destroy, 0);
|
211
|
+
rb_define_method(cGLContext, "make_current", GLContext_make_current, 1);
|
212
|
+
|
213
|
+
rb_define_module_function(mGL, "extension_supported?", GL_s_extension_supported_p, 1);
|
214
|
+
rb_define_module_function(mGL, "swap_interval", GL_s_swap_interval, 0);
|
215
|
+
rb_define_module_function(mGL, "swap_interval=", GL_s_set_swap_interval, 1);
|
216
|
+
rb_define_module_function(mGL, "get_attribute", GL_s_get_attribute, 1);
|
217
|
+
rb_define_module_function(mGL, "set_attribute", GL_s_set_attribute, 2);
|
218
|
+
|
219
|
+
/* define(`DEFINE_GL_ATTR_CONST',`rb_define_const(mGL, "$1", INT2NUM(SDL_GL_$1))') */
|
220
|
+
/* OpenGL attribute - minimal bits of red channel in color buffer, default is 3 */
|
221
|
+
DEFINE_GL_ATTR_CONST(RED_SIZE);
|
222
|
+
/* OpenGL attribute - minimal bits of green channel in color buffer, default is 3 */
|
223
|
+
DEFINE_GL_ATTR_CONST(GREEN_SIZE);
|
224
|
+
/* OpenGL attribute - minimal bits of blue channel in color buffer, default is 2 */
|
225
|
+
DEFINE_GL_ATTR_CONST(BLUE_SIZE);
|
226
|
+
/* OpenGL attribute - minimal bits of alpha channel in color buffer, default is 0 */
|
227
|
+
DEFINE_GL_ATTR_CONST(ALPHA_SIZE);
|
228
|
+
/* OpenGL attribute - minimal bits of framebufer, default is 0 */
|
229
|
+
DEFINE_GL_ATTR_CONST(BUFFER_SIZE);
|
230
|
+
/* OpenGL attribute - whether the single buffer (0) or double buffer (1), default
|
231
|
+
is double buffer */
|
232
|
+
DEFINE_GL_ATTR_CONST(DOUBLEBUFFER);
|
233
|
+
/* OpenGL attribute - bits of depth buffer, default is 16 */
|
234
|
+
DEFINE_GL_ATTR_CONST(DEPTH_SIZE);
|
235
|
+
/* OpenGL attribute - bits of stencil buffer, default is 0 */
|
236
|
+
DEFINE_GL_ATTR_CONST(STENCIL_SIZE);
|
237
|
+
/* OpenGL attribute - minimal bits of red channel in accumlation buffer,
|
238
|
+
default is 0 */
|
239
|
+
DEFINE_GL_ATTR_CONST(ACCUM_RED_SIZE);
|
240
|
+
/* OpenGL attribute - minimal bits of green channel in accumlation buffer,
|
241
|
+
default is 0 */
|
242
|
+
DEFINE_GL_ATTR_CONST(ACCUM_GREEN_SIZE);
|
243
|
+
/* OpenGL attribute - minimal bits of blue channel in accumlation buffer,
|
244
|
+
default is 0 */
|
245
|
+
DEFINE_GL_ATTR_CONST(ACCUM_BLUE_SIZE);
|
246
|
+
/* OpenGL attribute - minimal bits of alpha channel in accumlation buffer,
|
247
|
+
default is 0 */
|
248
|
+
DEFINE_GL_ATTR_CONST(ACCUM_ALPHA_SIZE);
|
249
|
+
/* OpenGL attribute - whether output is stereo (1) or not (0), default is 0 */
|
250
|
+
DEFINE_GL_ATTR_CONST(STEREO);
|
251
|
+
/* OpenGL attribuite - the number of buffers used for multisampe anti-aliasing,
|
252
|
+
default is 0 */
|
253
|
+
DEFINE_GL_ATTR_CONST(MULTISAMPLEBUFFERS);
|
254
|
+
/* OpenGL attribute - the number of samples used around the current pixel
|
255
|
+
use for multisample anti-aliasing, default is 0 */
|
256
|
+
DEFINE_GL_ATTR_CONST(MULTISAMPLESAMPLES);
|
257
|
+
/* OpenGL attribute - 1 for requiring hardware acceleration, 0 for software rendering,
|
258
|
+
default is allowing either */
|
259
|
+
DEFINE_GL_ATTR_CONST(ACCELERATED_VISUAL);
|
260
|
+
/* OpenGL attribute - not used (deprecated) */
|
261
|
+
DEFINE_GL_ATTR_CONST(RETAINED_BACKING);
|
262
|
+
/* OpenGL attribute - OpenGL context major version */
|
263
|
+
DEFINE_GL_ATTR_CONST(CONTEXT_MAJOR_VERSION);
|
264
|
+
/* OpenGL attribute - OpenGL context minor version */
|
265
|
+
DEFINE_GL_ATTR_CONST(CONTEXT_MINOR_VERSION);
|
266
|
+
/*
|
267
|
+
* INT2NUM(SDL_GL_CONTEXT_FLAGS):
|
268
|
+
*
|
269
|
+
* OpenGL attribute - the bit combination of following constants, or 0.
|
270
|
+
* default is 0
|
271
|
+
*
|
272
|
+
* * {SDL2::GL::CONTEXT_DEBUG_FLAG}
|
273
|
+
* * {SDL2::GL::CONTEXT_FORWARD_COMPATIBLE_FLAG}
|
274
|
+
* * {SDL2::GL::CONTEXT_ROBUST_ACCESS_FLAG}
|
275
|
+
* * {SDL2::GL::CONTEXT_RESET_ISOLATION_FLAG}
|
276
|
+
*
|
277
|
+
* These flags are mapped to some OpenGL extensions. Please see
|
278
|
+
* the documentation of each constant for more details.
|
279
|
+
*
|
280
|
+
* https://wiki.libsdl.org/SDL_GLcontextFlag
|
281
|
+
*/
|
282
|
+
DEFINE_GL_ATTR_CONST(CONTEXT_FLAGS);
|
283
|
+
/* INT2NUM(SDL_GL_CONTEXT_PROFILE_MASK):
|
284
|
+
*
|
285
|
+
* OpenGL attribute - type of GL context, one of the following constants,
|
286
|
+
* defaults depends on platform
|
287
|
+
*
|
288
|
+
* * {CONTEXT_PROFILE_CORE}
|
289
|
+
* * {CONTEXT_PROFILE_COMPATIBILITY}
|
290
|
+
* * {CONTEXT_PROFILE_ES}
|
291
|
+
*
|
292
|
+
* https://wiki.libsdl.org/SDL_GLprofile
|
293
|
+
*/
|
294
|
+
DEFINE_GL_ATTR_CONST(CONTEXT_PROFILE_MASK);
|
295
|
+
/* OpenGL attribute - OpenGL context sharing, default is 0 */
|
296
|
+
DEFINE_GL_ATTR_CONST(SHARE_WITH_CURRENT_CONTEXT);
|
297
|
+
#if SDL_VERSION_ATLEAST(2,0,1)
|
298
|
+
/* OpenGL attribute - 1 for requesting sRGB capable visual, default to 0 */
|
299
|
+
DEFINE_GL_ATTR_CONST(FRAMEBUFFER_SRGB_CAPABLE);
|
300
|
+
#endif
|
301
|
+
/* OpenGL attribute - not used (deprecated) */
|
302
|
+
DEFINE_GL_ATTR_CONST(CONTEXT_EGL);
|
303
|
+
|
304
|
+
/* define(`DEFINE_GL_CONTEXT_CONST',`rb_define_const(mGL, "CONTEXT_$1", INT2NUM(SDL_GL_CONTEXT_$1))') */
|
305
|
+
|
306
|
+
/* This flag maps to GLX_CONTEXT_DEBUG_BIT_ARB in
|
307
|
+
* the GLX_ARB_create_context extension for X11
|
308
|
+
* and WGL_CONTEXT_DEBUG_BIT_ARB in the WGL_ARB_create_context
|
309
|
+
* extension for Windows.
|
310
|
+
*/
|
311
|
+
DEFINE_GL_CONTEXT_CONST(DEBUG_FLAG);
|
312
|
+
/*
|
313
|
+
* This flag maps to GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB in the
|
314
|
+
* GLX_ARB_create_context extension for X11 and
|
315
|
+
* WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB in the WGL_ARB_create_context
|
316
|
+
* extension for Windows.
|
317
|
+
*/
|
318
|
+
DEFINE_GL_CONTEXT_CONST(FORWARD_COMPATIBLE_FLAG);
|
319
|
+
/*
|
320
|
+
* This flag maps to GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB in the
|
321
|
+
* GLX_ARB_create_context_robustness extension for X11 and
|
322
|
+
* WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB in the WGL_ARB_create_context_robustness
|
323
|
+
* extension for Windows.
|
324
|
+
*/
|
325
|
+
DEFINE_GL_CONTEXT_CONST(ROBUST_ACCESS_FLAG);
|
326
|
+
/*
|
327
|
+
* This flag maps to GLX_CONTEXT_RESET_ISOLATION_BIT_ARB in the
|
328
|
+
* GLX_ARB_robustness_isolation extension for X11 and
|
329
|
+
* WGL_CONTEXT_RESET_ISOLATION_BIT_ARB in the WGL_ARB_create_context_robustness
|
330
|
+
* extension for Windows.
|
331
|
+
*/
|
332
|
+
DEFINE_GL_CONTEXT_CONST(RESET_ISOLATION_FLAG);
|
333
|
+
|
334
|
+
/*
|
335
|
+
* OpenGL core profile - deprecated
|
336
|
+
* functions are disabled
|
337
|
+
*/
|
338
|
+
DEFINE_GL_CONTEXT_CONST(PROFILE_CORE);
|
339
|
+
/*
|
340
|
+
* OpenGL compatibility profile -
|
341
|
+
* deprecated functions are allowed
|
342
|
+
*/
|
343
|
+
DEFINE_GL_CONTEXT_CONST(PROFILE_COMPATIBILITY);
|
344
|
+
/*
|
345
|
+
* OpenGL ES profile - only a subset of the
|
346
|
+
* base OpenGL functionality is available
|
347
|
+
*/
|
348
|
+
DEFINE_GL_CONTEXT_CONST(PROFILE_ES);
|
349
|
+
|
350
|
+
rb_gc_register_address(¤t_context);
|
351
|
+
}
|
data/ext/sdl2_ext/hint.c
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
#include "rubysdl2_internal.h"
|
2
|
+
#include <SDL_hints.h>
|
3
|
+
|
4
|
+
static VALUE sym_priority;
|
5
|
+
|
6
|
+
/*
|
7
|
+
* Document-module: SDL2::Hints
|
8
|
+
*
|
9
|
+
* This module enables you to get and set configuration hints.
|
10
|
+
*
|
11
|
+
*/
|
12
|
+
|
13
|
+
/*
|
14
|
+
* Clear all hints set by {.[]=}.
|
15
|
+
*
|
16
|
+
* @return [nil]
|
17
|
+
*/
|
18
|
+
static VALUE Hints_s_clear(VALUE self)
|
19
|
+
{
|
20
|
+
SDL_ClearHints();
|
21
|
+
return Qnil;
|
22
|
+
}
|
23
|
+
|
24
|
+
/*
|
25
|
+
* @overload [](hint)
|
26
|
+
* Get the value of a hint.
|
27
|
+
*
|
28
|
+
* @param hint [String] the name of the hint to query
|
29
|
+
*
|
30
|
+
* @return [String] the string value of a hint
|
31
|
+
* @return [nil] if the hint isn't set
|
32
|
+
*/
|
33
|
+
static VALUE Hints_s_aref(VALUE self, VALUE name)
|
34
|
+
{
|
35
|
+
const char* value = SDL_GetHint(StringValueCStr(name));
|
36
|
+
if (value)
|
37
|
+
return utf8str_new_cstr(value);
|
38
|
+
else
|
39
|
+
return Qnil;
|
40
|
+
}
|
41
|
+
|
42
|
+
/*
|
43
|
+
* Set the value of a hint.
|
44
|
+
*
|
45
|
+
* @overload []=(hint, value)
|
46
|
+
* Set a hint with normal priority.
|
47
|
+
*
|
48
|
+
* @param hint [String] the name of the hint to query
|
49
|
+
* @param value [String] the value of the hint varaible
|
50
|
+
*
|
51
|
+
* @overload []=(hint, priority: , value)
|
52
|
+
* Set a hint with given priority.
|
53
|
+
*
|
54
|
+
* @param hint [String] the name of the hint to query
|
55
|
+
* @param priority [Integer] the priority, one of the
|
56
|
+
* {DEFAULT}, {NORMAL}, or {OVERRIDE}.
|
57
|
+
* @param value [String] the value of the hint varaible
|
58
|
+
*
|
59
|
+
* @return [Boolean] return true if the hint was set
|
60
|
+
*
|
61
|
+
* @example
|
62
|
+
* SDL2::Hints["SDL_HINT_XINPUT_ENABLED", priority: SDL2::Hints::OVERRIDE] = "0"
|
63
|
+
*
|
64
|
+
*/
|
65
|
+
static VALUE Hints_s_aset(int argc, VALUE* argv, VALUE self)
|
66
|
+
{
|
67
|
+
VALUE name, pri, value;
|
68
|
+
rb_scan_args(argc, argv, "21", &name, &pri, &value);
|
69
|
+
|
70
|
+
if (argc == 2) {
|
71
|
+
value = pri;
|
72
|
+
return INT2BOOL(SDL_SetHint(StringValueCStr(name), StringValueCStr(value)));
|
73
|
+
} else {
|
74
|
+
Check_Type(pri, T_HASH);
|
75
|
+
return INT2BOOL(SDL_SetHintWithPriority(StringValueCStr(name),
|
76
|
+
StringValueCStr(value),
|
77
|
+
NUM2INT(rb_hash_aref(pri, sym_priority))));
|
78
|
+
}
|
79
|
+
|
80
|
+
return Qnil;
|
81
|
+
}
|
82
|
+
|
83
|
+
void rubysdl2_init_hints(void)
|
84
|
+
{
|
85
|
+
VALUE mHints = rb_define_module_under(mSDL2, "Hints");
|
86
|
+
|
87
|
+
rb_define_singleton_method(mHints, "clear", Hints_s_clear, 0);
|
88
|
+
rb_define_singleton_method(mHints, "get", Hints_s_aref, 1);
|
89
|
+
rb_define_singleton_method(mHints, "[]=", Hints_s_aset, -1);
|
90
|
+
|
91
|
+
/* low priority, used fro default values */
|
92
|
+
rb_define_const(mHints, "DEFAULT", INT2NUM(SDL_HINT_DEFAULT));
|
93
|
+
/* medium priority, overrided by an environment variable */
|
94
|
+
rb_define_const(mHints, "NORMAL", INT2NUM(SDL_HINT_NORMAL));
|
95
|
+
/* high priority, this priority overrides the value by environment variables */
|
96
|
+
rb_define_const(mHints, "OVERRIDE", INT2NUM(SDL_HINT_OVERRIDE));
|
97
|
+
|
98
|
+
sym_priority = ID2SYM(rb_intern("priority"));
|
99
|
+
}
|
@@ -0,0 +1,339 @@
|
|
1
|
+
/* -*- mode: C -*- */
|
2
|
+
#include "rubysdl2_internal.h"
|
3
|
+
#include <SDL_joystick.h>
|
4
|
+
#include <SDL_gamecontroller.h>
|
5
|
+
|
6
|
+
static VALUE cJoystick;
|
7
|
+
static VALUE cDeviceInfo;
|
8
|
+
static VALUE mHat;
|
9
|
+
|
10
|
+
typedef struct Joystick {
|
11
|
+
SDL_Joystick* joystick;
|
12
|
+
} Joystick;
|
13
|
+
|
14
|
+
static void Joystick_free(Joystick* j)
|
15
|
+
{
|
16
|
+
if (rubysdl2_is_active() && j->joystick)
|
17
|
+
SDL_JoystickClose(j->joystick);
|
18
|
+
free(j);
|
19
|
+
}
|
20
|
+
|
21
|
+
static VALUE Joystick_new(SDL_Joystick* joystick)
|
22
|
+
{
|
23
|
+
Joystick* j = ALLOC(Joystick);
|
24
|
+
j->joystick = joystick;
|
25
|
+
return Data_Wrap_Struct(cJoystick, 0, Joystick_free, j);
|
26
|
+
}
|
27
|
+
|
28
|
+
DEFINE_WRAPPER(SDL_Joystick, Joystick, joystick, cJoystick, "SDL2::Joystick");
|
29
|
+
|
30
|
+
/*
|
31
|
+
* Document-class: SDL2::Joystick
|
32
|
+
*
|
33
|
+
* This class represents a joystick connected to the machine.
|
34
|
+
*
|
35
|
+
* In order to use joystick subsystem, {SDL2.init} must have been called
|
36
|
+
* with the SDL2::INIT_JOYSTICK flag.
|
37
|
+
*
|
38
|
+
* @!method destroy?
|
39
|
+
* Return true if the device is alread closed.
|
40
|
+
* @see #destroy
|
41
|
+
*/
|
42
|
+
|
43
|
+
/*
|
44
|
+
* Get the number of connected joysticks.
|
45
|
+
*
|
46
|
+
* @return [Integer]
|
47
|
+
*/
|
48
|
+
static VALUE Joystick_s_num_connected_joysticks(VALUE self)
|
49
|
+
{
|
50
|
+
return INT2FIX(HANDLE_ERROR(SDL_NumJoysticks()));
|
51
|
+
}
|
52
|
+
|
53
|
+
static VALUE GUID_to_String(SDL_JoystickGUID guid)
|
54
|
+
{
|
55
|
+
char buf[128];
|
56
|
+
SDL_JoystickGetGUIDString(guid, buf, sizeof(buf));
|
57
|
+
return rb_usascii_str_new_cstr(buf);
|
58
|
+
}
|
59
|
+
|
60
|
+
/*
|
61
|
+
* Get the information of connected joysticks
|
62
|
+
*
|
63
|
+
* @return [Array<SDL2::Joystick::DeviceInfo>] information of connected devices
|
64
|
+
*/
|
65
|
+
static VALUE Joystick_s_devices(VALUE self)
|
66
|
+
{
|
67
|
+
int num_joysticks = SDL_NumJoysticks();
|
68
|
+
int i;
|
69
|
+
VALUE devices = rb_ary_new2(num_joysticks);
|
70
|
+
for (i=0; i<num_joysticks; ++i) {
|
71
|
+
VALUE device = rb_obj_alloc(cDeviceInfo);
|
72
|
+
rb_iv_set(device, "@GUID", GUID_to_String(SDL_JoystickGetDeviceGUID(i)));
|
73
|
+
rb_iv_set(device, "@name", utf8str_new_cstr(SDL_JoystickNameForIndex(i)));
|
74
|
+
rb_ary_push(devices, device);
|
75
|
+
}
|
76
|
+
return devices;
|
77
|
+
}
|
78
|
+
|
79
|
+
/*
|
80
|
+
* @overload open(device_index)
|
81
|
+
* Open a joystick for use.
|
82
|
+
*
|
83
|
+
* @param [Integer] device_index device index
|
84
|
+
* @return [SDL2::Joystick] opended joystick object
|
85
|
+
* @raise [SDL2::Error] raised when device open is failed.
|
86
|
+
* for exmaple, device_index is out of range.
|
87
|
+
*/
|
88
|
+
static VALUE Joystick_s_open(VALUE self, VALUE device_index)
|
89
|
+
{
|
90
|
+
SDL_Joystick* joystick = SDL_JoystickOpen(NUM2INT(device_index));
|
91
|
+
if (!joystick)
|
92
|
+
SDL_ERROR();
|
93
|
+
return Joystick_new(joystick);
|
94
|
+
}
|
95
|
+
|
96
|
+
/*
|
97
|
+
* @overload game_controller?(index)
|
98
|
+
* Return true if the joystick of given index supports the game controller
|
99
|
+
* interface.
|
100
|
+
*
|
101
|
+
* @param [Integer] index the joystick device index
|
102
|
+
* @see SDL2::GameController
|
103
|
+
*
|
104
|
+
*/
|
105
|
+
static VALUE Joystick_s_game_controller_p(VALUE self, VALUE index)
|
106
|
+
{
|
107
|
+
return INT2BOOL(SDL_IsGameController(NUM2INT(index)));
|
108
|
+
}
|
109
|
+
|
110
|
+
/*
|
111
|
+
* Return true a joystick has been opened and currently connected.
|
112
|
+
*/
|
113
|
+
static VALUE Joystick_attached_p(VALUE self)
|
114
|
+
{
|
115
|
+
Joystick* j = Get_Joystick(self);
|
116
|
+
if (!j->joystick)
|
117
|
+
return Qfalse;
|
118
|
+
return INT2BOOL(SDL_JoystickGetAttached(j->joystick));
|
119
|
+
}
|
120
|
+
|
121
|
+
/*
|
122
|
+
* Get the joystick GUID
|
123
|
+
*
|
124
|
+
* @return [String] GUID string
|
125
|
+
*/
|
126
|
+
static VALUE Joystick_GUID(VALUE self)
|
127
|
+
{
|
128
|
+
SDL_JoystickGUID guid;
|
129
|
+
char buf[128];
|
130
|
+
guid = SDL_JoystickGetGUID(Get_SDL_Joystick(self));
|
131
|
+
SDL_JoystickGetGUIDString(guid, buf, sizeof(buf));
|
132
|
+
return rb_usascii_str_new_cstr(buf);
|
133
|
+
}
|
134
|
+
|
135
|
+
/*
|
136
|
+
* Get the index of a joystick
|
137
|
+
*
|
138
|
+
* @return [Integer] index
|
139
|
+
*/
|
140
|
+
static VALUE Joystick_index(VALUE self)
|
141
|
+
{
|
142
|
+
return INT2NUM(HANDLE_ERROR(SDL_JoystickInstanceID(Get_SDL_Joystick(self))));
|
143
|
+
}
|
144
|
+
|
145
|
+
/*
|
146
|
+
* Close a joystick device.
|
147
|
+
*
|
148
|
+
* @return [nil]
|
149
|
+
* @see #destroy?
|
150
|
+
*/
|
151
|
+
static VALUE Joystick_destroy(VALUE self)
|
152
|
+
{
|
153
|
+
Joystick* j = Get_Joystick(self);
|
154
|
+
if (j->joystick)
|
155
|
+
SDL_JoystickClose(j->joystick);
|
156
|
+
j->joystick = NULL;
|
157
|
+
return Qnil;
|
158
|
+
}
|
159
|
+
|
160
|
+
/*
|
161
|
+
* Get the name of a joystick
|
162
|
+
*
|
163
|
+
* @return [String] name
|
164
|
+
*/
|
165
|
+
static VALUE Joystick_name(VALUE self)
|
166
|
+
{
|
167
|
+
return utf8str_new_cstr(SDL_JoystickName(Get_SDL_Joystick(self)));
|
168
|
+
}
|
169
|
+
|
170
|
+
/*
|
171
|
+
* Get the number of general axis controls on a joystick.
|
172
|
+
* @return [Integer]
|
173
|
+
* @see #axis
|
174
|
+
*/
|
175
|
+
static VALUE Joystick_num_axes(VALUE self)
|
176
|
+
{
|
177
|
+
return INT2FIX(SDL_JoystickNumAxes(Get_SDL_Joystick(self)));
|
178
|
+
}
|
179
|
+
|
180
|
+
/*
|
181
|
+
* Get the number of trackball on a joystick
|
182
|
+
* @return [Integer]
|
183
|
+
* @see #ball
|
184
|
+
*/
|
185
|
+
static VALUE Joystick_num_balls(VALUE self)
|
186
|
+
{
|
187
|
+
return INT2FIX(SDL_JoystickNumBalls(Get_SDL_Joystick(self)));
|
188
|
+
}
|
189
|
+
|
190
|
+
/*
|
191
|
+
* Get the number of button on a joystick
|
192
|
+
* @return [Integer]
|
193
|
+
* @see #button
|
194
|
+
*/
|
195
|
+
static VALUE Joystick_num_buttons(VALUE self)
|
196
|
+
{
|
197
|
+
return INT2FIX(SDL_JoystickNumButtons(Get_SDL_Joystick(self)));
|
198
|
+
}
|
199
|
+
|
200
|
+
/*
|
201
|
+
* Get the number of POV hats on a joystick
|
202
|
+
* @return [Integer]
|
203
|
+
* @see #hat
|
204
|
+
*/
|
205
|
+
static VALUE Joystick_num_hats(VALUE self)
|
206
|
+
{
|
207
|
+
return INT2FIX(SDL_JoystickNumHats(Get_SDL_Joystick(self)));
|
208
|
+
}
|
209
|
+
|
210
|
+
/*
|
211
|
+
* @overload axis(which)
|
212
|
+
* Get the current state of an axis control on a joystick.
|
213
|
+
*
|
214
|
+
* @param [Integer] which an index of an axis, started at index 0
|
215
|
+
* @return [Integer] state value, ranging from -32768 to 32767.
|
216
|
+
* @see #num_axes
|
217
|
+
*/
|
218
|
+
static VALUE Joystick_axis(VALUE self, VALUE which)
|
219
|
+
{
|
220
|
+
return INT2FIX(SDL_JoystickGetAxis(Get_SDL_Joystick(self), NUM2INT(which)));
|
221
|
+
}
|
222
|
+
|
223
|
+
/*
|
224
|
+
* @overload ball(which)
|
225
|
+
* Get the current state of a trackball on a joystick.
|
226
|
+
*
|
227
|
+
* @param [Integer] which an index of a trackball, started at index 0
|
228
|
+
* @return [[Integer,Integer]] dx and dy
|
229
|
+
* @see #num_balls
|
230
|
+
*/
|
231
|
+
static VALUE Joystick_ball(VALUE self, VALUE which)
|
232
|
+
{
|
233
|
+
int dx, dy;
|
234
|
+
HANDLE_ERROR(SDL_JoystickGetBall(Get_SDL_Joystick(self), NUM2INT(which), &dx, &dy));
|
235
|
+
return rb_ary_new3(2, INT2NUM(dx), INT2NUM(dy));
|
236
|
+
}
|
237
|
+
|
238
|
+
/*
|
239
|
+
* @overload button(which)
|
240
|
+
* Get the current state of a button on a joystick.
|
241
|
+
*
|
242
|
+
* @param [Integer] which an index of a button, started at index 0
|
243
|
+
* @return [Boolean] true if the button is pressed
|
244
|
+
* @see #num_buttons
|
245
|
+
*/
|
246
|
+
static VALUE Joystick_button(VALUE self, VALUE which)
|
247
|
+
{
|
248
|
+
return INT2BOOL(SDL_JoystickGetButton(Get_SDL_Joystick(self), NUM2INT(which)));
|
249
|
+
}
|
250
|
+
|
251
|
+
/*
|
252
|
+
* @overload hat(which)
|
253
|
+
* Get the current state of a POV hat on a joystick.
|
254
|
+
*
|
255
|
+
* @param [Integer] which an index of a hat, started at index 0
|
256
|
+
* @return [Integer] hat state
|
257
|
+
* @see #num_hats
|
258
|
+
*/
|
259
|
+
static VALUE Joystick_hat(VALUE self, VALUE which)
|
260
|
+
{
|
261
|
+
return UINT2NUM(SDL_JoystickGetHat(Get_SDL_Joystick(self), NUM2INT(which)));
|
262
|
+
}
|
263
|
+
|
264
|
+
/*
|
265
|
+
* Document-class: SDL2::Joystick::DeviceInfo
|
266
|
+
*
|
267
|
+
* This class represents joystick device information, its name and GUID.
|
268
|
+
*
|
269
|
+
* You can get the information with {SDL2::Joystick.devices}.
|
270
|
+
*/
|
271
|
+
|
272
|
+
/*
|
273
|
+
* Document-module: SDL2::Joystick::Hat
|
274
|
+
*
|
275
|
+
* This module provides constants of joysticks's hat positions used by {SDL2::Joystick} class.
|
276
|
+
* The position of the hat is represented by OR'd bits of {RIGHT}, {LEFT}, {UP}, and {DOWN}.
|
277
|
+
* This means the center position ({CENTERED}) is represeted by 0 and
|
278
|
+
* the left up position {LEFTUP} is represeted by ({LEFT}|{UP}).
|
279
|
+
*/
|
280
|
+
|
281
|
+
void rubysdl2_init_joystick(void)
|
282
|
+
{
|
283
|
+
cJoystick = rb_define_class_under(mSDL2, "Joystick", rb_cObject);
|
284
|
+
cDeviceInfo = rb_define_class_under(cJoystick, "DeviceInfo", rb_cObject);
|
285
|
+
|
286
|
+
rb_define_singleton_method(cJoystick, "num_connected_joysticks",
|
287
|
+
Joystick_s_num_connected_joysticks, 0);
|
288
|
+
rb_define_singleton_method(cJoystick, "devices", Joystick_s_devices, 0);
|
289
|
+
rb_define_singleton_method(cJoystick, "open", Joystick_s_open, 1);
|
290
|
+
rb_define_singleton_method(cJoystick, "game_controller?",
|
291
|
+
Joystick_s_game_controller_p, 1);
|
292
|
+
rb_define_method(cJoystick, "destroy?", Joystick_destroy_p, 0);
|
293
|
+
rb_define_alias(cJoystick, "close?", "destroy?");
|
294
|
+
rb_define_method(cJoystick, "attached?", Joystick_attached_p, 0);
|
295
|
+
rb_define_method(cJoystick, "GUID", Joystick_GUID, 0);
|
296
|
+
rb_define_method(cJoystick, "index", Joystick_index, 0);
|
297
|
+
rb_define_method(cJoystick, "destroy", Joystick_destroy, 0);
|
298
|
+
rb_define_alias(cJoystick, "close", "destroy");
|
299
|
+
rb_define_method(cJoystick, "name", Joystick_name, 0);
|
300
|
+
rb_define_method(cJoystick, "num_axes", Joystick_num_axes, 0);
|
301
|
+
rb_define_method(cJoystick, "num_balls", Joystick_num_balls, 0);
|
302
|
+
rb_define_method(cJoystick, "num_buttons", Joystick_num_buttons, 0);
|
303
|
+
rb_define_method(cJoystick, "num_hats", Joystick_num_hats, 0);
|
304
|
+
rb_define_method(cJoystick, "axis", Joystick_axis, 1);
|
305
|
+
rb_define_method(cJoystick, "ball", Joystick_ball, 1);
|
306
|
+
rb_define_method(cJoystick, "button", Joystick_button, 1);
|
307
|
+
rb_define_method(cJoystick, "hat", Joystick_hat, 1);
|
308
|
+
|
309
|
+
mHat = rb_define_module_under(cJoystick, "Hat");
|
310
|
+
|
311
|
+
/* */
|
312
|
+
/* Center position. Equal to 0. */
|
313
|
+
rb_define_const(mHat, "CENTERED", INT2NUM(SDL_HAT_CENTERED));
|
314
|
+
/* Up position. */
|
315
|
+
rb_define_const(mHat, "UP", INT2NUM(SDL_HAT_UP));
|
316
|
+
/* Right position. */
|
317
|
+
rb_define_const(mHat, "RIGHT", INT2NUM(SDL_HAT_RIGHT));
|
318
|
+
/* Down position. */
|
319
|
+
rb_define_const(mHat, "DOWN", INT2NUM(SDL_HAT_DOWN));
|
320
|
+
/* Left position. */
|
321
|
+
rb_define_const(mHat, "LEFT", INT2NUM(SDL_HAT_LEFT));
|
322
|
+
/* Right Up position. Equal to ({RIGHT} | {UP}) */
|
323
|
+
rb_define_const(mHat, "RIGHTUP", INT2NUM(SDL_HAT_RIGHTUP));
|
324
|
+
/* Right Down position. Equal to ({RIGHT} | {DOWN}) */
|
325
|
+
rb_define_const(mHat, "RIGHTDOWN", INT2NUM(SDL_HAT_RIGHTDOWN));
|
326
|
+
/* Left Up position. Equal to ({LEFT} | {UP}) */
|
327
|
+
rb_define_const(mHat, "LEFTUP", INT2NUM(SDL_HAT_LEFTUP));
|
328
|
+
/* Left Down position. Equal to ({LEFT} | {DOWN}) */
|
329
|
+
rb_define_const(mHat, "LEFTDOWN", INT2NUM(SDL_HAT_LEFTDOWN));
|
330
|
+
|
331
|
+
/* Device GUID
|
332
|
+
* @return [String] */
|
333
|
+
rb_define_attr(cDeviceInfo, "GUID", 1, 0);
|
334
|
+
/* Device name
|
335
|
+
* @return [String] */
|
336
|
+
rb_define_attr(cDeviceInfo, "name", 1, 0);
|
337
|
+
|
338
|
+
|
339
|
+
}
|