glfw 1.0.3 → 3.3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +161 -0
  3. data/.yardopts +6 -0
  4. data/Gemfile +2 -4
  5. data/README.md +29 -33
  6. data/Rakefile +6 -4
  7. data/ext/glfw/common.c +159 -0
  8. data/ext/glfw/cursor.c +34 -30
  9. data/ext/glfw/extconf.rb +7 -17
  10. data/ext/glfw/glfw.c +122 -377
  11. data/ext/glfw/glfw.h +46 -41
  12. data/ext/glfw/image.c +96 -64
  13. data/ext/glfw/joystick.c +169 -0
  14. data/ext/glfw/monitor.c +231 -155
  15. data/ext/glfw/stb_image.h +7656 -0
  16. data/ext/glfw/window.c +708 -576
  17. data/glfw.gemspec +10 -9
  18. data/lib/glfw.rb +4 -14
  19. data/lib/glfw/constants.rb +365 -0
  20. data/lib/glfw/stubs.rb +234 -0
  21. data/lib/glfw/stubs/cursor.rb +21 -0
  22. data/lib/glfw/stubs/gamepad_state.rb +30 -0
  23. data/lib/glfw/stubs/image.rb +39 -0
  24. data/lib/glfw/stubs/joystick.rb +125 -0
  25. data/lib/glfw/stubs/monitor.rb +115 -0
  26. data/lib/glfw/stubs/video_mode.rb +32 -0
  27. data/lib/glfw/stubs/window.rb +626 -0
  28. data/lib/glfw/version.rb +8 -1
  29. metadata +31 -35
  30. data/.travis.yml +0 -5
  31. data/Makefile +0 -267
  32. data/ext/glfw/common.h +0 -46
  33. data/ext/glfw/cursor.h +0 -14
  34. data/ext/glfw/glfw3.h +0 -4248
  35. data/ext/glfw/glfw3native.h +0 -456
  36. data/ext/glfw/image.h +0 -14
  37. data/ext/glfw/ming32/WINDOWS USERS PLACE libglf3.a HERE.txt b/data/ext/glfw/ming32/WINDOWS USERS PLACE libglf3.a → HERE.txt +0 -0
  38. data/ext/glfw/ming64/WINDOWS USERS PLACE libglf3.a HERE.txt b/data/ext/glfw/ming64/WINDOWS USERS PLACE libglf3.a → HERE.txt +0 -0
  39. data/ext/glfw/monitor.h +0 -29
  40. data/ext/glfw/video_mode.c +0 -60
  41. data/ext/glfw/video_mode.h +0 -21
  42. data/ext/glfw/vulkan.c +0 -48
  43. data/ext/glfw/vulkan.h +0 -16
  44. data/ext/glfw/window.h +0 -87
@@ -1,42 +1,46 @@
1
1
 
2
- #include "cursor.h"
2
+ #include "glfw.h"
3
3
 
4
- VALUE rb_cGLFWcursor;
4
+ VALUE cCursor;
5
5
 
