glfw3 0.4.5 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/glfw3/glfw3.c +160 -89
- data/lib/glfw3/callbacks.rb +2 -2
- data/lib/glfw3/window.rb +26 -26
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3587273712306283209d889f6d43ba43161cad94
|
4
|
+
data.tar.gz: f9eea41ba36fa06658d0e2f568f789b46a594863
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 697392601c4b0cea552420068b5c950dc94f784e500e931a45e9a658359d3fd9e4100e6abd8f3b2ffb3c259ab75a8da01506b8ef66affd15108319743d246793
|
7
|
+
data.tar.gz: 9e07041cf488e8455c9f11ff0ad9272ba449f9a2ca82ba1ba3c2c150b89d065073f037e7695cbf62b49fd3abcdb2cf4e5b40143ff690872373cfd75d6750b448
|
data/ext/glfw3/glfw3.c
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "ruby.h"
|
2
2
|
#include <GLFW/glfw3.h>
|
3
3
|
|
4
|
+
void Init_glfw3(void);
|
4
5
|
|
5
6
|
static const char *kRB_IVAR_WINDOW_INTERNAL_NAME = "@__internal_window";
|
6
7
|
static const char *kRB_IVAR_WINDOW_KEY_CALLBACK_NAME = "@__key_callback";
|
@@ -59,6 +60,9 @@ static void rb_glfw_error_callback(int error_code, const char *description);
|
|
59
60
|
static void rb_glfw_monitor_callback(GLFWmonitor *monitor, int message);
|
60
61
|
|
61
62
|
|
63
|
+
#define Q_IS_A(OBJ, KLASS) RTEST(rb_obj_is_kind_of((OBJ), (KLASS)))
|
64
|
+
|
65
|
+
|
62
66
|
#define RB_ENABLE_CALLBACK_DEF(NAME, CALLBACK, GLFW_FUNC) \
|
63
67
|
static VALUE NAME (VALUE self, VALUE enabled) \
|
64
68
|
{ \
|
@@ -81,7 +85,6 @@ static VALUE NAME (VALUE self, VALUE enabled) \
|
|
81
85
|
*/
|
82
86
|
static VALUE rb_glfw_init(VALUE self)
|
83
87
|
{
|
84
|
-
(void)self;
|
85
88
|
VALUE result = glfwInit() ? Qtrue : Qfalse;
|
86
89
|
if (result == Qtrue) {
|
87
90
|
glfwSetMonitorCallback(rb_glfw_monitor_callback);
|
@@ -128,7 +131,7 @@ static void rb_glfw_error_callback(int error_code, const char *description)
|
|
128
131
|
{
|
129
132
|
VALUE lambda = rb_cvar_get(s_glfw_module, kRB_CVAR_GLFW_ERROR_CALLBACK);
|
130
133
|
|
131
|
-
if (
|
134
|
+
if (rb_obj_respond_to(lambda, kRB_CALL, 0)) {
|
132
135
|
VALUE rb_description = rb_str_new2(description);
|
133
136
|
VALUE rb_error_code = INT2FIX(error_code);
|
134
137
|
OBJ_FREEZE(rb_description);
|
@@ -149,7 +152,7 @@ static void rb_glfw_error_callback(int error_code, const char *description)
|
|
149
152
|
*
|
150
153
|
* Wraps glfwGetMonitors.
|
151
154
|
*/
|
152
|
-
VALUE rb_glfw_get_monitors(VALUE self)
|
155
|
+
static VALUE rb_glfw_get_monitors(VALUE self)
|
153
156
|
{
|
154
157
|
long monitor_index = 0;
|
155
158
|
int num_monitors = 0;
|
@@ -158,7 +161,7 @@ VALUE rb_glfw_get_monitors(VALUE self)
|
|
158
161
|
|
159
162
|
if (monitors) {
|
160
163
|
monitors_out = rb_ary_new();
|
161
|
-
for (; num_monitors;
|
164
|
+
for (; monitor_index < num_monitors; ++monitor_index) {
|
162
165
|
VALUE monitor = Data_Wrap_Struct(s_glfw_monitor_klass, 0, 0, monitors[monitor_index]);
|
163
166
|
rb_obj_call_init(monitor, 0, 0);
|
164
167
|
rb_ary_push(monitors_out, monitor);
|
@@ -177,7 +180,7 @@ VALUE rb_glfw_get_monitors(VALUE self)
|
|
177
180
|
*
|
178
181
|
* Wraps glfwGetPrimaryMonitor.
|
179
182
|
*/
|
180
|
-
VALUE rb_glfw_get_primary_monitor(VALUE self)
|
183
|
+
static VALUE rb_glfw_get_primary_monitor(VALUE self)
|
181
184
|
{
|
182
185
|
GLFWmonitor *monitor = glfwGetPrimaryMonitor();
|
183
186
|
VALUE rb_monitor = Qnil;
|
@@ -198,12 +201,12 @@ VALUE rb_glfw_get_primary_monitor(VALUE self)
|
|
198
201
|
*
|
199
202
|
* Wraps glfwGetMonitorPos.
|
200
203
|
*/
|
201
|
-
VALUE rb_monitor_position(VALUE self)
|
204
|
+
static VALUE rb_monitor_position(VALUE self)
|
202
205
|
{
|
203
|
-
GLFWmonitor *monitor;
|
204
|
-
Data_Get_Struct(self, GLFWmonitor, monitor);
|
206
|
+
GLFWmonitor *monitor = NULL;
|
205
207
|
int xpos = 0;
|
206
208
|
int ypos = 0;
|
209
|
+
Data_Get_Struct(self, GLFWmonitor, monitor);
|
207
210
|
glfwGetMonitorPos(monitor, &xpos, &ypos);
|
208
211
|
return rb_ary_new3(2, INT2FIX(xpos), INT2FIX(ypos));
|
209
212
|
}
|
@@ -218,12 +221,12 @@ VALUE rb_monitor_position(VALUE self)
|
|
218
221
|
*
|
219
222
|
* Wraps glfwGetMonitorPhysicalSize.
|
220
223
|
*/
|
221
|
-
VALUE rb_monitor_physical_size(VALUE self)
|
224
|
+
static VALUE rb_monitor_physical_size(VALUE self)
|
222
225
|
{
|
223
|
-
GLFWmonitor *monitor;
|
224
|
-
Data_Get_Struct(self, GLFWmonitor, monitor);
|
226
|
+
GLFWmonitor *monitor = NULL;
|
225
227
|
int width = 0;
|
226
228
|
int height = 0;
|
229
|
+
Data_Get_Struct(self, GLFWmonitor, monitor);
|
227
230
|
glfwGetMonitorPhysicalSize(monitor, &width, &height);
|
228
231
|
return rb_ary_new3(2, INT2FIX(width), INT2FIX(height));
|
229
232
|
}
|
@@ -238,9 +241,9 @@ VALUE rb_monitor_physical_size(VALUE self)
|
|
238
241
|
*
|
239
242
|
* Wraps glfwGetMonitorName.
|
240
243
|
*/
|
241
|
-
VALUE rb_monitor_name(VALUE self)
|
244
|
+
static VALUE rb_monitor_name(VALUE self)
|
242
245
|
{
|
243
|
-
GLFWmonitor *monitor;
|
246
|
+
GLFWmonitor *monitor = NULL;
|
244
247
|
const char *monitor_name = NULL;
|
245
248
|
Data_Get_Struct(self, GLFWmonitor, monitor);
|
246
249
|
monitor_name = glfwGetMonitorName(monitor);
|
@@ -252,7 +255,7 @@ VALUE rb_monitor_name(VALUE self)
|
|
252
255
|
static void rb_glfw_monitor_callback(GLFWmonitor *monitor, int message)
|
253
256
|
{
|
254
257
|
VALUE lambda = rb_cvar_get(s_glfw_module, kRB_CVAR_GLFW_MONITOR_CALLBACK);
|
255
|
-
if (
|
258
|
+
if (rb_obj_respond_to(lambda, kRB_CALL, 0)) {
|
256
259
|
VALUE rb_monitor = Data_Wrap_Struct(s_glfw_monitor_klass, 0, 0, monitor);
|
257
260
|
rb_obj_call_init(rb_monitor, 0, 0);
|
258
261
|
rb_funcall(lambda, kRB_CALL, 2, rb_monitor, INT2FIX(message));
|
@@ -271,7 +274,7 @@ static void rb_glfw_monitor_callback(GLFWmonitor *monitor, int message)
|
|
271
274
|
*/
|
272
275
|
static VALUE rb_videomode_width(VALUE self)
|
273
276
|
{
|
274
|
-
GLFWvidmode *mode;
|
277
|
+
GLFWvidmode *mode = NULL;
|
275
278
|
Data_Get_Struct(self, GLFWvidmode, mode);
|
276
279
|
return INT2FIX(mode->width);
|
277
280
|
}
|
@@ -286,7 +289,7 @@ static VALUE rb_videomode_width(VALUE self)
|
|
286
289
|
*/
|
287
290
|
static VALUE rb_videomode_height(VALUE self)
|
288
291
|
{
|
289
|
-
GLFWvidmode *mode;
|
292
|
+
GLFWvidmode *mode = NULL;
|
290
293
|
Data_Get_Struct(self, GLFWvidmode, mode);
|
291
294
|
return INT2FIX(mode->height);
|
292
295
|
}
|
@@ -301,7 +304,7 @@ static VALUE rb_videomode_height(VALUE self)
|
|
301
304
|
*/
|
302
305
|
static VALUE rb_videomode_red_bits(VALUE self)
|
303
306
|
{
|
304
|
-
GLFWvidmode *mode;
|
307
|
+
GLFWvidmode *mode = NULL;
|
305
308
|
Data_Get_Struct(self, GLFWvidmode, mode);
|
306
309
|
return INT2FIX(mode->redBits);
|
307
310
|
}
|
@@ -316,7 +319,7 @@ static VALUE rb_videomode_red_bits(VALUE self)
|
|
316
319
|
*/
|
317
320
|
static VALUE rb_videomode_green_bits(VALUE self)
|
318
321
|
{
|
319
|
-
GLFWvidmode *mode;
|
322
|
+
GLFWvidmode *mode = NULL;
|
320
323
|
Data_Get_Struct(self, GLFWvidmode, mode);
|
321
324
|
return INT2FIX(mode->greenBits);
|
322
325
|
}
|
@@ -331,7 +334,7 @@ static VALUE rb_videomode_green_bits(VALUE self)
|
|
331
334
|
*/
|
332
335
|
static VALUE rb_videomode_blue_bits(VALUE self)
|
333
336
|
{
|
334
|
-
GLFWvidmode *mode;
|
337
|
+
GLFWvidmode *mode = NULL;
|
335
338
|
Data_Get_Struct(self, GLFWvidmode, mode);
|
336
339
|
return INT2FIX(mode->blueBits);
|
337
340
|
}
|
@@ -346,7 +349,7 @@ static VALUE rb_videomode_blue_bits(VALUE self)
|
|
346
349
|
*/
|
347
350
|
static VALUE rb_videomode_refresh_rate(VALUE self)
|
348
351
|
{
|
349
|
-
GLFWvidmode *mode;
|
352
|
+
GLFWvidmode *mode = NULL;
|
350
353
|
Data_Get_Struct(self, GLFWvidmode, mode);
|
351
354
|
return INT2FIX(mode->refreshRate);
|
352
355
|
}
|
@@ -363,16 +366,22 @@ static VALUE rb_videomode_refresh_rate(VALUE self)
|
|
363
366
|
*/
|
364
367
|
static VALUE rb_monitor_video_modes(VALUE self)
|
365
368
|
{
|
366
|
-
GLFWmonitor *monitor;
|
367
|
-
|
368
|
-
VALUE rb_modes =
|
369
|
+
GLFWmonitor *monitor = NULL;
|
370
|
+
const GLFWvidmode *modes = NULL;
|
371
|
+
VALUE rb_modes = Qnil;
|
369
372
|
int num_modes = 0;
|
370
373
|
int mode_index = 0;
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
+
VALUE rb_mode = Qnil;
|
375
|
+
GLFWvidmode *mode = NULL;
|
376
|
+
|
377
|
+
Data_Get_Struct(self, GLFWmonitor, monitor);
|
378
|
+
rb_modes = rb_ary_new();
|
379
|
+
modes = glfwGetVideoModes(monitor, &num_modes);
|
380
|
+
|
381
|
+
for (; mode_index < num_modes; ++mode_index) {
|
382
|
+
ALLOC(GLFWvidmode);
|
374
383
|
*mode = modes[mode_index];
|
375
|
-
|
384
|
+
rb_mode = Data_Wrap_Struct(s_glfw_videomode_klass, 0, free, mode);
|
376
385
|
rb_obj_call_init(rb_mode, 0, 0);
|
377
386
|
rb_ary_push(rb_modes, rb_mode);
|
378
387
|
}
|
@@ -391,11 +400,13 @@ static VALUE rb_monitor_video_modes(VALUE self)
|
|
391
400
|
*/
|
392
401
|
static VALUE rb_monitor_video_mode(VALUE self)
|
393
402
|
{
|
394
|
-
GLFWmonitor *monitor;
|
403
|
+
GLFWmonitor *monitor = NULL;
|
404
|
+
GLFWvidmode *mode = NULL;
|
405
|
+
VALUE rb_mode = Qnil;
|
395
406
|
Data_Get_Struct(self, GLFWmonitor, monitor);
|
396
|
-
|
407
|
+
mode = ALLOC(GLFWvidmode);
|
397
408
|
*mode = *glfwGetVideoMode(monitor);
|
398
|
-
|
409
|
+
rb_mode = Data_Wrap_Struct(s_glfw_videomode_klass, 0, free, mode);
|
399
410
|
rb_obj_call_init(rb_mode, 0, 0);
|
400
411
|
return rb_mode;
|
401
412
|
}
|
@@ -413,7 +424,7 @@ static VALUE rb_monitor_video_mode(VALUE self)
|
|
413
424
|
*/
|
414
425
|
static VALUE rb_monitor_set_gamma(VALUE self, VALUE gamma)
|
415
426
|
{
|
416
|
-
GLFWmonitor *monitor;
|
427
|
+
GLFWmonitor *monitor = NULL;
|
417
428
|
Data_Get_Struct(self, GLFWmonitor, monitor);
|
418
429
|
glfwSetGamma(monitor, (float)NUM2DBL(gamma));
|
419
430
|
return self;
|
@@ -435,8 +446,8 @@ static VALUE rb_monitor_set_gamma(VALUE self, VALUE gamma)
|
|
435
446
|
*/
|
436
447
|
static VALUE rb_monitor_get_gamma_ramp(VALUE self)
|
437
448
|
{
|
438
|
-
GLFWmonitor *monitor;
|
439
|
-
const GLFWgammaramp *ramp;
|
449
|
+
GLFWmonitor *monitor = NULL;
|
450
|
+
const GLFWgammaramp *ramp = NULL;
|
440
451
|
VALUE rb_gamma_hash, rb_red, rb_green, rb_blue;
|
441
452
|
unsigned int ramp_index;
|
442
453
|
unsigned int ramp_len = ramp->size;
|
@@ -487,11 +498,16 @@ static VALUE rb_monitor_get_gamma_ramp(VALUE self)
|
|
487
498
|
*/
|
488
499
|
static VALUE rb_monitor_set_gamma_ramp(VALUE self, VALUE ramp_hash)
|
489
500
|
{
|
490
|
-
GLFWmonitor *monitor;
|
501
|
+
GLFWmonitor *monitor = NULL;
|
491
502
|
GLFWgammaramp ramp;
|
492
503
|
VALUE rb_red, rb_green, rb_blue;
|
493
|
-
unsigned int ramp_index;
|
504
|
+
unsigned int ramp_index = 0;
|
494
505
|
unsigned int ramp_len = 0;
|
506
|
+
unsigned short *ramp_buffer = NULL;
|
507
|
+
|
508
|
+
if (!Q_IS_A(ramp_hash, rb_cHash)) {
|
509
|
+
rb_raise(rb_eArgError, "ramp_hash must be a Hash");
|
510
|
+
}
|
495
511
|
|
496
512
|
Data_Get_Struct(self, GLFWmonitor, monitor);
|
497
513
|
|
@@ -499,26 +515,25 @@ static VALUE rb_monitor_set_gamma_ramp(VALUE self, VALUE ramp_hash)
|
|
499
515
|
rb_green = rb_hash_aref(ramp_hash, ID2SYM(kRB_GREEN));
|
500
516
|
rb_blue = rb_hash_aref(ramp_hash, ID2SYM(kRB_BLUE));
|
501
517
|
|
502
|
-
if (!(
|
518
|
+
if (!(Q_IS_A(rb_red, rb_cArray) && Q_IS_A(rb_green, rb_cArray) && Q_IS_A(rb_blue, rb_cArray))) {
|
503
519
|
rb_raise(rb_eArgError, "Ramp Hash must contain :red, :green, and :blue arrays");
|
504
520
|
}
|
505
521
|
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
ramp_len = ramp_index;
|
522
|
+
/* NOTE: loses precision */
|
523
|
+
ramp_len = (unsigned int)RARRAY_LEN(rb_red);
|
524
|
+
if (RARRAY_LEN(rb_green) != ramp_len || RARRAY_LEN(rb_blue) != ramp_len) {
|
525
|
+
rb_raise(rb_eArgError, "All ramps must have the same length");
|
511
526
|
}
|
512
527
|
|
513
|
-
|
528
|
+
ramp_buffer = ALLOC_N(unsigned short, 3 * ramp_len);
|
514
529
|
ramp.red = ramp_buffer;
|
515
530
|
ramp.green = &ramp_buffer[ramp_len];
|
516
531
|
ramp.blue = &ramp_buffer[ramp_len * 2];
|
517
532
|
|
518
|
-
for (
|
519
|
-
ramp.red[ramp_index] = rb_num2uint(rb_ary_entry(rb_red, ramp_index));
|
520
|
-
ramp.green[ramp_index] = rb_num2uint(rb_ary_entry(rb_green, ramp_index));
|
521
|
-
ramp.blue[ramp_index] = rb_num2uint(rb_ary_entry(rb_blue, ramp_index));
|
533
|
+
for (; ramp_index < ramp_len; ++ramp_index) {
|
534
|
+
ramp.red[ramp_index] = (unsigned short)rb_num2uint(rb_ary_entry(rb_red, ramp_index));
|
535
|
+
ramp.green[ramp_index] = (unsigned short)rb_num2uint(rb_ary_entry(rb_green, ramp_index));
|
536
|
+
ramp.blue[ramp_index] = (unsigned short)rb_num2uint(rb_ary_entry(rb_blue, ramp_index));
|
522
537
|
}
|
523
538
|
|
524
539
|
ramp.size = ramp_len;
|
@@ -567,7 +582,13 @@ static VALUE rb_window_window_hint(VALUE self, VALUE target, VALUE hint)
|
|
567
582
|
/* Auxiliary function for extracting a Glfw::Window object from a GLFWwindow. */
|
568
583
|
static VALUE rb_lookup_window(GLFWwindow *window)
|
569
584
|
{
|
570
|
-
|
585
|
+
if (window) {
|
586
|
+
void *uptr = glfwGetWindowUserPointer(window);
|
587
|
+
if (uptr) {
|
588
|
+
return (VALUE)uptr;
|
589
|
+
}
|
590
|
+
}
|
591
|
+
return Qnil;
|
571
592
|
}
|
572
593
|
|
573
594
|
/* And the opposite of rb_lookup_window */
|
@@ -622,11 +643,11 @@ static VALUE rb_window_new(int argc, VALUE *argv, VALUE self)
|
|
622
643
|
title = StringValueCStr(rb_title);
|
623
644
|
}
|
624
645
|
|
625
|
-
if (
|
646
|
+
if (Q_IS_A(rb_monitor, s_glfw_monitor_klass)) {
|
626
647
|
Data_Get_Struct(rb_monitor, GLFWmonitor, monitor);
|
627
648
|
}
|
628
649
|
|
629
|
-
if (
|
650
|
+
if (Q_IS_A(rb_share, s_glfw_window_klass)) {
|
630
651
|
VALUE rb_shared_window = rb_ivar_get(rb_share, ivar_window);
|
631
652
|
Data_Get_Struct(rb_shared_window, GLFWwindow, share);
|
632
653
|
}
|
@@ -678,11 +699,12 @@ static VALUE rb_window_new(int argc, VALUE *argv, VALUE self)
|
|
678
699
|
*/
|
679
700
|
static VALUE rb_window_destroy(VALUE self)
|
680
701
|
{
|
702
|
+
VALUE rb_windows = Qnil;
|
681
703
|
GLFWwindow *window = rb_get_window(self);
|
682
704
|
if (window) {
|
683
705
|
glfwDestroyWindow(window);
|
684
706
|
rb_ivar_set(self, kRB_IVAR_WINDOW_INTERNAL, Qnil);
|
685
|
-
|
707
|
+
rb_windows = rb_cvar_get(s_glfw_window_klass, kRB_CVAR_WINDOW_WINDOWS);
|
686
708
|
rb_hash_delete(rb_windows, INT2FIX((int)window));
|
687
709
|
}
|
688
710
|
return self;
|
@@ -908,8 +930,12 @@ static VALUE rb_window_get_monitor(VALUE self)
|
|
908
930
|
static void rb_window_window_position_callback(GLFWwindow *window, int x, int y)
|
909
931
|
{
|
910
932
|
VALUE rb_window = rb_lookup_window(window);
|
911
|
-
|
912
|
-
|
933
|
+
if (RTEST(rb_window)) {
|
934
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_POSITION_CALLBACK);
|
935
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
936
|
+
rb_funcall(rb_func, kRB_CALL, 3, rb_window, INT2FIX(x), INT2FIX(y));
|
937
|
+
}
|
938
|
+
}
|
913
939
|
}
|
914
940
|
|
915
941
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_window_position_callback, rb_window_window_position_callback, glfwSetWindowPosCallback);
|
@@ -919,8 +945,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_window_position_callback, rb_window_window_
|
|
919
945
|
static void rb_window_window_size_callback(GLFWwindow *window, int width, int height)
|
920
946
|
{
|
921
947
|
VALUE rb_window = rb_lookup_window(window);
|
922
|
-
|
923
|
-
|
948
|
+
if (RTEST(rb_window)) {
|
949
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_SIZE_CALLBACK);
|
950
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
951
|
+
rb_funcall(rb_func, kRB_CALL, 3, rb_window, INT2FIX(width), INT2FIX(height));
|
952
|
+
}
|
953
|
+
}
|
924
954
|
}
|
925
955
|
|
926
956
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_window_size_callback, rb_window_window_size_callback, glfwSetWindowSizeCallback);
|
@@ -930,8 +960,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_window_size_callback, rb_window_window_size
|
|
930
960
|
static void rb_window_close_callback(GLFWwindow *window)
|
931
961
|
{
|
932
962
|
VALUE rb_window = rb_lookup_window(window);
|
933
|
-
|
934
|
-
|
963
|
+
if (RTEST(rb_window)) {
|
964
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_CLOSE_CALLBACK);
|
965
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
966
|
+
rb_funcall(rb_func, kRB_CALL, 1, rb_window);
|
967
|
+
}
|
968
|
+
}
|
935
969
|
}
|
936
970
|
|
937
971
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_close_callback, rb_window_close_callback, glfwSetWindowCloseCallback);
|
@@ -941,8 +975,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_close_callback, rb_window_close_callback, g
|
|
941
975
|
static void rb_window_refresh_callback(GLFWwindow *window)
|
942
976
|
{
|
943
977
|
VALUE rb_window = rb_lookup_window(window);
|
944
|
-
|
945
|
-
|
978
|
+
if (RTEST(rb_window)) {
|
979
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_REFRESH_CALLBACK);
|
980
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
981
|
+
rb_funcall(rb_func, kRB_CALL, 1, rb_window);
|
982
|
+
}
|
983
|
+
}
|
946
984
|
}
|
947
985
|
|
948
986
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_refresh_callback, rb_window_refresh_callback, glfwSetWindowRefreshCallback);
|
@@ -952,8 +990,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_refresh_callback, rb_window_refresh_callbac
|
|
952
990
|
static void rb_window_focus_callback(GLFWwindow *window, int focused)
|
953
991
|
{
|
954
992
|
VALUE rb_window = rb_lookup_window(window);
|
955
|
-
|
956
|
-
|
993
|
+
if (RTEST(rb_window)) {
|
994
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_FOCUS_CALLBACK);
|
995
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
996
|
+
rb_funcall(rb_func, kRB_CALL, 2, rb_window, focused ? Qtrue : Qfalse);
|
997
|
+
}
|
998
|
+
}
|
957
999
|
}
|
958
1000
|
|
959
1001
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_focus_callback, rb_window_focus_callback, glfwSetWindowFocusCallback);
|
@@ -963,8 +1005,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_focus_callback, rb_window_focus_callback, g
|
|
963
1005
|
static void rb_window_iconify_callback(GLFWwindow *window, int iconified)
|
964
1006
|
{
|
965
1007
|
VALUE rb_window = rb_lookup_window(window);
|
966
|
-
|
967
|
-
|
1008
|
+
if (RTEST(rb_window)) {
|
1009
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_ICONIFY_CALLBACK);
|
1010
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
1011
|
+
rb_funcall(rb_func, kRB_CALL, 2, rb_window, iconified ? Qtrue : Qfalse);
|
1012
|
+
}
|
1013
|
+
}
|
968
1014
|
}
|
969
1015
|
|
970
1016
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_iconify_callback, rb_window_iconify_callback, glfwSetWindowIconifyCallback);
|
@@ -974,8 +1020,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_iconify_callback, rb_window_iconify_callbac
|
|
974
1020
|
static void rb_window_fbsize_callback(GLFWwindow *window, int width, int height)
|
975
1021
|
{
|
976
1022
|
VALUE rb_window = rb_lookup_window(window);
|
977
|
-
|
978
|
-
|
1023
|
+
if (RTEST(rb_window)) {
|
1024
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_FRAMEBUFFER_SIZE_CALLBACK);
|
1025
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
1026
|
+
rb_funcall(rb_func, kRB_CALL, 3, rb_window, INT2FIX(width), INT2FIX(height));
|
1027
|
+
}
|
1028
|
+
}
|
979
1029
|
}
|
980
1030
|
|
981
1031
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_fbsize_callback, rb_window_fbsize_callback, glfwSetFramebufferSizeCallback);
|
@@ -1124,8 +1174,12 @@ static VALUE rb_window_set_cursor_pos(VALUE self, VALUE x, VALUE y)
|
|
1124
1174
|
static void rb_window_key_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
|
1125
1175
|
{
|
1126
1176
|
VALUE rb_window = rb_lookup_window(window);
|
1127
|
-
|
1128
|
-
|
1177
|
+
if (RTEST(rb_window)) {
|
1178
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_KEY_CALLBACK);
|
1179
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
1180
|
+
rb_funcall(rb_func, kRB_CALL, 5, rb_window, INT2FIX(key), INT2FIX(scancode), INT2FIX(action), INT2FIX(mods));
|
1181
|
+
}
|
1182
|
+
}
|
1129
1183
|
}
|
1130
1184
|
|
1131
1185
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_key_callback, rb_window_key_callback, glfwSetKeyCallback);
|
@@ -1135,8 +1189,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_key_callback, rb_window_key_callback, glfwS
|
|
1135
1189
|
static void rb_window_char_callback(GLFWwindow *window, unsigned int code)
|
1136
1190
|
{
|
1137
1191
|
VALUE rb_window = rb_lookup_window(window);
|
1138
|
-
|
1139
|
-
|
1192
|
+
if (RTEST(rb_window)) {
|
1193
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_CHAR_CALLBACK);
|
1194
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
1195
|
+
rb_funcall(rb_func, kRB_CALL, 2, rb_window, UINT2NUM(code));
|
1196
|
+
}
|
1197
|
+
}
|
1140
1198
|
}
|
1141
1199
|
|
1142
1200
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_char_callback, rb_window_char_callback, glfwSetCharCallback);
|
@@ -1147,8 +1205,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_char_callback, rb_window_char_callback, glf
|
|
1147
1205
|
static void rb_window_mouse_button_callback(GLFWwindow *window, int button, int action, int mods)
|
1148
1206
|
{
|
1149
1207
|
VALUE rb_window = rb_lookup_window(window);
|
1150
|
-
|
1151
|
-
|
1208
|
+
if (RTEST(rb_window)) {
|
1209
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_MOUSE_BUTTON_CALLBACK);
|
1210
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
1211
|
+
rb_funcall(rb_func, kRB_CALL, 4, rb_window, INT2FIX(button), INT2FIX(action), INT2FIX(mods));
|
1212
|
+
}
|
1213
|
+
}
|
1152
1214
|
}
|
1153
1215
|
|
1154
1216
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_mouse_button_callback, rb_window_mouse_button_callback, glfwSetMouseButtonCallback);
|
@@ -1158,8 +1220,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_mouse_button_callback, rb_window_mouse_butt
|
|
1158
1220
|
static void rb_window_cursor_position_callback(GLFWwindow *window, double x, double y)
|
1159
1221
|
{
|
1160
1222
|
VALUE rb_window = rb_lookup_window(window);
|
1161
|
-
|
1162
|
-
|
1223
|
+
if (RTEST(rb_window)) {
|
1224
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_CURSOR_POSITION_CALLBACK);
|
1225
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
1226
|
+
rb_funcall(rb_func, kRB_CALL, 3, rb_window, rb_float_new(x), rb_float_new(y));
|
1227
|
+
}
|
1228
|
+
}
|
1163
1229
|
}
|
1164
1230
|
|
1165
1231
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_cursor_position_callback, rb_window_cursor_position_callback, glfwSetCursorPosCallback);
|
@@ -1169,8 +1235,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_cursor_position_callback, rb_window_cursor_
|
|
1169
1235
|
static void rb_window_cursor_enter_callback(GLFWwindow *window, int entered)
|
1170
1236
|
{
|
1171
1237
|
VALUE rb_window = rb_lookup_window(window);
|
1172
|
-
|
1173
|
-
|
1238
|
+
if (RTEST(rb_window)) {
|
1239
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_CURSOR_ENTER_CALLBACK);
|
1240
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
1241
|
+
rb_funcall(rb_func, kRB_CALL, 2, rb_window, entered ? Qtrue : Qfalse);
|
1242
|
+
}
|
1243
|
+
}
|
1174
1244
|
}
|
1175
1245
|
|
1176
1246
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_cursor_enter_callback, rb_window_cursor_enter_callback, glfwSetCursorEnterCallback);
|
@@ -1180,8 +1250,12 @@ RB_ENABLE_CALLBACK_DEF(rb_window_set_cursor_enter_callback, rb_window_cursor_ent
|
|
1180
1250
|
static void rb_window_scroll_callback(GLFWwindow *window, double x, double y)
|
1181
1251
|
{
|
1182
1252
|
VALUE rb_window = rb_lookup_window(window);
|
1183
|
-
|
1184
|
-
|
1253
|
+
if (RTEST(rb_window)) {
|
1254
|
+
VALUE rb_func = rb_ivar_get(rb_window, kRB_IVAR_WINDOW_SCROLL_CALLBACK);
|
1255
|
+
if (rb_obj_respond_to(rb_func, kRB_CALL, 0)) {
|
1256
|
+
rb_funcall(rb_func, kRB_CALL, 3, rb_window, rb_float_new(x), rb_float_new(y));
|
1257
|
+
}
|
1258
|
+
}
|
1185
1259
|
}
|
1186
1260
|
|
1187
1261
|
RB_ENABLE_CALLBACK_DEF(rb_window_set_scroll_callback, rb_window_scroll_callback, glfwSetScrollCallback);
|
@@ -1217,11 +1291,12 @@ static VALUE rb_glfw_get_joystick_axes(VALUE self, VALUE joystick)
|
|
1217
1291
|
{
|
1218
1292
|
VALUE rb_axes = Qnil;
|
1219
1293
|
int num_axes = 0;
|
1294
|
+
int axis_index = 0;
|
1220
1295
|
const float *axes = glfwGetJoystickAxes(NUM2INT(joystick), &num_axes);
|
1221
1296
|
if (num_axes > 0) {
|
1222
1297
|
rb_axes = rb_ary_new();
|
1223
|
-
for (; num_axes;
|
1224
|
-
rb_ary_push(rb_axes, rb_float_new(
|
1298
|
+
for (; axis_index < num_axes; ++axis_index) {
|
1299
|
+
rb_ary_push(rb_axes, rb_float_new(axes[axis_index]));
|
1225
1300
|
}
|
1226
1301
|
}
|
1227
1302
|
return rb_axes;
|
@@ -1242,11 +1317,12 @@ static VALUE rb_glfw_get_joystick_buttons(VALUE self, VALUE joystick)
|
|
1242
1317
|
{
|
1243
1318
|
VALUE rb_buttons = Qnil;
|
1244
1319
|
int num_buttons = 0;
|
1320
|
+
int button_index = 0;
|
1245
1321
|
const unsigned char *buttons = glfwGetJoystickButtons(NUM2INT(joystick), &num_buttons);
|
1246
1322
|
if (num_buttons > 0) {
|
1247
1323
|
rb_buttons = rb_ary_new();
|
1248
|
-
for (; num_buttons;
|
1249
|
-
rb_ary_push(rb_buttons, rb_float_new(INT2FIX((int)
|
1324
|
+
for (; button_index < num_buttons; ++button_index) {
|
1325
|
+
rb_ary_push(rb_buttons, rb_float_new(INT2FIX((int)buttons[button_index])));
|
1250
1326
|
}
|
1251
1327
|
}
|
1252
1328
|
return rb_buttons;
|
@@ -1391,12 +1467,7 @@ static VALUE rb_window_unset_context(VALUE self)
|
|
1391
1467
|
*/
|
1392
1468
|
static VALUE rb_window_get_current_context(VALUE self)
|
1393
1469
|
{
|
1394
|
-
|
1395
|
-
if (window) {
|
1396
|
-
return (VALUE)glfwGetWindowUserPointer(window);
|
1397
|
-
} else {
|
1398
|
-
return Qnil;
|
1399
|
-
}
|
1470
|
+
return rb_lookup_window(glfwGetCurrentContext());
|
1400
1471
|
}
|
1401
1472
|
|
1402
1473
|
|
@@ -1487,10 +1558,10 @@ void Init_glfw3(void)
|
|
1487
1558
|
kRB_BLUE = rb_intern(kRB_BLUE_NAME);
|
1488
1559
|
|
1489
1560
|
s_glfw_module = rb_define_module("Glfw");
|
1490
|
-
s_glfw_monitor_klass = rb_define_class_under(s_glfw_module, "Monitor",
|
1561
|
+
s_glfw_monitor_klass = rb_define_class_under(s_glfw_module, "Monitor", rb_cData);
|
1491
1562
|
s_glfw_window_klass = rb_define_class_under(s_glfw_module, "Window", rb_cObject);
|
1492
|
-
s_glfw_window_internal_klass = rb_define_class_under(s_glfw_window_klass, "InternalWindow",
|
1493
|
-
s_glfw_videomode_klass = rb_define_class_under(s_glfw_module, "VideoMode",
|
1563
|
+
s_glfw_window_internal_klass = rb_define_class_under(s_glfw_window_klass, "InternalWindow", rb_cData);
|
1564
|
+
s_glfw_videomode_klass = rb_define_class_under(s_glfw_module, "VideoMode", rb_cData);
|
1494
1565
|
|
1495
1566
|
/* Glfw::Monitor */
|
1496
1567
|
rb_define_singleton_method(s_glfw_monitor_klass, "monitors", rb_glfw_get_monitors, 0);
|
data/lib/glfw3/callbacks.rb
CHANGED
@@ -35,7 +35,7 @@ module Glfw
|
|
35
35
|
# Sets the current error callback to a Proc generated from the provided block.
|
36
36
|
#
|
37
37
|
def self.set_error_callback(&block)
|
38
|
-
self.error_callback =
|
38
|
+
self.error_callback = block
|
39
39
|
end
|
40
40
|
|
41
41
|
#
|
@@ -70,6 +70,6 @@ module Glfw
|
|
70
70
|
# block.
|
71
71
|
#
|
72
72
|
def self.set_monitor_callback(&block)
|
73
|
-
self.monitor_callback =
|
73
|
+
self.monitor_callback = block
|
74
74
|
end
|
75
75
|
end
|
data/lib/glfw3/window.rb
CHANGED
@@ -98,119 +98,119 @@ class Glfw::Window
|
|
98
98
|
|
99
99
|
def key_callback=(func)
|
100
100
|
@__key_callback = func
|
101
|
-
set_key_callback__(
|
101
|
+
set_key_callback__(func.respond_to?(:call))
|
102
102
|
end
|
103
103
|
|
104
104
|
def set_key_callback(&block)
|
105
|
-
self.key_callback =
|
105
|
+
self.key_callback = block
|
106
106
|
end
|
107
107
|
|
108
108
|
def char_callback=(func)
|
109
109
|
@__char_callback = func
|
110
|
-
set_char_callback__(
|
110
|
+
set_char_callback__(func.respond_to?(:call))
|
111
111
|
end
|
112
112
|
|
113
113
|
def set_char_callback(&block)
|
114
|
-
self.char_callback =
|
114
|
+
self.char_callback = block
|
115
115
|
end
|
116
116
|
|
117
117
|
def mouse_button_callback=(func)
|
118
118
|
@__mouse_button_callback = func
|
119
|
-
set_mouse_button_callback__(
|
119
|
+
set_mouse_button_callback__(func.respond_to?(:call))
|
120
120
|
end
|
121
121
|
|
122
122
|
def set_mouse_button_callback(&block)
|
123
|
-
self.mouse_button_callback =
|
123
|
+
self.mouse_button_callback = block
|
124
124
|
end
|
125
125
|
|
126
126
|
def cursor_position_callback=(func)
|
127
127
|
@__cursor_position_callback = func
|
128
|
-
set_cursor_position_callback__(
|
128
|
+
set_cursor_position_callback__(func.respond_to?(:call))
|
129
129
|
end
|
130
130
|
|
131
131
|
def set_cursor_position_callback(&block)
|
132
|
-
self.cursor_position_callback =
|
132
|
+
self.cursor_position_callback = block
|
133
133
|
end
|
134
134
|
|
135
135
|
def cursor_enter_callback=(func)
|
136
136
|
@__cursor_enter_callback = func
|
137
|
-
set_cursor_enter_callback__(
|
137
|
+
set_cursor_enter_callback__(func.respond_to?(:call))
|
138
138
|
end
|
139
139
|
|
140
140
|
def set_cursor_enter_callback(&block)
|
141
|
-
self.cursor_enter_callback =
|
141
|
+
self.cursor_enter_callback = block
|
142
142
|
end
|
143
143
|
|
144
144
|
def scroll_callback=(func)
|
145
145
|
@__scroll_callback = func
|
146
|
-
set_scroll_callback__(
|
146
|
+
set_scroll_callback__(func.respond_to?(:call))
|
147
147
|
end
|
148
148
|
|
149
149
|
def set_scroll_callback(&block)
|
150
|
-
self.scroll_callback =
|
150
|
+
self.scroll_callback = block
|
151
151
|
end
|
152
152
|
|
153
153
|
def position_callback=(func)
|
154
154
|
@__position_callback = func
|
155
|
-
set_window_position_callback__(
|
155
|
+
set_window_position_callback__(func.respond_to?(:call))
|
156
156
|
end
|
157
157
|
|
158
158
|
def set_position_callback(&block)
|
159
|
-
self.position_callback =
|
159
|
+
self.position_callback = block
|
160
160
|
end
|
161
161
|
|
162
162
|
def size_callback=(func)
|
163
163
|
@__size_callback = func
|
164
|
-
set_window_size_callback__(
|
164
|
+
set_window_size_callback__(func.respond_to?(:call))
|
165
165
|
end
|
166
166
|
|
167
167
|
def set_size_callback(&block)
|
168
|
-
self.size_callback =
|
168
|
+
self.size_callback = block
|
169
169
|
end
|
170
170
|
|
171
171
|
def close_callback=(func)
|
172
172
|
@__close_callback = func
|
173
|
-
set_close_callback__(
|
173
|
+
set_close_callback__(func.respond_to?(:call))
|
174
174
|
end
|
175
175
|
|
176
176
|
def set_close_callback(&block)
|
177
|
-
self.close_callback =
|
177
|
+
self.close_callback = block
|
178
178
|
end
|
179
179
|
|
180
180
|
def refresh_callback=(func)
|
181
181
|
@__refresh_callback = func
|
182
|
-
set_refresh_callback__(
|
182
|
+
set_refresh_callback__(func.respond_to?(:call))
|
183
183
|
end
|
184
184
|
|
185
185
|
def set_refresh_callback(&block)
|
186
|
-
self.refresh_callback =
|
186
|
+
self.refresh_callback = block
|
187
187
|
end
|
188
188
|
|
189
189
|
def focus_callback=(func)
|
190
190
|
@__focus_callback = func
|
191
|
-
set_focus_callback__(
|
191
|
+
set_focus_callback__(func.respond_to?(:call))
|
192
192
|
end
|
193
193
|
|
194
194
|
def set_focus_callback(&block)
|
195
|
-
self.focus_callback =
|
195
|
+
self.focus_callback = block
|
196
196
|
end
|
197
197
|
|
198
198
|
def iconify_callback=(func)
|
199
199
|
@__iconify_callback = func
|
200
|
-
set_iconify_callback__(
|
200
|
+
set_iconify_callback__(func.respond_to?(:call))
|
201
201
|
end
|
202
202
|
|
203
203
|
def set_iconify_callback(&block)
|
204
|
-
self.iconify_callback =
|
204
|
+
self.iconify_callback = block
|
205
205
|
end
|
206
206
|
|
207
207
|
def framebuffer_size_callback=(func)
|
208
208
|
@__framebuffer_size_callback = func
|
209
|
-
set_fbsize_callback__(
|
209
|
+
set_fbsize_callback__(func.respond_to?(:call))
|
210
210
|
end
|
211
211
|
|
212
212
|
def set_framebuffer_size_callback(&block)
|
213
|
-
self.framebuffer_size_callback =
|
213
|
+
self.framebuffer_size_callback = block
|
214
214
|
end
|
215
215
|
|
216
216
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glfw3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Noel Raymond Cower
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: GLFW 3 bindings for Ruby 2.x
|
14
14
|
email: ncower@gmail.com
|
@@ -53,9 +53,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
53
53
|
version: '0'
|
54
54
|
requirements: []
|
55
55
|
rubyforge_project:
|
56
|
-
rubygems_version: 2.2.
|
56
|
+
rubygems_version: 2.2.0
|
57
57
|
signing_key:
|
58
58
|
specification_version: 4
|
59
59
|
summary: GLFW3
|
60
60
|
test_files: []
|
61
|
-
has_rdoc: true
|