glfw 0.1.0 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,16 @@
1
+
2
+ #ifndef GLFW_RB_VULKAN_H
3
+ #define GLFW_RB_VULKAN_H 1
4
+
5
+ #include "common.h"
6
+
7
+ void Init_glfw_vulkan(VALUE module);
8
+
9
+ VALUE rb_glfw_vulkan_supported(VALUE klass);
10
+ VALUE rb_glfw_vulkan_required_ext(VALUE klass);
11
+
12
+ VALUE rb_glfw_vulkan_create_surface(VALUE self, VALUE window, VALUE allocator);
13
+ VALUE rb_glfw_vulkan_proc_address(VALUE self, VALUE name);
14
+ VALUE rb_glfw_vulkan_device_support(VALUE self, VALUE device, VALUE family);
15
+
16
+ #endif /* GLFW_RB_VULKAN_H */
@@ -0,0 +1,708 @@
1
+
2
+ #include "window.h"
3
+
4
+ VALUE rb_cGLFWwindow;
5
+
6
+ ID id_moved;
7
+ ID id_resized;
8
+ ID id_framebuffer_resized;
9
+ ID id_closing;
10
+ ID id_refreshed;
11
+ ID id_focus_changed;
12
+ ID id_minimize_changed;
13
+ ID id_mouse_move;
14
+ ID id_mouse_scroll;
15
+ ID id_mouse_button;
16
+ ID id_mouse_enter;
17
+ ID id_key;
18
+ ID id_char;
19
+ ID id_char_mods;
20
+ ID id_file_drop;
21
+
22
+ #define RB_CALLBACK(id, name) \
23
+ id = rb_intern(name); \
24
+ rb_define_method_id(rb_cGLFWwindow, id, rb_glfw_window_empty_method, -1)
25
+
26
+ void Init_glfw_window(VALUE mmodule) {
27
+ rb_cGLFWwindow = rb_define_class_under(rb_mGLFW, "Window", rb_cObject);
28
+
29
+ rb_define_alloc_func(rb_cGLFWwindow, rb_glfw_window_alloc);
30
+ rb_define_method(rb_cGLFWwindow, "initialize", rb_glfw_window_initialize, -1);
31
+ rb_define_method(rb_cGLFWwindow, "destroy", rb_glfw_window_destroy, 0);
32
+ rb_define_method(rb_cGLFWwindow, "show", rb_glfw_window_show, 0);
33
+ rb_define_method(rb_cGLFWwindow, "hide", rb_glfw_window_hide, 0);
34
+ rb_define_method(rb_cGLFWwindow, "minimize", rb_glfw_window_minimize, 0);
35
+ rb_define_method(rb_cGLFWwindow, "maximize", rb_glfw_window_maximize, 0);
36
+ rb_define_method(rb_cGLFWwindow, "restore", rb_glfw_window_restore, 0);
37
+ rb_define_method(rb_cGLFWwindow, "focus", rb_glfw_window_focus, 0);
38
+ rb_define_method(rb_cGLFWwindow, "closing?", rb_glfw_window_closing_p, 0);
39
+ rb_define_method(rb_cGLFWwindow, "close", rb_glfw_window_close, -1);
40
+
41
+ rb_define_method(rb_cGLFWwindow, "swap_buffers", rb_glfw_window_swap_buffers, 0);
42
+ rb_define_method(rb_cGLFWwindow, "make_current", rb_glfw_window_make_current, 0);
43
+ rb_define_method(rb_cGLFWwindow, "monitor", rb_glfw_window_get_monitor, 0);
44
+ rb_define_method(rb_cGLFWwindow, "set_monitor", rb_glfw_window_set_monitor, -1);
45
+
46
+ rb_define_method(rb_cGLFWwindow, "dimensions", rb_glfw_window_dimensions, 0);
47
+ rb_define_method(rb_cGLFWwindow, "position", rb_glfw_window_get_pos, 0);
48
+ rb_define_method(rb_cGLFWwindow, "move", rb_glfw_window_set_pos, 2);
49
+ rb_define_method(rb_cGLFWwindow, "size", rb_glfw_window_get_size, 0);
50
+ rb_define_method(rb_cGLFWwindow, "resize", rb_glfw_window_set_size, 2);
51
+ rb_define_method(rb_cGLFWwindow, "framebuffer_size", rb_glfw_window_get_framebuffer_size, 0);
52
+ rb_define_method(rb_cGLFWwindow, "x", rb_glfw_window_get_x, 0);
53
+ rb_define_method(rb_cGLFWwindow, "y", rb_glfw_window_get_y, 0);
54
+ rb_define_method(rb_cGLFWwindow, "width", rb_glfw_window_get_width, 0);
55
+ rb_define_method(rb_cGLFWwindow, "height", rb_glfw_window_get_height, 0);
56
+ rb_define_method(rb_cGLFWwindow, "x=", rb_glfw_window_set_x, 1);
57
+ rb_define_method(rb_cGLFWwindow, "y=", rb_glfw_window_set_y, 1);
58
+ rb_define_method(rb_cGLFWwindow, "width=", rb_glfw_window_set_width, 1);
59
+ rb_define_method(rb_cGLFWwindow, "height=", rb_glfw_window_set_height, 1);
60
+
61
+ rb_define_method(rb_cGLFWwindow, "focused?", rb_glfw_window_focused_p, 0);
62
+ rb_define_method(rb_cGLFWwindow, "minimized?", rb_glfw_window_minimized_p, 0);
63
+ rb_define_method(rb_cGLFWwindow, "maximized?", rb_glfw_window_maximized_p, 0);
64
+ rb_define_method(rb_cGLFWwindow, "visible?", rb_glfw_window_visible_p, 0);
65
+ rb_define_method(rb_cGLFWwindow, "resizable?", rb_glfw_window_resizable_p, 0);
66
+ rb_define_method(rb_cGLFWwindow, "decorated?", rb_glfw_window_decorated_p, 0);
67
+ rb_define_method(rb_cGLFWwindow, "topmost?", rb_glfw_window_floating_p, 0);
68
+ rb_define_method(rb_cGLFWwindow, "set_icon", rb_glfw_window_set_icon, -2);
69
+ rb_define_method(rb_cGLFWwindow, "enable_callback", rb_glfw_window_enable_callback, 2);
70
+
71
+ rb_define_method(rb_cGLFWwindow, "aspect_ratio", rb_glfw_window_aspect_ratio, 2);
72
+ rb_define_method(rb_cGLFWwindow, "size_limits", rb_glfw_window_limits, 4);
73
+ rb_define_method(rb_cGLFWwindow, "frame_size", rb_glfw_window_frame_size, 0);
74
+
75
+ rb_define_method(rb_cGLFWwindow, "set_cursor", rb_glfw_window_set_cursor, 1);
76
+ rb_define_method(rb_cGLFWwindow, "cursor_pos", rb_glfw_window_cursor_pos, 0);
77
+ rb_define_method(rb_cGLFWwindow, "set_cursor_pos", rb_glfw_window_set_cursor_pos, 2);
78
+ rb_define_method(rb_cGLFWwindow, "cursor", rb_glfw_window_get_input_cursor, 0);
79
+ rb_define_method(rb_cGLFWwindow, "cursor=", rb_glfw_window_set_input_cursor, 1);
80
+ rb_define_method(rb_cGLFWwindow, "sticky_keys", rb_glfw_window_get_input_sticky_keys, 0);
81
+ rb_define_method(rb_cGLFWwindow, "sticky_keys=", rb_glfw_window_set_input_sticky_keys, 1);
82
+ rb_define_method(rb_cGLFWwindow, "sticky_mouse", rb_glfw_window_get_input_sticky_mouse, 0);
83
+ rb_define_method(rb_cGLFWwindow, "sticky_mouse=", rb_glfw_window_set_input_sticky_mouse, 1);
84
+
85
+ rb_define_method(rb_cGLFWwindow, "key_down?", rb_glfw_window_get_key, 1);
86
+ rb_define_method(rb_cGLFWwindow, "mouse_down?", rb_glfw_window_get_mouse_button, 1);
87
+
88
+ // Callbacks
89
+ RB_CALLBACK(id_moved, "moved");
90
+ RB_CALLBACK(id_refreshed, "resized");
91
+ RB_CALLBACK(id_framebuffer_resized, "framebuffer_resized");
92
+ RB_CALLBACK(id_closing, "closing");
93
+ RB_CALLBACK(id_refreshed, "refreshed");
94
+ RB_CALLBACK(id_focus_changed, "focus_changed");
95
+ RB_CALLBACK(id_minimize_changed, "minimize_changed");
96
+ RB_CALLBACK(id_mouse_move, "mouse_move");
97
+ RB_CALLBACK(id_mouse_scroll, "mouse_scroll");
98
+ RB_CALLBACK(id_mouse_button, "mouse_button");
99
+ RB_CALLBACK(id_mouse_enter, "mouse_enter");
100
+ RB_CALLBACK(id_key, "key");
101
+ RB_CALLBACK(id_char, "char");
102
+ RB_CALLBACK(id_char_mods, "char_mods");
103
+ RB_CALLBACK(id_file_drop, "file_drop");
104
+
105
+ // Alias
106
+ rb_define_alias(rb_cGLFWwindow, "dispose", "destroy");
107
+ rb_define_alias(rb_cGLFWwindow, "iconify", "minimize");
108
+ rb_define_alias(rb_cGLFWwindow, "floating?", "topmost?");
109
+ rb_define_alias(rb_cGLFWwindow, "iconified?", "minimized?");
110
+ rb_define_alias(rb_cGLFWwindow, "iconify_changed", "minimize_changed");
111
+ }
112
+
113
+ static VALUE rb_glfw_window_alloc(VALUE klass) {
114
+ GLFWwindow *w = ruby_xmalloc(SIZEOF_INTPTR_T);
115
+ memset(w, 0, SIZEOF_INTPTR_T);
116
+ return Data_Wrap_Struct(klass, NULL, RUBY_DEFAULT_FREE, w);
117
+ }
118
+
119
+ // initialize(width, height, title = '', **options)
120
+ VALUE rb_glfw_window_initialize(int argc, VALUE *argv, VALUE self) {
121
+ // Initialize GLFW (does nothing and returns immediately if already called)
122
+ glfwInit();
123
+
124
+ GLFWmonitor *mon = NULL;
125
+ GLFWwindow *window, *other = NULL;
126
+
127
+ VALUE width, height, title, options, monitor, share;
128
+
129
+ rb_scan_args(argc, argv, "21:", &width, &height, &title, &options);
130
+ const char *str = NIL_P(title) ? "" : StringValueCStr(title);
131
+
132
+ if (!NIL_P(options)) {
133
+ // Monitor
134
+ if (RTEST(rb_hash_aref(options, STR2SYM("fullscreen")))) {
135
+ mon = glfwGetPrimaryMonitor();
136
+ } else {
137
+ monitor = rb_hash_aref(options, STR2SYM("monitor"));
138
+ if (!NIL_P(monitor))
139
+ Data_Get_Struct(monitor, GLFWmonitor, mon);
140
+ }
141
+
142
+ // Share
143
+ share = rb_hash_aref(options, STR2SYM("share"));
144
+ if (!NIL_P(share))
145
+ Data_Get_Struct(share, GLFWwindow, other);
146
+ }
147
+
148
+ window = glfwCreateWindow(NUM2INT(width), NUM2INT(height), str, mon, other);
149
+ RDATA(self)->data = window;
150
+
151
+ // Store the Ruby VALUE as a "user pointer" to get the Ruby instance from the C struct
152
+ glfwSetWindowUserPointer(window, (void *)self);
153
+
154
+ if (rb_block_given_p()) {
155
+ rb_yield(self);
156
+ glfwDestroyWindow(window);
157
+ }
158
+
159
+ return Qnil;
160
+ }
161
+
162
+ VALUE rb_glfw_window_destroy(VALUE self) {
163
+ WINDOW();
164
+ glfwDestroyWindow(w);
165
+ return self;
166
+ }
167
+
168
+ VALUE rb_glfw_window_show(VALUE self) {
169
+ WINDOW();
170
+ glfwShowWindow(w);
171
+ return self;
172
+ }
173
+
174
+ VALUE rb_glfw_window_hide(VALUE self) {
175
+ WINDOW();
176
+ glfwHideWindow(w);
177
+ return self;
178
+ }
179
+
180
+ VALUE rb_glfw_window_minimize(VALUE self) {
181
+ WINDOW();
182
+ glfwIconifyWindow(w);
183
+ return self;
184
+ }
185
+
186
+ VALUE rb_glfw_window_maximize(VALUE self) {
187
+ WINDOW();
188
+ glfwMaximizeWindow(w);
189
+ return self;
190
+ }
191
+
192
+ VALUE rb_glfw_window_restore(VALUE self) {
193
+ WINDOW();
194
+ glfwRestoreWindow(w);
195
+ return self;
196
+ }
197
+
198
+ VALUE rb_glfw_window_focus(VALUE self) {
199
+ WINDOW();
200
+ glfwFocusWindow(w);
201
+ return self;
202
+ }
203
+
204
+ VALUE rb_glfw_window_swap_buffers(VALUE self) {
205
+ WINDOW();
206
+ glfwSwapBuffers(w);
207
+ return Qnil;
208
+ }
209
+
210
+ VALUE rb_glfw_window_make_current(VALUE self) {
211
+ WINDOW();
212
+ glfwMakeContextCurrent(w);
213
+ return Qnil;
214
+ }
215
+
216
+ VALUE rb_glfw_window_dimensions(VALUE self) {
217
+ WINDOW();
218
+ int x, y, width, height;
219
+ glfwGetWindowPos(w, &x, &y);
220
+ glfwGetWindowSize(w, &width, &height);
221
+ VALUE ary = rb_ary_new_capa(4);
222
+ rb_ary_store(ary, 0, INT2NUM(x));
223
+ rb_ary_store(ary, 1, INT2NUM(y));
224
+ rb_ary_store(ary, 2, INT2NUM(width));
225
+ rb_ary_store(ary, 3, INT2NUM(height));
226
+ return ary;
227
+ }
228
+
229
+ VALUE rb_glfw_window_get_pos(VALUE self) {
230
+ WINDOW();
231
+ int x, y;
232
+ glfwGetWindowPos(*&w, &x, &y);
233
+ VALUE ary = rb_ary_new_capa(2);
234
+ rb_ary_store(ary, 0, INT2NUM(x));
235
+ rb_ary_store(ary, 1, INT2NUM(y));
236
+ return ary;
237
+ }
238
+
239
+ VALUE rb_glfw_window_set_pos(VALUE self, VALUE x, VALUE y) {
240
+ WINDOW();
241
+ glfwSetWindowPos(w, NUM2INT(x), NUM2INT(y));
242
+ return self;
243
+ }
244
+
245
+ VALUE rb_glfw_window_get_size(VALUE self) {
246
+ WINDOW();
247
+ int width, height;
248
+ glfwGetWindowSize(w, &width, &height);
249
+ VALUE ary = rb_ary_new_capa(2);
250
+ rb_ary_store(ary, 0, INT2NUM(width));
251
+ rb_ary_store(ary, 1, INT2NUM(height));
252
+ return ary;
253
+ }
254
+
255
+ VALUE rb_glfw_window_set_size(VALUE self, VALUE width, VALUE height) {
256
+ WINDOW();
257
+ glfwSetWindowSize(w, NUM2INT(width), NUM2INT(height));
258
+ return self;
259
+ }
260
+
261
+ VALUE rb_glfw_window_get_framebuffer_size(VALUE self) {
262
+ WINDOW();
263
+ int width, height;
264
+ glfwGetFramebufferSize(w, &width, &height);
265
+ VALUE ary = rb_ary_new_capa(2);
266
+ rb_ary_store(ary, 0, INT2NUM(width));
267
+ rb_ary_store(ary, 1, INT2NUM(height));
268
+ return ary;
269
+ }
270
+
271
+ VALUE rb_glfw_window_get_x(VALUE self) {
272
+ WINDOW();
273
+ int x;
274
+ glfwGetWindowPos(w, &x, NULL);
275
+ return INT2NUM(x);
276
+ }
277
+
278
+ VALUE rb_glfw_window_get_y(VALUE self) {
279
+ WINDOW();
280
+ int y;
281
+ glfwGetWindowPos(w, NULL, &y);
282
+ return INT2NUM(y);
283
+ }
284
+
285
+ VALUE rb_glfw_window_set_x(VALUE self, VALUE x) {
286
+ WINDOW();
287
+ int y;
288
+ glfwGetWindowSize(w, NULL, &y);
289
+ glfwSetWindowSize(w, NUM2INT(x), y);
290
+ return x;
291
+ }
292
+
293
+ VALUE rb_glfw_window_set_y(VALUE self, VALUE y) {
294
+ WINDOW();
295
+ int x;
296
+ glfwGetWindowSize(w, &x, NULL);
297
+ glfwSetWindowSize(w, x, NUM2INT(y));
298
+ return y;
299
+ }
300
+
301
+ VALUE rb_glfw_window_get_width(VALUE self) {
302
+ WINDOW();
303
+ int width;
304
+ glfwGetWindowSize(w, &width, NULL);
305
+ return INT2NUM(width);
306
+ }
307
+
308
+ VALUE rb_glfw_window_get_height(VALUE self) {
309
+ WINDOW();
310
+ int height;
311
+ glfwGetWindowSize(w, NULL, &height);
312
+ return INT2NUM(height);
313
+ }
314
+
315
+ VALUE rb_glfw_window_set_width(VALUE self, VALUE width) {
316
+ WINDOW();
317
+ int height;
318
+ glfwGetWindowSize(w, NULL, &height);
319
+ glfwSetWindowSize(w, NUM2INT(width), height);
320
+ return width;
321
+ }
322
+
323
+ VALUE rb_glfw_window_set_height(VALUE self, VALUE height) {
324
+ WINDOW();
325
+ int width;
326
+ glfwGetWindowSize(w, &width, NULL);
327
+ glfwSetWindowSize(w, width, NUM2INT(height));
328
+ return height;
329
+ }
330
+
331
+ VALUE rb_glfw_window_closing_p(VALUE self) {
332
+ WINDOW();
333
+ return glfwWindowShouldClose(w) ? Qtrue : Qfalse;
334
+ }
335
+
336
+ VALUE rb_glfw_window_close(int argc, VALUE *argv, VALUE self) {
337
+ WINDOW();
338
+ switch (argc) {
339
+ case 0:
340
+ glfwSetWindowShouldClose(w, 1);
341
+ break;
342
+ case 1:
343
+ glfwSetWindowShouldClose(w, RTEST(argv[0]));
344
+ break;
345
+ default:
346
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 0, 1)", argc);
347
+ break;
348
+ }
349
+ return self;
350
+ }
351
+
352
+ VALUE rb_glfw_window_get_monitor(VALUE self) {
353
+ WINDOW();
354
+ GLFWmonitor *monitor = glfwGetWindowMonitor(w);
355
+ return Data_Wrap_Struct(rb_cGLFWmonitor, NULL, RUBY_DEFAULT_FREE, monitor);
356
+ }
357
+
358
+ VALUE rb_glfw_window_set_monitor(int argc, VALUE *argv, VALUE self) {
359
+ WINDOW();
360
+ switch (argc) {
361
+ case 2: // monitor, refresh_rate (fullscreen)
362
+ {
363
+ GLFWmonitor *m = NULL;
364
+ Data_Get_Struct(argv[0], GLFWmonitor, m);
365
+ glfwSetWindowMonitor(w, m, 0, 0, 0, 0, NUM2INT(argv[1]));
366
+ break;
367
+ }
368
+ case 4: // x, y, width, height (windowed)
369
+ {
370
+ int mx = NUM2INT(argv[0]), my = NUM2INT(argv[1]), mw = NUM2INT(argv[2]), mh = NUM2INT(argv[3]);
371
+ glfwSetWindowMonitor(w, NULL, mx, my, mw, mh, 0);
372
+ break;
373
+ }
374
+ default:
375
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 2, 4)", argc);
376
+ break;
377
+ }
378
+ return self;
379
+ }
380
+
381
+ VALUE rb_glfw_window_set_title(VALUE self, volatile VALUE title) {
382
+ WINDOW();
383
+ const char *str = rb_string_value_cstr(&title);
384
+ glfwSetWindowTitle(w, str);
385
+ return title;
386
+ }
387
+
388
+ VALUE rb_glfw_window_focused_p(VALUE self) {
389
+ WINDOW();
390
+ return glfwGetWindowAttrib(w, GLFW_FOCUSED) ? Qtrue : Qfalse;
391
+ }
392
+
393
+ VALUE rb_glfw_window_minimized_p(VALUE self) {
394
+ WINDOW();
395
+ return glfwGetWindowAttrib(w, GLFW_ICONIFIED) ? Qtrue : Qfalse;
396
+ }
397
+
398
+ VALUE rb_glfw_window_maximized_p(VALUE self) {
399
+ WINDOW();
400
+ return glfwGetWindowAttrib(w, GLFW_MAXIMIZED) ? Qtrue : Qfalse;
401
+ }
402
+
403
+ VALUE rb_glfw_window_visible_p(VALUE self) {
404
+ WINDOW();
405
+ return glfwGetWindowAttrib(w, GLFW_VISIBLE) ? Qtrue : Qfalse;
406
+ }
407
+
408
+ VALUE rb_glfw_window_resizable_p(VALUE self) {
409
+ WINDOW();
410
+ return glfwGetWindowAttrib(w, GLFW_RESIZABLE) ? Qtrue : Qfalse;
411
+ }
412
+
413
+ VALUE rb_glfw_window_decorated_p(VALUE self) {
414
+ WINDOW();
415
+ return glfwGetWindowAttrib(w, GLFW_DECORATED) ? Qtrue : Qfalse;
416
+ }
417
+
418
+ VALUE rb_glfw_window_floating_p(VALUE self) {
419
+ WINDOW();
420
+ return glfwGetWindowAttrib(w, GLFW_FLOATING) ? Qtrue : Qfalse;
421
+ }
422
+
423
+ VALUE rb_glfw_window_aspect_ratio(VALUE self, VALUE numerator, VALUE denominator) {
424
+ WINDOW();
425
+ glfwSetWindowAspectRatio(w, NUM2INT(numerator), NUM2INT(denominator));
426
+ return Qnil;
427
+ }
428
+
429
+ VALUE rb_glfw_window_limits(VALUE self, VALUE minWidth, VALUE minHeight, VALUE maxWidth, VALUE maxHeight) {
430
+ WINDOW();
431
+ glfwSetWindowSizeLimits(w, NUM2INT(minWidth), NUM2INT(minHeight), NUM2INT(maxWidth), NUM2INT(maxHeight));
432
+ return Qnil;
433
+ }
434
+
435
+ VALUE rb_glfw_window_frame_size(VALUE self) {
436
+ WINDOW();
437
+ int left, top, right, bottom;
438
+ glfwGetWindowFrameSize(w, &left, &top, &right, &bottom);
439
+ VALUE ary = rb_ary_new_capa(4);
440
+ rb_ary_store(ary, 0, INT2NUM(left));
441
+ rb_ary_store(ary, 1, INT2NUM(top));
442
+ rb_ary_store(ary, 2, INT2NUM(right));
443
+ rb_ary_store(ary, 3, INT2NUM(bottom));
444
+ return ary;
445
+ }
446
+
447
+ VALUE rb_glfw_window_get_clipboard(VALUE self) {
448
+ WINDOW();
449
+ const char *str = glfwGetClipboardString(w);
450
+ return rb_utf8_str_new_cstr(str);
451
+ }
452
+
453
+ VALUE rb_glfw_window_set_clipboard(VALUE self, VALUE str) {
454
+ WINDOW();
455
+ volatile VALUE utf8 = rb_funcall(str, rb_intern("encode"), 1, rb_str_new_cstr("utf-8"));
456
+ glfwSetClipboardString(w, StringValueCStr(utf8));
457
+ return str;
458
+ }
459
+
460
+ VALUE rb_glfw_window_set_icon(VALUE self, VALUE args) {
461
+ WINDOW();
462
+ int argc = rb_array_len(args);
463
+ GLFWimage *images = malloc(sizeof(GLFWimage) * argc);
464
+
465
+ for (int i = 0; i < argc; i++) {
466
+ VALUE img = rb_ary_entry(args, i);
467
+ images[i] = *(GLFWimage *)RDATA(img)->data;
468
+ }
469
+
470
+ glfwSetWindowIcon(w, argc, images);
471
+
472
+ free(images);
473
+ return self;
474
+ }
475
+
476
+ VALUE rb_glfw_window_get_input_cursor(VALUE self) {
477
+ WINDOW();
478
+ return INT2BOOL(glfwGetInputMode(w, GLFW_CURSOR));
479
+ }
480
+
481
+ VALUE rb_glfw_window_set_input_cursor(VALUE self, VALUE value) {
482
+ WINDOW();
483
+ glfwSetInputMode(w, GLFW_CURSOR, RTEST(value));
484
+ return value;
485
+ }
486
+
487
+ VALUE rb_glfw_window_get_input_sticky_keys(VALUE self) {
488
+ WINDOW();
489
+ return INT2BOOL(glfwGetInputMode(w, GLFW_STICKY_KEYS));
490
+ }
491
+
492
+ VALUE rb_glfw_window_set_input_sticky_keys(VALUE self, VALUE value) {
493
+ WINDOW();
494
+ glfwSetInputMode(w, GLFW_STICKY_KEYS, RTEST(value));
495
+ return value;
496
+ }
497
+
498
+ VALUE rb_glfw_window_get_input_sticky_mouse(VALUE self) {
499
+ WINDOW();
500
+ return INT2BOOL(glfwGetInputMode(w, GLFW_STICKY_MOUSE_BUTTONS));
501
+ }
502
+
503
+ VALUE rb_glfw_window_set_input_sticky_mouse(VALUE self, VALUE value) {
504
+ WINDOW();
505
+ glfwSetInputMode(w, GLFW_STICKY_MOUSE_BUTTONS, RTEST(value));
506
+ return value;
507
+ }
508
+
509
+ VALUE rb_glfw_window_cursor_pos(VALUE self) {
510
+ WINDOW();
511
+ double x, y;
512
+ glfwGetCursorPos(w, &x, &y);
513
+ VALUE ary = rb_ary_new_capa(2);
514
+ rb_ary_store(ary, 0, DBL2NUM(x));
515
+ rb_ary_store(ary, 1, DBL2NUM(y));
516
+ return ary;
517
+ }
518
+
519
+ VALUE rb_glfw_window_set_cursor_pos(VALUE self, VALUE x, VALUE y) {
520
+ WINDOW();
521
+ glfwSetCursorPos(w, NUM2DBL(x), NUM2DBL(y));
522
+ return self;
523
+ }
524
+
525
+ VALUE rb_glfw_window_set_cursor(VALUE self, VALUE cursor) {
526
+ WINDOW();
527
+ GLFWcursor *c;
528
+ Data_Get_Struct(cursor, GLFWcursor, c);
529
+ glfwSetCursor(w, c);
530
+ return self;
531
+ }
532
+
533
+ VALUE rb_glfw_window_get_key(VALUE self, VALUE key) {
534
+ WINDOW();
535
+ return RTEST(glfwGetKey(w, NUM2INT(key)));
536
+ }
537
+
538
+ VALUE rb_glfw_window_get_mouse_button(VALUE self, VALUE mbtn) {
539
+ WINDOW();
540
+ return RTEST(glfwGetMouseButton(w, NUM2INT(mbtn)));
541
+ }
542
+
543
+ /////////////////////////////////////////////////////////////////////////////
544
+ // Callbacks
545
+ /////////////////////////////////////////////////////////////////////////////
546
+
547
+ VALUE rb_glfw_window_empty_method(int argc, VALUE *argv, VALUE self) {
548
+ // Empty method stub, as NULL causes segfaults
549
+ return Qnil;
550
+ }
551
+
552
+ VALUE rb_glfw_window_enable_callback(VALUE self, VALUE cbtype, VALUE enable) {
553
+ WINDOW();
554
+ enum GLFW_RB_CALLBACK_TYPE type = NUM2INT(cbtype);
555
+ int state = RTEST(enable);
556
+ switch (type) {
557
+ case GLFW_RB_MOVED:
558
+ glfwSetWindowPosCallback(w, state ? rb_glfw_window_moved : NULL);
559
+ break;
560
+ case GLFW_RB_RESIZED:
561
+ glfwSetWindowSizeCallback(w, state ? rb_glfw_window_resized : NULL);
562
+ break;
563
+ case GLFW_RB_FRAMEBUFFER_RESIZED:
564
+ glfwSetFramebufferSizeCallback(w, state ? rb_glfw_window_frame_buffer_resized : NULL);
565
+ break;
566
+ case GLFW_RB_CLOSING:
567
+ glfwSetWindowCloseCallback(w, state ? rb_glfw_window_closing : NULL);
568
+ break;
569
+ case GLFW_RB_REFRESHED:
570
+ glfwSetWindowRefreshCallback(w, state ? rb_glfw_window_refreshed : NULL);
571
+ break;
572
+ case GLFW_RB_FOCUS_CHANGED:
573
+ glfwSetWindowFocusCallback(w, state ? rb_glfw_window_focus_changed : NULL);
574
+ break;
575
+ case GLFW_RB_MINIMIZE_CHANGED:
576
+ glfwSetWindowIconifyCallback(w, state ? rb_glfw_window_minimize_changed : NULL);
577
+ break;
578
+ case GLFW_RB_MOUSE_MOVE:
579
+ glfwSetCursorPosCallback(w, state ? rb_glfw_window_cursor_mouse_move : NULL);
580
+ break;
581
+ case GLFW_RB_MOUSE_SCROLL:
582
+ glfwSetScrollCallback(w, state ? rb_glfw_window_cursor_mouse_scroll : NULL);
583
+ break;
584
+ case GLFW_RB_MOUSE_BUTTON:
585
+ glfwSetMouseButtonCallback(w, state ? rb_glfw_window_cursor_mouse_button : NULL);
586
+ break;
587
+ case GLFW_RB_MOUSE_ENTER:
588
+ glfwSetCursorEnterCallback(w, state ? rb_glfw_window_mouse_enter : NULL);
589
+ break;
590
+ case GLFW_RB_KEY:
591
+ glfwSetKeyCallback(w, state ? rb_glfw_window_key : NULL);
592
+ break;
593
+ case GLFW_RB_CHAR:
594
+ glfwSetCharCallback(w, state ? rb_glfw_window_char : NULL);
595
+ break;
596
+ case GLFW_RB_CHAR_MODS:
597
+ glfwSetCharModsCallback(w, state ? rb_glfw_window_char_mods : NULL);
598
+ break;
599
+ case GLFW_RB_FILE_DROP:
600
+ glfwSetDropCallback(w, state ? rb_glfw_window_file_drop : NULL);
601
+ break;
602
+ default:
603
+ rb_raise(rb_eArgError, "invalid callback identifier - %d", type);
604
+ break;
605
+ }
606
+
607
+ return Qnil;
608
+ }
609
+
610
+ static void rb_glfw_window_closing(GLFWwindow *window) {
611
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
612
+ if (RTEST(w))
613
+ rb_funcall(w, id_closing, 0);
614
+ }
615
+
616
+ static void rb_glfw_window_moved(GLFWwindow *window, int x, int y) {
617
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
618
+ if (RTEST(w))
619
+ rb_funcall(w, id_moved, 2, INT2NUM(x), INT2NUM(y));
620
+ }
621
+
622
+ static void rb_glfw_window_resized(GLFWwindow *window, int width, int height) {
623
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
624
+ if (RTEST(w))
625
+ rb_funcall(w, id_resized, 2, INT2NUM(width), INT2NUM(height));
626
+ }
627
+
628
+ static void rb_glfw_window_refreshed(GLFWwindow *window) {
629
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
630
+ if (RTEST(w))
631
+ rb_funcall(w, id_refreshed, 0);
632
+ }
633
+
634
+ static void rb_glfw_window_focus_changed(GLFWwindow *window, int focused) {
635
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
636
+ if (RTEST(w))
637
+ rb_funcall(w, id_focus_changed, 1, INT2BOOL(focused));
638
+ }
639
+
640
+ static void rb_glfw_window_minimize_changed(GLFWwindow *window, int minimized) {
641
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
642
+ if (RTEST(w))
643
+ rb_funcall(w, id_minimize_changed, 1, INT2BOOL(minimized));
644
+ }
645
+
646
+ static void rb_glfw_window_frame_buffer_resized(GLFWwindow *window, int width, int height) {
647
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
648
+ if (RTEST(w))
649
+ rb_funcall(w, id_framebuffer_resized, 2, INT2NUM(width), INT2NUM(height));
650
+ }
651
+
652
+ static void rb_glfw_window_cursor_mouse_move(GLFWwindow *window, double x, double y) {
653
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
654
+ if (RTEST(w))
655
+ rb_funcall(w, id_mouse_move, 2, DBL2NUM(x), DBL2NUM(y));
656
+ }
657
+
658
+ static void rb_glfw_window_cursor_mouse_button(GLFWwindow *window, int button, int action, int mods) {
659
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
660
+ if (RTEST(w))
661
+ rb_funcall(w, id_mouse_button, 3, INT2NUM(button), INT2NUM(action), INT2NUM(mods));
662
+ }
663
+
664
+ static void rb_glfw_window_cursor_mouse_scroll(GLFWwindow *window, double xoffset, double yoffset) {
665
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
666
+ if (RTEST(w))
667
+ rb_funcall(w, id_mouse_scroll, 2, DBL2NUM(xoffset), DBL2NUM(yoffset));
668
+ }
669
+
670
+ static void rb_glfw_window_mouse_enter(GLFWwindow *window, int entered) {
671
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
672
+ if (RTEST(w))
673
+ rb_funcall(w, id_mouse_enter, 1, INT2BOOL(entered));
674
+ }
675
+
676
+ static void rb_glfw_window_key(GLFWwindow *window, int key, int scancode, int action, int mods) {
677
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
678
+ if (RTEST(w))
679
+ rb_funcall(w, id_key, 4, INT2NUM(key), INT2NUM(scancode), INT2NUM(action), INT2NUM(mods));
680
+ }
681
+
682
+ static void rb_glfw_window_char(GLFWwindow *window, unsigned int codepoint) {
683
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
684
+ if (RTEST(w))
685
+ rb_funcall(w, id_char, 1, UINT2NUM(codepoint));
686
+ }
687
+
688
+ static void rb_glfw_window_char_mods(GLFWwindow *window, unsigned int codepoint, int mods) {
689
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
690
+ if (RTEST(w))
691
+ rb_funcall(w, id_char_mods, 2, UINT2NUM(codepoint), INT2NUM(mods));
692
+ }
693
+
694
+ static void rb_glfw_window_file_drop(GLFWwindow *window, int count, const char **files) {
695
+ VALUE w = (VALUE)glfwGetWindowUserPointer(window);
696
+ if (RTEST(w)) {
697
+ VALUE ary = rb_ary_new_capa(count);
698
+ for (int i = 0; i < count; i++) {
699
+ char *pos = strchr(files[i], '\\');
700
+ while (pos) {
701
+ *pos = '/';
702
+ pos = strchr(pos, '\\');
703
+ }
704
+ rb_ary_store(ary, i, rb_utf8_str_new_cstr(files[i]));
705
+ }
706
+ rb_funcall(w, id_file_drop, 1, ary);
707
+ }
708
+ }