6
- void Init_glfw_cursor(VALUE module) {
7
- rb_cGLFWcursor = rb_define_class_under(module, "Cursor", rb_cObject);
8
- rb_define_alloc_func(rb_cGLFWcursor, rb_glfw_cursor_alloc);
9
-
10
- rb_define_method(rb_cGLFWcursor, "initialize", rb_glfw_cursor_initialize, 3);
11
- rb_define_method(rb_cGLFWcursor, "destroy", rb_glfw_cursor_destroy, 0);
12
-
13
- rb_define_alias(rb_cGLFWcursor, "dispose", "destroy");
14
-
15
- rb_define_singleton_method(rb_cGLFWcursor, "create", rb_glfw_cursor_standard, 1);
16
- }
17
-
18
- static VALUE rb_glfw_cursor_alloc(VALUE klass) {
19
- GLFWcursor *c = ruby_xmalloc(SIZEOF_INTPTR_T);
20
- memset(c, 0, SIZEOF_INTPTR_T);
21
- return Data_Wrap_Struct(klass, NULL, RUBY_DEFAULT_FREE, c);
6
+ static void rb_glfw_cursor_free(void *cursor)
7
+ {
8
+ if (cursor)
9
+ glfwDestroyCursor(cursor);
22
10
  }
23
11
 
24
- VALUE rb_glfw_cursor_initialize(VALUE self, VALUE image, VALUE xhot, VALUE yhot) {
25
- GLFWimage *img;
26
- Data_Get_Struct(image, GLFWimage, img);
27
- RDATA(self)->data = glfwCreateCursor(img, NUM2INT(xhot), NUM2INT(yhot));
28
- return Qnil;
12
+ static VALUE rb_glfw_cursor_alloc(VALUE klass)
13
+ {
14
+ return Data_Wrap_Struct(klass, NULL, rb_glfw_cursor_free, NULL);
29
15
  }
30
16
 
31
- VALUE rb_glfw_cursor_standard(VALUE klass, VALUE shape) {
32
- GLFWcursor *cursor = glfwCreateStandardCursor(NUM2INT(shape));
33
- return Data_Wrap_Struct(klass, NULL, RUBY_DEFAULT_FREE, cursor);
34
- }
17
+ static VALUE rb_glfw_cursor_initialize(int argc, VALUE *argv, VALUE self)
18
+ {
19
+ VALUE img, x, y;
20
+ rb_scan_args(argc, argv, "12", &img, &x, &y);
35
21
 
36
- VALUE rb_glfw_cursor_destroy(VALUE self) {
37
22
  GLFWcursor *cursor;
38
- Data_Get_Struct(self, GLFWcursor, cursor);
39
23
 
40
- glfwDestroyCursor(cursor);
24
+ if (RB_TYPE_P(img, T_DATA))
25
+ {
26
+ GLFWimage *image = DATA_PTR(img);
27
+ int xhot = RTEST(x) ? NUM2INT(x) : 0;
28
+ int yhot = RTEST(y) ? NUM2INT(y) : 0;
29
+ cursor = glfwCreateCursor(image, xhot, yhot);
30
+ }
31
+ else
32
+ {
33
+ int shape = NUM2INT(img);
34
+ cursor = glfwCreateStandardCursor(shape);
35
+ }
36
+
37
+ RDATA(self)->data = cursor;
41
38
  return Qnil;
42
39
  }
40
+
41
+ void rb_glfw_cursor_init(void) {
42
+ cCursor = rb_define_class_under(mGLFW, "Cursor", rb_cObject);
43
+
44
+ rb_define_method(cCursor, "initialize", rb_glfw_cursor_initialize, -1);
45
+ rb_define_alloc_func(cCursor, rb_glfw_cursor_alloc);
46
+ }
@@ -1,21 +1,11 @@
1
1
  require "mkmf"
2
+ require 'rbconfig'
2
3
 
3
-
4
- headers = [RbConfig::CONFIG['includedir'], File.dirname(__FILE__)]
5
- libdirs = [RbConfig::CONFIG['libdir']]
6
-
7
- dir = 0.size == 4 ? 'ming32' : 'ming64'
8
- libdirs << File.expand_path(File.join(File.dirname(__FILE__), dir))
9
-
10
- case RbConfig::CONFIG['host_os']
11
- when /mingw/
12
- $LOCAL_LIBS << '-lglfw3 -lgdi32 -lopengl32'
13
- when /darwin/
14
- find_library("glfw", "glfwInit")
15
- when /linux/
16
- find_library("glfw", "glfwInit")
4
+ def libname
5
+ host = RbConfig::CONFIG['host_os']
6
+ return 'glfw3' if /mswin|msys|mingw|cygwin|bccwin|wince|emc/.match?(host)
7
+ 'glfw'
17
8
  end
18
9
 
19
- dir_config('glfw', headers, libdirs)
20
-
21
- create_makefile("glfw/glfw")
10
+ abort('Unable to locate GLFW library') unless find_library(libname, 'glfwInit')
11
+ create_makefile("glfw/glfw")
@@ -1,438 +1,183 @@
1
1
  #include "glfw.h"
2
2
 
3
- VALUE rb_mGLFW;
4
- VALUE rb_eGLFWError;
3
+ VALUE mGLFW;
4
+ VALUE eGLFWError;
5
5
 
6
- // TODO: Window class, internal loop timing to reduce overhead
7
-
8
- void Init_glfw(void) {
9
-
10
- glfwSetErrorCallback(rb_glfw_error_callback);
11
- rb_mGLFW = rb_define_module("GLFW");
12
- rb_eGLFWError = rb_define_class_under(rb_mGLFW, "GLFWError", rb_eStandardError);
13
-
14
- Init_glfw_window(rb_mGLFW);
15
- Init_glfw_monitor(rb_mGLFW);
16
- Init_glfw_vidmode(rb_mGLFW);
17
- Init_glfw_image(rb_mGLFW);
18
- Init_glfw_cursor(rb_mGLFW);
19
- Init_glfw_vulkan(rb_mGLFW);
20
-
21
- // GLFW Module Functions
22
- rb_define_singleton_method(rb_mGLFW, "init", rb_glfw_init, 0);
23
- rb_define_singleton_method(rb_mGLFW, "terminate", rb_glfw_terminate, 0);
24
- rb_define_singleton_method(rb_mGLFW, "poll_events", rb_glfw_poll_events, 0);
25
- rb_define_singleton_method(rb_mGLFW, "wait_events", rb_glfw_wait_events, 0);
26
- rb_define_singleton_method(rb_mGLFW, "post_empty_event", rb_glfw_post_empty, 0);
27
- rb_define_singleton_method(rb_mGLFW, "swap_interval", rb_glfw_swap_interval, 1);
28
- rb_define_singleton_method(rb_mGLFW, "current_context", rb_glfw_current_context, 0);
29
- rb_define_singleton_method(rb_mGLFW, "supported?", rb_glfw_supported_p, 1);
30
- rb_define_singleton_method(rb_mGLFW, "time", rb_glfw_get_time, 0);
31
- rb_define_singleton_method(rb_mGLFW, "time=", rb_glfw_set_time, 1);
32
- rb_define_singleton_method(rb_mGLFW, "monitors", rb_glfw_monitors, 0);
33
- rb_define_singleton_method(rb_mGLFW, "load_default_hints", rb_glfw_load_default_hints, 0);
34
- rb_define_singleton_method(rb_mGLFW, "hint", rb_glfw_window_hint, 2);
35
- rb_define_singleton_method(rb_mGLFW, "key_name", rb_glfw_key_name, 2);
36
- rb_define_singleton_method(rb_mGLFW, "timer_frequency", rb_glfw_timer_frequency, 0);
37
- rb_define_singleton_method(rb_mGLFW, "timer_value", rb_glfw_timer_value, 0);
38
- rb_define_singleton_method(rb_mGLFW, "monitor_changed", rb_glfw_monitor_changed, 2);
39
- rb_define_singleton_method(rb_mGLFW, "joystick_changed", rb_glfw_joystick_changed, 2);
40
- rb_define_singleton_method(rb_mGLFW, "proc_address", rb_glfw_proc_address, 1);
41
-
42
- // API Version
43
- rb_define_const(rb_mGLFW, "API_VERSION", rb_sprintf("%d.%d.%d",
44
- GLFW_VERSION_MAJOR, GLFW_VERSION_MINOR, GLFW_VERSION_REVISION));
45
- rb_define_const(rb_mGLFW, "API_VERSION_MAJOR", INT2NUM(GLFW_VERSION_MAJOR));
46
- rb_define_const(rb_mGLFW, "API_VERSION_MINOR", INT2NUM(GLFW_VERSION_MINOR));
47
- rb_define_const(rb_mGLFW, "API_VERSION_REVISION", INT2NUM(GLFW_VERSION_REVISION));
48
- rb_define_const(rb_mGLFW, "API_DESCRIPTION", rb_str_new_cstr(glfwGetVersionString()));
49
- // Callback Types
50
- rb_define_const(rb_mGLFW, "CB_MOVED", INT2NUM(GLFW_RB_MOVED));
51
- rb_define_const(rb_mGLFW, "CB_RESIZED", INT2NUM(GLFW_RB_RESIZED));
52
- rb_define_const(rb_mGLFW, "CB_FRAMEBUFFER_RESIZED", INT2NUM(GLFW_RB_FRAMEBUFFER_RESIZED));
53
- rb_define_const(rb_mGLFW, "CB_CLOSING", INT2NUM(GLFW_RB_CLOSING));
54
- rb_define_const(rb_mGLFW, "CB_REFRESHED", INT2NUM(GLFW_RB_REFRESHED));
55
- rb_define_const(rb_mGLFW, "CB_FOCUS_CHANGED", INT2NUM(GLFW_RB_FOCUS_CHANGED));
56
- rb_define_const(rb_mGLFW, "CB_MINIMIZE_CHANGED", INT2NUM(GLFW_RB_MINIMIZE_CHANGED));
57
- rb_define_const(rb_mGLFW, "CB_MOUSE_MOVE", INT2NUM(GLFW_RB_MOUSE_MOVE));
58
- rb_define_const(rb_mGLFW, "CB_MOUSE_SCROLL", INT2NUM(GLFW_RB_MOUSE_SCROLL));
59
- rb_define_const(rb_mGLFW, "CB_MOUSE_BUTTON", INT2NUM(GLFW_RB_MOUSE_BUTTON));
60
- rb_define_const(rb_mGLFW, "CB_MOUSE_ENTER", INT2NUM(GLFW_RB_MOUSE_ENTER));
61
- rb_define_const(rb_mGLFW, "CB_KEY", INT2NUM(GLFW_RB_KEY));
62
- rb_define_const(rb_mGLFW, "CB_CHAR", INT2NUM(GLFW_RB_CHAR));
63
- rb_define_const(rb_mGLFW, "CB_CHAR_MODS", INT2NUM(GLFW_RB_CHAR_MODS));
64
- rb_define_const(rb_mGLFW, "CB_FILE_DROP", INT2NUM(GLFW_RB_FILE_DROP));
65
- rb_define_const(rb_mGLFW, "CB_MONITOR", INT2NUM(GLFW_RB_MONITOR));
66
- rb_define_const(rb_mGLFW, "CB_JOYSTICK", INT2NUM(GLFW_RB_JOYSTICK));
67
- // Input Modes
68
- rb_define_const(rb_mGLFW, "INPUT_PRESS", INT2NUM(GLFW_PRESS));
69
- rb_define_const(rb_mGLFW, "INPUT_RELEASE", INT2NUM(GLFW_RELEASE));
70
- rb_define_const(rb_mGLFW, "INPUT_REPEAT", INT2NUM(GLFW_REPEAT));
71
- // Hints
72
- rb_define_const(rb_mGLFW, "HINT_RESIZABLE", INT2NUM(GLFW_RESIZABLE));
73
- rb_define_const(rb_mGLFW, "HINT_VISIBLE", INT2NUM(GLFW_VISIBLE));
74
- rb_define_const(rb_mGLFW, "HINT_DECORATED", INT2NUM(GLFW_DECORATED));
75
- rb_define_const(rb_mGLFW, "HINT_FOCUSED", INT2NUM(GLFW_FOCUSED));
76
- rb_define_const(rb_mGLFW, "HINT_AUTO_ICONIFY", INT2NUM(GLFW_AUTO_ICONIFY));
77
- rb_define_const(rb_mGLFW, "HINT_FLOATING", INT2NUM(GLFW_FLOATING));
78
- rb_define_const(rb_mGLFW, "HINT_MAXIMIZED", INT2NUM(GLFW_MAXIMIZED));
79
- rb_define_const(rb_mGLFW, "HINT_RED_BITS", INT2NUM(GLFW_RED_BITS));
80
- rb_define_const(rb_mGLFW, "HINT_GREEN_BITS", INT2NUM(GLFW_GREEN_BITS));
81
- rb_define_const(rb_mGLFW, "HINT_BLUE_BITS", INT2NUM(GLFW_BLUE_BITS));
82
- rb_define_const(rb_mGLFW, "HINT_ALPHA_BITS", INT2NUM(GLFW_ALPHA_BITS));
83
- rb_define_const(rb_mGLFW, "HINT_DEPTH_BITS", INT2NUM(GLFW_DEPTH_BITS));
84
- rb_define_const(rb_mGLFW, "HINT_STENCIL_BITS", INT2NUM(GLFW_STENCIL_BITS));
85
- rb_define_const(rb_mGLFW, "HINT_ACCUM_RED_BITS", INT2NUM(GLFW_ACCUM_RED_BITS));
86
- rb_define_const(rb_mGLFW, "HINT_ACCUM_GREEN_BITS", INT2NUM(GLFW_ACCUM_GREEN_BITS));
87
- rb_define_const(rb_mGLFW, "HINT_ACCUM_BLUE_BITS", INT2NUM(GLFW_ACCUM_BLUE_BITS));
88
- rb_define_const(rb_mGLFW, "HINT_ACCUM_ALPHA_BITS", INT2NUM(GLFW_ACCUM_ALPHA_BITS));
89
- rb_define_const(rb_mGLFW, "HINT_AUX_BUFFERS", INT2NUM(GLFW_AUX_BUFFERS));
90
- rb_define_const(rb_mGLFW, "HINT_SAMPLES", INT2NUM(GLFW_SAMPLES));
91
- rb_define_const(rb_mGLFW, "HINT_REFRESH_RATE", INT2NUM(GLFW_REFRESH_RATE));
92
- rb_define_const(rb_mGLFW, "HINT_STEREO", INT2NUM(GLFW_STEREO));
93
- rb_define_const(rb_mGLFW, "HINT_SRGB_CAPABLE", INT2NUM(GLFW_SRGB_CAPABLE));
94
- rb_define_const(rb_mGLFW, "HINT_DOUBLEBUFFER", INT2NUM(GLFW_DOUBLEBUFFER));
95
- rb_define_const(rb_mGLFW, "HINT_CLIENT_API", INT2NUM(GLFW_CLIENT_API));
96
- rb_define_const(rb_mGLFW, "HINT_CONTEXT_CREATION_API", INT2NUM(GLFW_CONTEXT_CREATION_API));
97
- rb_define_const(rb_mGLFW, "HINT_CONTEXT_VERSION_MAJOR", INT2NUM(GLFW_CONTEXT_VERSION_MAJOR));
98
- rb_define_const(rb_mGLFW, "HINT_CONTEXT_VERSION_MINOR", INT2NUM(GLFW_CONTEXT_VERSION_MINOR));
99
- rb_define_const(rb_mGLFW, "HINT_CONTEXT_ROBUSTNESS", INT2NUM(GLFW_CONTEXT_ROBUSTNESS));
100
- rb_define_const(rb_mGLFW, "HINT_CONTEXT_RELEASE_BEHAVIOR", INT2NUM(GLFW_CONTEXT_RELEASE_BEHAVIOR));
101
- rb_define_const(rb_mGLFW, "HINT_OPENGL_FORWARD_COMPAT", INT2NUM(GLFW_OPENGL_FORWARD_COMPAT));
102
- rb_define_const(rb_mGLFW, "HINT_OPENGL_DEBUG_CONTEXT", INT2NUM(GLFW_OPENGL_DEBUG_CONTEXT));
103
- rb_define_const(rb_mGLFW, "HINT_OPENGL_PROFILE", INT2NUM(GLFW_OPENGL_PROFILE));
104
- // API
105
- rb_define_const(rb_mGLFW, "API_OPENGL", INT2NUM(GLFW_OPENGL_API));
106
- rb_define_const(rb_mGLFW, "API_OPENGL_ES", INT2NUM(GLFW_OPENGL_ES_API));
107
- rb_define_const(rb_mGLFW, "API_NONE", INT2NUM(GLFW_NO_API));
108
- // Context
109
- rb_define_const(rb_mGLFW, "CONTEXT_NATIVE", INT2NUM(GLFW_NATIVE_CONTEXT_API));
110
- rb_define_const(rb_mGLFW, "CONTEXT_EGL", INT2NUM(GLFW_EGL_CONTEXT_API));
111
- // Robustness
112
- rb_define_const(rb_mGLFW, "ROBUSTNESS_NONE", INT2NUM(GLFW_NO_ROBUSTNESS));
113
- rb_define_const(rb_mGLFW, "ROBUSTNESS_NO_NOTIFICATION", INT2NUM(GLFW_NO_RESET_NOTIFICATION));
114
- rb_define_const(rb_mGLFW, "ROBUSTNESS_LOSE_CONTEXT", INT2NUM(GLFW_LOSE_CONTEXT_ON_RESET));
115
- // Release Behavior
116
- rb_define_const(rb_mGLFW, "RELEASE_BEHAVIOR_ANY", INT2NUM(GLFW_ANY_RELEASE_BEHAVIOR));
117
- rb_define_const(rb_mGLFW, "RELEASE_BEHAVIOR_FLUSH", INT2NUM(GLFW_RELEASE_BEHAVIOR_FLUSH));
118
- rb_define_const(rb_mGLFW, "RELEASE_BEHAVIOR_NONE", INT2NUM(GLFW_RELEASE_BEHAVIOR_NONE));
119
- // OpenGL Profile
120
- rb_define_const(rb_mGLFW, "PROFILE_ANY", INT2NUM(GLFW_OPENGL_ANY_PROFILE));
121
- rb_define_const(rb_mGLFW, "PROFILE_COMPAT", INT2NUM(GLFW_OPENGL_COMPAT_PROFILE));
122
- rb_define_const(rb_mGLFW, "PROFILE_CORE", INT2NUM(GLFW_OPENGL_CORE_PROFILE));
123
-
124
- // Keys
125
- rb_define_const(rb_mGLFW, "KEY_UNKNOWN", INT2NUM(GLFW_KEY_UNKNOWN));
126
- rb_define_const(rb_mGLFW, "KEY_SPACE", INT2NUM(GLFW_KEY_SPACE));
127
- rb_define_const(rb_mGLFW, "KEY_APOSTROPHE", INT2NUM(GLFW_KEY_APOSTROPHE));
128
- rb_define_const(rb_mGLFW, "KEY_COMMA", INT2NUM(GLFW_KEY_COMMA));
129
- rb_define_const(rb_mGLFW, "KEY_MINUS", INT2NUM(GLFW_KEY_MINUS));
130
- rb_define_const(rb_mGLFW, "KEY_PERIOD", INT2NUM(GLFW_KEY_PERIOD));
131
- rb_define_const(rb_mGLFW, "KEY_SLASH", INT2NUM(GLFW_KEY_SLASH));
132
- rb_define_const(rb_mGLFW, "KEY_0", INT2NUM(GLFW_KEY_0));
133
- rb_define_const(rb_mGLFW, "KEY_1", INT2NUM(GLFW_KEY_1));
134
- rb_define_const(rb_mGLFW, "KEY_2", INT2NUM(GLFW_KEY_2));
135
- rb_define_const(rb_mGLFW, "KEY_3", INT2NUM(GLFW_KEY_3));
136
- rb_define_const(rb_mGLFW, "KEY_4", INT2NUM(GLFW_KEY_4));
137
- rb_define_const(rb_mGLFW, "KEY_5", INT2NUM(GLFW_KEY_5));
138
- rb_define_const(rb_mGLFW, "KEY_6", INT2NUM(GLFW_KEY_6));
139
- rb_define_const(rb_mGLFW, "KEY_7", INT2NUM(GLFW_KEY_7));
140
- rb_define_const(rb_mGLFW, "KEY_8", INT2NUM(GLFW_KEY_8));
141
- rb_define_const(rb_mGLFW, "KEY_9", INT2NUM(GLFW_KEY_9));
142
- rb_define_const(rb_mGLFW, "KEY_SEMICOLON", INT2NUM(GLFW_KEY_SEMICOLON));
143
- rb_define_const(rb_mGLFW, "KEY_EQUAL", INT2NUM(GLFW_KEY_EQUAL));
144
- rb_define_const(rb_mGLFW, "KEY_A", INT2NUM(GLFW_KEY_A));
145
- rb_define_const(rb_mGLFW, "KEY_B", INT2NUM(GLFW_KEY_B));
146
- rb_define_const(rb_mGLFW, "KEY_C", INT2NUM(GLFW_KEY_C));
147
- rb_define_const(rb_mGLFW, "KEY_D", INT2NUM(GLFW_KEY_D));
148
- rb_define_const(rb_mGLFW, "KEY_E", INT2NUM(GLFW_KEY_E));
149
- rb_define_const(rb_mGLFW, "KEY_F", INT2NUM(GLFW_KEY_F));
150
- rb_define_const(rb_mGLFW, "KEY_G", INT2NUM(GLFW_KEY_G));
151
- rb_define_const(rb_mGLFW, "KEY_H", INT2NUM(GLFW_KEY_H));
152
- rb_define_const(rb_mGLFW, "KEY_I", INT2NUM(GLFW_KEY_I));
153
- rb_define_const(rb_mGLFW, "KEY_J", INT2NUM(GLFW_KEY_J));
154
- rb_define_const(rb_mGLFW, "KEY_K", INT2NUM(GLFW_KEY_K));
155
- rb_define_const(rb_mGLFW, "KEY_L", INT2NUM(GLFW_KEY_L));
156
- rb_define_const(rb_mGLFW, "KEY_M", INT2NUM(GLFW_KEY_M));
157
- rb_define_const(rb_mGLFW, "KEY_N", INT2NUM(GLFW_KEY_N));
158
- rb_define_const(rb_mGLFW, "KEY_O", INT2NUM(GLFW_KEY_O));
159
- rb_define_const(rb_mGLFW, "KEY_P", INT2NUM(GLFW_KEY_P));
160
- rb_define_const(rb_mGLFW, "KEY_Q", INT2NUM(GLFW_KEY_Q));
161
- rb_define_const(rb_mGLFW, "KEY_R", INT2NUM(GLFW_KEY_R));
162
- rb_define_const(rb_mGLFW, "KEY_S", INT2NUM(GLFW_KEY_S));
163
- rb_define_const(rb_mGLFW, "KEY_T", INT2NUM(GLFW_KEY_T));
164
- rb_define_const(rb_mGLFW, "KEY_U", INT2NUM(GLFW_KEY_U));
165
- rb_define_const(rb_mGLFW, "KEY_V", INT2NUM(GLFW_KEY_V));
166
- rb_define_const(rb_mGLFW, "KEY_W", INT2NUM(GLFW_KEY_W));
167
- rb_define_const(rb_mGLFW, "KEY_X", INT2NUM(GLFW_KEY_X));
168
- rb_define_const(rb_mGLFW, "KEY_Y", INT2NUM(GLFW_KEY_Y));
169
- rb_define_const(rb_mGLFW, "KEY_Z", INT2NUM(GLFW_KEY_Z));
170
- rb_define_const(rb_mGLFW, "KEY_LEFT_BRACKET", INT2NUM(GLFW_KEY_LEFT_BRACKET));
171
- rb_define_const(rb_mGLFW, "KEY_BACKSLASH", INT2NUM(GLFW_KEY_BACKSLASH));
172
- rb_define_const(rb_mGLFW, "KEY_RIGHT_BRACKET", INT2NUM(GLFW_KEY_RIGHT_BRACKET));
173
- rb_define_const(rb_mGLFW, "KEY_GRAVE_ACCENT", INT2NUM(GLFW_KEY_GRAVE_ACCENT));
174
- rb_define_const(rb_mGLFW, "KEY_WORLD_1", INT2NUM(GLFW_KEY_WORLD_1));
175
- rb_define_const(rb_mGLFW, "KEY_WORLD_2", INT2NUM(GLFW_KEY_WORLD_2));
176
- rb_define_const(rb_mGLFW, "KEY_ESCAPE", INT2NUM(GLFW_KEY_ESCAPE));
177
- rb_define_const(rb_mGLFW, "KEY_ENTER", INT2NUM(GLFW_KEY_ENTER));
178
- rb_define_const(rb_mGLFW, "KEY_TAB", INT2NUM(GLFW_KEY_TAB));
179
- rb_define_const(rb_mGLFW, "KEY_BACKSPACE", INT2NUM(GLFW_KEY_BACKSPACE));
180
- rb_define_const(rb_mGLFW, "KEY_INSERT", INT2NUM(GLFW_KEY_INSERT));
181
- rb_define_const(rb_mGLFW, "KEY_DELETE", INT2NUM(GLFW_KEY_DELETE));
182
- rb_define_const(rb_mGLFW, "KEY_RIGHT", INT2NUM(GLFW_KEY_RIGHT));
183
- rb_define_const(rb_mGLFW, "KEY_LEFT", INT2NUM(GLFW_KEY_LEFT));
184
- rb_define_const(rb_mGLFW, "KEY_DOWN", INT2NUM(GLFW_KEY_DOWN));
185
- rb_define_const(rb_mGLFW, "KEY_UP", INT2NUM(GLFW_KEY_UP));
186
- rb_define_const(rb_mGLFW, "KEY_PAGE_UP", INT2NUM(GLFW_KEY_PAGE_UP));
187
- rb_define_const(rb_mGLFW, "KEY_PAGE_DOWN", INT2NUM(GLFW_KEY_PAGE_DOWN));
188
- rb_define_const(rb_mGLFW, "KEY_HOME", INT2NUM(GLFW_KEY_HOME));
189
- rb_define_const(rb_mGLFW, "KEY_END", INT2NUM(GLFW_KEY_END));
190
- rb_define_const(rb_mGLFW, "KEY_CAPS_LOCK", INT2NUM(GLFW_KEY_CAPS_LOCK));
191
- rb_define_const(rb_mGLFW, "KEY_SCROLL_LOCK", INT2NUM(GLFW_KEY_SCROLL_LOCK));
192
- rb_define_const(rb_mGLFW, "KEY_NUM_LOCK", INT2NUM(GLFW_KEY_NUM_LOCK));
193
- rb_define_const(rb_mGLFW, "KEY_PRINT_SCREEN", INT2NUM(GLFW_KEY_PRINT_SCREEN));
194
- rb_define_const(rb_mGLFW, "KEY_PAUSE", INT2NUM(GLFW_KEY_PAUSE));
195
- rb_define_const(rb_mGLFW, "KEY_F1", INT2NUM(GLFW_KEY_F1));
196
- rb_define_const(rb_mGLFW, "KEY_F2", INT2NUM(GLFW_KEY_F2));
197
- rb_define_const(rb_mGLFW, "KEY_F3", INT2NUM(GLFW_KEY_F3));
198
- rb_define_const(rb_mGLFW, "KEY_F4", INT2NUM(GLFW_KEY_F4));
199
- rb_define_const(rb_mGLFW, "KEY_F5", INT2NUM(GLFW_KEY_F5));
200
- rb_define_const(rb_mGLFW, "KEY_F6", INT2NUM(GLFW_KEY_F6));
201
- rb_define_const(rb_mGLFW, "KEY_F7", INT2NUM(GLFW_KEY_F7));
202
- rb_define_const(rb_mGLFW, "KEY_F8", INT2NUM(GLFW_KEY_F8));
203
- rb_define_const(rb_mGLFW, "KEY_F9", INT2NUM(GLFW_KEY_F9));
204
- rb_define_const(rb_mGLFW, "KEY_F10", INT2NUM(GLFW_KEY_F10));
205
- rb_define_const(rb_mGLFW, "KEY_F11", INT2NUM(GLFW_KEY_F11));
206
- rb_define_const(rb_mGLFW, "KEY_F12", INT2NUM(GLFW_KEY_F12));
207
- rb_define_const(rb_mGLFW, "KEY_F13", INT2NUM(GLFW_KEY_F13));
208
- rb_define_const(rb_mGLFW, "KEY_F14", INT2NUM(GLFW_KEY_F14));
209
- rb_define_const(rb_mGLFW, "KEY_F15", INT2NUM(GLFW_KEY_F15));
210
- rb_define_const(rb_mGLFW, "KEY_F16", INT2NUM(GLFW_KEY_F16));
211
- rb_define_const(rb_mGLFW, "KEY_F17", INT2NUM(GLFW_KEY_F17));
212
- rb_define_const(rb_mGLFW, "KEY_F18", INT2NUM(GLFW_KEY_F18));
213
- rb_define_const(rb_mGLFW, "KEY_F19", INT2NUM(GLFW_KEY_F19));
214
- rb_define_const(rb_mGLFW, "KEY_F20", INT2NUM(GLFW_KEY_F20));
215
- rb_define_const(rb_mGLFW, "KEY_F21", INT2NUM(GLFW_KEY_F21));
216
- rb_define_const(rb_mGLFW, "KEY_F22", INT2NUM(GLFW_KEY_F22));
217
- rb_define_const(rb_mGLFW, "KEY_F23", INT2NUM(GLFW_KEY_F23));
218
- rb_define_const(rb_mGLFW, "KEY_F24", INT2NUM(GLFW_KEY_F24));
219
- rb_define_const(rb_mGLFW, "KEY_F25", INT2NUM(GLFW_KEY_F25));
220
- rb_define_const(rb_mGLFW, "KEY_KP_0", INT2NUM(GLFW_KEY_KP_0));
221
- rb_define_const(rb_mGLFW, "KEY_KP_1", INT2NUM(GLFW_KEY_KP_1));
222
- rb_define_const(rb_mGLFW, "KEY_KP_2", INT2NUM(GLFW_KEY_KP_2));
223
- rb_define_const(rb_mGLFW, "KEY_KP_3", INT2NUM(GLFW_KEY_KP_3));
224
- rb_define_const(rb_mGLFW, "KEY_KP_4", INT2NUM(GLFW_KEY_KP_4));
225
- rb_define_const(rb_mGLFW, "KEY_KP_5", INT2NUM(GLFW_KEY_KP_5));
226
- rb_define_const(rb_mGLFW, "KEY_KP_6", INT2NUM(GLFW_KEY_KP_6));
227
- rb_define_const(rb_mGLFW, "KEY_KP_7", INT2NUM(GLFW_KEY_KP_7));
228
- rb_define_const(rb_mGLFW, "KEY_KP_8", INT2NUM(GLFW_KEY_KP_8));
229
- rb_define_const(rb_mGLFW, "KEY_KP_9", INT2NUM(GLFW_KEY_KP_9));
230
- rb_define_const(rb_mGLFW, "KEY_KP_DECIMAL", INT2NUM(GLFW_KEY_KP_DECIMAL));
231
- rb_define_const(rb_mGLFW, "KEY_KP_DIVIDE", INT2NUM(GLFW_KEY_KP_DIVIDE));
232
- rb_define_const(rb_mGLFW, "KEY_KP_MULTIPLY", INT2NUM(GLFW_KEY_KP_MULTIPLY));
233
- rb_define_const(rb_mGLFW, "KEY_KP_SUBTRACT", INT2NUM(GLFW_KEY_KP_SUBTRACT));
234
- rb_define_const(rb_mGLFW, "KEY_KP_ADD", INT2NUM(GLFW_KEY_KP_ADD));
235
- rb_define_const(rb_mGLFW, "KEY_KP_ENTER", INT2NUM(GLFW_KEY_KP_ENTER));
236
- rb_define_const(rb_mGLFW, "KEY_KP_EQUAL", INT2NUM(GLFW_KEY_KP_EQUAL));
237
- rb_define_const(rb_mGLFW, "KEY_LEFT_SHIFT", INT2NUM(GLFW_KEY_LEFT_SHIFT));
238
- rb_define_const(rb_mGLFW, "KEY_LEFT_CONTROL", INT2NUM(GLFW_KEY_LEFT_CONTROL));
239
- rb_define_const(rb_mGLFW, "KEY_LEFT_ALT", INT2NUM(GLFW_KEY_LEFT_ALT));
240
- rb_define_const(rb_mGLFW, "KEY_LEFT_SUPER", INT2NUM(GLFW_KEY_LEFT_SUPER));
241
- rb_define_const(rb_mGLFW, "KEY_RIGHT_SHIFT", INT2NUM(GLFW_KEY_RIGHT_SHIFT));
242
- rb_define_const(rb_mGLFW, "KEY_RIGHT_CONTROL", INT2NUM(GLFW_KEY_RIGHT_CONTROL));
243
- rb_define_const(rb_mGLFW, "KEY_RIGHT_ALT", INT2NUM(GLFW_KEY_RIGHT_ALT));
244
- rb_define_const(rb_mGLFW, "KEY_RIGHT_SUPER", INT2NUM(GLFW_KEY_RIGHT_SUPER));
245
- rb_define_const(rb_mGLFW, "KEY_MENU", INT2NUM(GLFW_KEY_MENU));
246
- // Modifier Keys
247
- rb_define_const(rb_mGLFW, "MOD_CONTROL", INT2NUM(GLFW_MOD_CONTROL));
248
- rb_define_const(rb_mGLFW, "MOD_SHIFT", INT2NUM(GLFW_MOD_SHIFT));
249
- rb_define_const(rb_mGLFW, "MOD_ALT", INT2NUM(GLFW_MOD_ALT));
250
- rb_define_const(rb_mGLFW, "MOD_SUPER", INT2NUM(GLFW_MOD_SUPER));
251
- // Mouse Buttons
252
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_1", INT2NUM(GLFW_MOUSE_BUTTON_1));
253
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_2", INT2NUM(GLFW_MOUSE_BUTTON_2));
254
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_3", INT2NUM(GLFW_MOUSE_BUTTON_3));
255
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_4", INT2NUM(GLFW_MOUSE_BUTTON_4));
256
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_5", INT2NUM(GLFW_MOUSE_BUTTON_5));
257
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_6", INT2NUM(GLFW_MOUSE_BUTTON_6));
258
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_7", INT2NUM(GLFW_MOUSE_BUTTON_7));
259
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_8", INT2NUM(GLFW_MOUSE_BUTTON_8));
260
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_LAST", INT2NUM(GLFW_MOUSE_BUTTON_LAST));
261
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_LEFT", INT2NUM(GLFW_MOUSE_BUTTON_LEFT));
262
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_RIGHT", INT2NUM(GLFW_MOUSE_BUTTON_RIGHT));
263
- rb_define_const(rb_mGLFW, "MOUSE_BUTTON_MIDDLE", INT2NUM(GLFW_MOUSE_BUTTON_MIDDLE));
264
- // Cursor Shapes
265
- rb_define_const(rb_mGLFW, "CURSOR_ARROW", INT2NUM(GLFW_ARROW_CURSOR));
266
- rb_define_const(rb_mGLFW, "CURSOR_IBEAM", INT2NUM(GLFW_IBEAM_CURSOR));
267
- rb_define_const(rb_mGLFW, "CURSOR_CROSSHAIR", INT2NUM(GLFW_CROSSHAIR_CURSOR));
268
- rb_define_const(rb_mGLFW, "CURSOR_HAND", INT2NUM(GLFW_HAND_CURSOR));
269
- rb_define_const(rb_mGLFW, "CURSOR_HRESIZE", INT2NUM(GLFW_HRESIZE_CURSOR));
270
- rb_define_const(rb_mGLFW, "CURSOR_VRESIZE", INT2NUM(GLFW_VRESIZE_CURSOR));
6
+ VALUE pointer_class;
7
+ VALUE function_class;
8
+ VALUE id_new;
271
9
 
10
+ #if SIZEOF_VOIDP == SIZEOF_LONG
11
+ # define PTR2NUM(x) (LONG2NUM((long)(x)))
12
+ # define NUM2PTR(x) ((void*)(NUM2ULONG(x)))
13
+ #else
14
+ /* # error --->> Ruby/DL2 requires sizeof(void*) == sizeof(long) to be compiled. <<--- */
15
+ # define PTR2NUM(x) (LL2NUM((LONG_LONG)(x)))
16
+ # define NUM2PTR(x) ((void*)(NUM2ULL(x)))
17
+ #endif
272
18
 
19
+ static void rb_glfw_error_cb(int code, const char *message)
20
+ {
21
+ rb_raise(eGLFWError, "%s (error code: 0x%08x)", message, code);
273
22
  }
274
23
 
275
- void rb_glfw_error_callback(int error, const char *message) {
276
- rb_raise(rb_eGLFWError, "%s", message);
277
- }
278
-
279
- void rb_glfw_monitor_callback(GLFWmonitor *monitor, int connected) {
280
- VALUE m = Data_Wrap_Struct(rb_cGLFWmonitor, NULL, RUBY_DEFAULT_FREE, monitor);
281
- rb_funcall(rb_mGLFW, rb_intern("monitor_changed"), 2, m, INT2BOOL(connected));
24
+ static VALUE rb_glfw_version(VALUE glfw)
25
+ {
26
+ int major, minor, revision;
27
+ glfwGetVersion(&major, &minor, &revision);
28
+ return rb_sprintf("%d.%d.%d", major, minor, revision);
282
29
  }
283
30
 
284
- void rb_glfw_joystick_callback(int joystick, int connected) {
285
- rb_funcall(rb_mGLFW, rb_intern("joystick_changed"), 2, INT2NUM(joystick), INT2BOOL(connected));
31
+ static VALUE rb_glfw_version_str(VALUE glfw)
32
+ {
33
+ return rb_str_new_cstr(glfwGetVersionString());
286
34
  }
287
35
 
288
- VALUE rb_glfw_init(VALUE klass) {
289
- if (glfwInit())
36
+ static VALUE rb_glfw_init(VALUE glfw)
37
+ {
38
+ VALUE result = RB_BOOL(glfwInit());
39
+ if (rb_block_given_p())
290
40
  {
291
- glfwSetMonitorCallback(rb_glfw_monitor_callback);
292
- glfwSetJoystickCallback(rb_glfw_joystick_callback);
293
- return Qtrue;
41
+ rb_yield(Qnil);
42
+ return Qnil;
294
43
  }
295
- return Qfalse;
44
+ return result;
296
45
  }
297
46
 
298
- VALUE rb_glfw_terminate(VALUE klass) {
47
+ static VALUE rb_glfw_terminate(VALUE glfw)
48
+ {
299
49
  glfwTerminate();
300
50
  return Qnil;
301
51
  }
302
52
 
303
- VALUE rb_glfw_poll_events(VALUE klass) {
304
- glfwPollEvents();
53
+ static VALUE rb_glfw_init_hint(VALUE glfw, VALUE hint, VALUE value)
54
+ {
55
+ glfwInitHint(NUM2INT(hint), FIXNUM_P(value) ? NUM2INT(value) : RTEST(value));
305
56
  return Qnil;
306
57
  }
307
58
 
308
- VALUE rb_glfw_wait_events(VALUE klass) {
309
- glfwWaitEvents();
59
+ static VALUE rb_glfw_swap_interval(VALUE glfw, VALUE value)
60
+ {
61
+ glfwSwapInterval(NUM2INT(value));
310
62
  return Qnil;
311
63
  }
312
64
 
313
- VALUE rb_glfe_event_timeout(VALUE klass, VALUE timeout) {
314
- glfwWaitEventsTimeout(NUM2DBL(timeout));
65
+ static VALUE rb_glfw_poll_events(VALUE glfw)
66
+ {
67
+ glfwPollEvents();
315
68
  return Qnil;
316
69
  }
317
70
 
318
- VALUE rb_glfw_get_time(VALUE klass) {
319
- return DBL2NUM(glfwGetTime());
320
- }
321
-
322
- VALUE rb_glfw_set_time(VALUE klass, VALUE t) {
323
- glfwSetTime(NUM2DBL(t));
324
- return t;
71
+ static VALUE rb_glfw_wait_events(VALUE glfw)
72
+ {
73
+ glfwWaitEvents();
74
+ return Qnil;
325
75
  }
326
76
 
327
- VALUE rb_glfw_swap_interval(VALUE klass, VALUE interval) {
328
- glfwSwapInterval(NUM2INT(interval));
329
- return interval;
77
+ static VALUE rb_glfw_get_time(VALUE glfw)
78
+ {
79
+ return DBL2NUM(glfwGetTime());
330
80
  }
331
81
 
332
- VALUE rb_glfw_current_context(VALUE klass) {
333
- GLFWwindow *w = glfwGetCurrentContext();
334
- return Data_Wrap_Struct(klass, NULL, RUBY_DEFAULT_FREE, w);
82
+ static VALUE rb_glfw_set_time(VALUE glfw, VALUE value)
83
+ {
84
+ glfwSetTime(NUM2DBL(value));
85
+ return value;
335
86
  }
336
87
 
337
- VALUE rb_glfw_supported_p(VALUE klass, volatile VALUE extension) {
338
- const char* ext = rb_string_value_cstr(&extension);
339
- return glfwExtensionSupported(ext) ? Qtrue : Qfalse;
88
+ static VALUE rb_glfw_timer_value(VALUE glfw)
89
+ {
90
+ return ULL2NUM(glfwGetTimerValue());
340
91
  }
341
92
 
342
- VALUE rb_glfw_monitors(VALUE klass) {
343
- int count;
344
- GLFWmonitor** monitors = glfwGetMonitors(&count);
345
- VALUE ary = rb_ary_new_capa(count);
346
- for (int i = 0; i < count; i++)
347
- rb_ary_store(ary, i, Data_Wrap_Struct(rb_cGLFWmonitor, NULL, RUBY_DEFAULT_FREE, monitors[i]));
348
- return ary;
93
+ static VALUE rb_glfw_timer_frequency(VALUE glfw)
94
+ {
95
+ return ULL2NUM(glfwGetTimerFrequency());
349
96
  }
350
97
 
351
- VALUE rb_glfw_load_default_hints(VALUE klass) {
352
- glfwDefaultWindowHints();
98
+ static VALUE rb_glfw_post_empty_event(VALUE glfw)
99
+ {
100
+ glfwPostEmptyEvent();
353
101
  return Qnil;
354
102
  }
355
103
 
356
- VALUE rb_glfw_window_hint(VALUE klass, VALUE hint, VALUE value) {
357
- int hintvalue;
358
- if (NIL_P(value))
359
- hintvalue = GLFW_DONT_CARE;
360
- else if (FIXNUM_P(value))
361
- hintvalue = NUM2INT(value);
362
- else
363
- hintvalue = RTEST(value);
364
- glfwWindowHint(NUM2INT(hint), hintvalue);
365
-
104
+ static VALUE rb_glfw_event_timeout(VALUE glfw, VALUE timeout)
105
+ {
106
+ glfwWaitEventsTimeout(NUM2DBL(timeout));
366
107
  return Qnil;
367
108
  }
368
109
 
369
- VALUE rb_glfw_key_name(VALUE klass, VALUE key, VALUE scancode) {
370
- const char *name = glfwGetKeyName(NUM2INT(key), NUM2INT(scancode));
371
- return rb_utf8_str_new_cstr(name);
110
+ static VALUE rb_glfw_scancode(VALUE glfw, VALUE key)
111
+ {
112
+ return INT2NUM(glfwGetKeyScancode(NUM2INT(key)));
372
113
  }
373
114
 
374
- VALUE rb_glfw_post_empty(VALUE klass) {
375
- glfwPostEmptyEvent();
376
- return Qnil;
377
- }
115
+ static VALUE rb_glfw_key_name(int argc, VALUE *argv, VALUE glfw)
116
+ {
117
+ VALUE key, scancode;
118
+ rb_scan_args(argc, argv, "11", &key, &scancode);
378
119
 
379
- VALUE rb_glfw_timer_frequency(VALUE klass) {
380
- return ULL2NUM(glfwGetTimerFrequency());
120
+ int sc = RTEST(scancode) ? NUM2INT(scancode) : 0;
121
+ return rb_str_new_cstr(glfwGetKeyName(NUM2INT(key), sc));
381
122
  }
382
123
 
383
- VALUE rb_glfw_timer_value(VALUE klass) {
384
- return ULL2NUM(glfwGetTimerValue());
124
+ static VALUE rb_glfw_get_proc_address(VALUE glfw, VALUE name)
125
+ {
126
+ void *proc = glfwGetProcAddress(StringValueCStr(name));
127
+ return rb_funcall(pointer_class, id_new, 1, PTR2NUM(proc));
385
128
  }
386
129
 
387
- VALUE rb_glfw_joystick_changed(VALUE klass, VALUE joystick, VALUE connected) {
388
- return Qnil;
130
+ static VALUE rb_glfw_import_function(VALUE glfw, VALUE name, VALUE args, VALUE return_type)
131
+ {
132
+ void *proc = glfwGetProcAddress(StringValueCStr(name));
133
+ VALUE handle = rb_funcall(pointer_class, id_new, 1, PTR2NUM(proc));
134
+ return rb_funcall(function_class, id_new, 3, handle, args, return_type);
389
135
  }
390
136
 
391
- VALUE rb_glfw_joystick_buttons(VALUE klass, VALUE joystick) {
392
- int count;
393
- const unsigned char *buttons = glfwGetJoystickButtons(NUM2INT(joystick), &count);
394
- VALUE ary = rb_ary_new_capa(count);
395
- for (int i = 0; i < count; i++)
396
- rb_ary_store(ary, i, INT2NUM(buttons[i]));
397
- return ary;
137
+ static VALUE rb_glfw_is_extension_supported(VALUE glfw, VALUE name)
138
+ {
139
+ const char *ext = StringValueCStr(name);
140
+ return ext ? RB_BOOL(glfwExtensionSupported(ext)) : Qfalse;
398
141
  }
399
142
 
400
- VALUE rb_glfw_joystick_axes(VALUE klass, VALUE joystick) {
401
- int count;
402
- const float *axes = glfwGetJoystickAxes(NUM2INT(joystick), &count);
403
- VALUE ary = rb_ary_new_capa(count);
404
- for (int i = 0; i < count; i++)
405
- rb_ary_store(ary, i, DBL2NUM(axes[i]));
406
- return ary;
407
- }
143
+ void Init_glfw(void)
144
+ {
145
+ mGLFW = rb_define_module("GLFW");
146
+ eGLFWError = rb_define_class_under(mGLFW, "Error", rb_eStandardError);
408
147
 
409
- VALUE rb_glfw_joystick_name(VALUE klass, VALUE joystick) {
410
- const char *name = glfwGetJoystickName(NUM2INT(joystick));
411
- return rb_utf8_str_new_cstr(name);
412
- }
148
+ glfwSetErrorCallback(rb_glfw_error_cb);
413
149
 
414
- VALUE rb_glfw_joystick_p(VALUE klass, VALUE joystick) {
415
- return INT2BOOL(glfwJoystickPresent(NUM2INT(joystick)));
416
- }
150
+ rb_define_module_function(mGLFW, "init", rb_glfw_init, 0);
151
+ rb_define_module_function(mGLFW, "terminate", rb_glfw_terminate, 0);
152
+ rb_define_module_function(mGLFW, "version", rb_glfw_version, 0);
153
+ rb_define_module_function(mGLFW, "version_str", rb_glfw_version_str, 0);
154
+ rb_define_module_function(mGLFW, "init_hint", rb_glfw_init_hint, 2);
155
+ rb_define_module_function(mGLFW, "supported?", rb_glfw_is_extension_supported, 1);
156
+ rb_define_module_function(mGLFW, "swap_interval", rb_glfw_swap_interval, 1);
157
+ rb_define_module_function(mGLFW, "poll_events", rb_glfw_poll_events, 0);
158
+ rb_define_module_function(mGLFW, "wait_events", rb_glfw_wait_events, 0);
159
+ rb_define_module_function(mGLFW, "post_empty_event", rb_glfw_post_empty_event, 0);
160
+ rb_define_module_function(mGLFW, "event_timeout", rb_glfw_event_timeout, 1);
161
+ rb_define_module_function(mGLFW, "proc_address", rb_glfw_get_proc_address, 1);
162
+ rb_define_module_function(mGLFW, "import", rb_glfw_import_function, 3);
163
+ rb_define_module_function(mGLFW, "time", rb_glfw_get_time, 0);
164
+ rb_define_module_function(mGLFW, "time=", rb_glfw_set_time, 1);
165
+ rb_define_module_function(mGLFW, "timer_value", rb_glfw_timer_value, 0);
166
+ rb_define_module_function(mGLFW, "timer_frequency", rb_glfw_timer_frequency, 0);
167
+ rb_define_module_function(mGLFW, "key_name", rb_glfw_key_name, -1);
168
+ rb_define_module_function(mGLFW, "scancode", rb_glfw_scancode, 1);
417
169
 
418
- VALUE rb_glfw_monitor_changed(VALUE klass, VALUE monitor, VALUE connected) {
419
- return Qnil;
420
- }
170
+ rb_glfw_window_init();
171
+ rb_glfw_monitor_init();
172
+ rb_glfw_cursor_init();
173
+ rb_glfw_image_init();
174
+ rb_glfw_common_init();
175
+ rb_glfw_joystick_init();;
421
176
 
422
- VALUE rb_glfw_proc_address(VALUE klass, VALUE name) {
423
- Check_Type(name, T_STRING);
424
- size_t proc = (size_t) glfwGetProcAddress(StringValueCStr(name));
425
- return LL2NUM(proc);
177
+ rb_require("fiddle");
178
+ VALUE fiddle = rb_const_get(rb_mKernel, rb_intern("Fiddle"));
179
+ pointer_class = rb_const_get(fiddle, rb_intern("Pointer"));
180
+ function_class = rb_const_get(fiddle, rb_intern("Function"));
181
+ id_new = rb_intern("new");
426
182
  }
427
183
 
428
- /*
429
- glfwGetWGLContext
430
- glfwGetWin32Adapter
431
- glfwGetWin32Monitor
432
- glfwGetWin32Window
433
- glfwGetEGLContext
434
- glfwGetEGLDisplay
435
- glfwGetEGLSurface
436
- */
437
-
438
-