glfw 1.0.3 → 3.3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
-