@@ -37,30 +37,43 @@ Lib.glext = setmetatable({}, {
37
37
end ,
38
38
})
39
39
40
- -- TODO: The docs say that `lib.foo` is faster than `local foo = lib.foo; foo()`, but is the overhead of a closure
40
+ -- TODO: The docs say that `lib.foo() ` is faster than `local foo = lib.foo; foo()`, but is the overhead of a closure
41
41
-- worth it?
42
42
local function wrap (lib , fname )
43
43
return function (...)
44
44
return lib [fname ](... )
45
45
end
46
46
end
47
47
48
+ -- Similar to wrap, but errors if the returned object is null
49
+ local function wrapErrorOnNull (lib , fname )
50
+ return function (...)
51
+ local obj = lib [fname ](... )
52
+ if obj == nil then
53
+ error (fname .. " failed" ,2 )
54
+ end
55
+ return obj
56
+ end
57
+ end
58
+
59
+ -- Some buffers for out parameters
48
60
local int_buffer = ffi .new (" int[2]" )
49
61
local double_buffer = ffi .new (" double[2]" )
50
62
51
63
---- -----------------------------------------------------------------------------------------------------------------
52
64
-- GLFW Global Functions
53
65
54
66
-- C functions that don't need special handling
55
- Lib .terminate = wrap (glfw , " glfwTerminate" )
56
-
57
- Lib .getTime = wrap (glfw , " glfwGetTime" )
58
- Lib .setTime = wrap (glfw , " glfwSetTime" )
59
67
Lib .defaultWindowHints = wrap (glfw , " glfwDefaultWindowHints" )
60
- Lib .swapInterval = wrap (glfw , " glfwSwapInterval" )
61
68
Lib .getCurrentContext = wrap (glfw , " glfwGetCurrentContext" )
69
+ Lib .getPrimaryMonitor = wrapErrorOnNull (glfw , " glfwGetPrimaryMonitor" )
62
70
Lib .getProcAddress = wrap (glfw , " glfwGetProcAddress" )
71
+ Lib .getTime = wrap (glfw , " glfwGetTime" )
72
+ Lib .hint = wrap (glfw , " glfwWindowHint" )
63
73
Lib .joystickPresent = wrap (glfw , " glfwJoystickPresent" )
74
+ Lib .setTime = wrap (glfw , " glfwSetTime" )
75
+ Lib .swapInterval = wrap (glfw , " glfwSwapInterval" )
76
+ Lib .terminate = wrap (glfw , " glfwTerminate" )
64
77
65
78
-- Functions with special Lua code
66
79
@@ -113,12 +126,14 @@ function Lib.getJoystickButtons(joy, arr)
113
126
return arr
114
127
end
115
128
129
+ -- Returns Lua string
116
130
function Lib .getJoystickName (joy )
117
131
local name = glfw .glfwGetJoystickName (joy )
118
132
if name == nil then error (" Invalid joystick: " .. joy , 2 ) end
119
133
return ffi .string (name )
120
134
end
121
135
136
+ -- Returns Lua table
122
137
function Lib .getMonitors ()
123
138
local cmonitors = glfw .glfwGetMonitors (int_buffer )
124
139
if cmonitors == nil then error (" glfwGetMonitors failed" ,2 ) end
@@ -130,12 +145,6 @@ function Lib.getMonitors()
130
145
return monitors
131
146
end
132
147
133
- function Lib .getPrimaryMonitor ()
134
- local monitor = glfw .glfwGetPrimaryMonitor ()
135
- if monitor == nil then error (" glfwGetPrimaryMonitor failed" ,2 ) end
136
- return monitor
137
- end
138
-
139
148
-- These functions can't be jit compiled, because they may call callbacks.
140
149
-- Don't use wrap because jit.off affects the prototype, which will affect other functions too.
141
150
Lib .pollEvents = function () return glfw .glfwPollEvents () end
@@ -159,41 +168,47 @@ function Window:__new(w, h, title, monitor, share)
159
168
end
160
169
161
170
-- C functions that don't need special handling
162
- Window .getAttrib = wrap (glfw , " glfwGetWindowAttrib" )
171
+ Window .__gc = wrap (glfw , " glfwDestroyWindow" )
172
+ Window .getInputMode = wrap (glfw , " glfwGetInputMode" )
173
+ Window .getKey = wrap (glfw , " glfwGetKey" )
163
174
Window .getMonitor = wrap (glfw , " glfwGetWindowMonitor" )
175
+ Window .getMouseButton = wrap (glfw , " glfwGetMouseButton" )
164
176
Window .hide = wrap (glfw , " glfwHideWindow" )
165
177
Window .iconify = wrap (glfw , " glfwIconifyWindow" )
166
- Window .restore = wrap (glfw , " glfwRestoreWindow" )
167
- Window .setPos = wrap (glfw , " glfwSetWindowPos" )
168
- Window .setShouldClose = wrap (glfw , " glfwSetWindowShouldClose" )
169
- Window .setSize = wrap (glfw , " glfwSetWindowSize" )
170
- Window .setTitle = wrap (glfw , " glfwSetWindowTitle" )
171
- Window .show = wrap (glfw , " glfwShowWindow" )
172
- Window .hint = wrap (glfw , " glfwWindowHint" )
173
178
Window .makeContextCurrent = wrap (glfw , " glfwMakeContextCurrent" )
174
- Window .swapBuffers = wrap (glfw , " glfwSwapBuffers" )
179
+ Window .restore = wrap (glfw , " glfwRestoreWindow" )
180
+ Window .setCharCallback = wrap (glfw , " glfwSetCharCallback" )
175
181
Window .setClipboardString = wrap (glfw , " glfwSetClipboardString" )
176
- Window .getInputMode = wrap (glfw , " glfwGetInputMode" )
177
- Window .setInputMode = wrap (glfw , " glfwSetInputMode" )
178
- Window .getKey = wrap (glfw , " glfwGetKey" )
179
- Window .getMouseButton = wrap (glfw , " glfwGetMouseButton" )
180
- Window .setCursorPos = wrap (glfw , " glfwSetCursorPos" )
181
- Window .setFramebufferSizeCallback = wrap (glfw , " glfwSetFramebufferSizeCallback" )
182
182
Window .setCloseCallback = wrap (glfw , " glfwSetWindowCloseCallback" )
183
+ Window .setCursorEnterCallback = wrap (glfw , " glfwSetCursorEnterCallback" )
184
+ Window .setCursorPos = wrap (glfw , " glfwSetCursorPos" )
185
+ Window .setCursorPosCallback = wrap (glfw , " glfwSetCursorPosCallback" )
183
186
Window .setFocusCallback = wrap (glfw , " glfwSetWindowFocusCallback" )
187
+ Window .setFramebufferSizeCallback = wrap (glfw , " glfwSetFramebufferSizeCallback" )
184
188
Window .setIconifyCallback = wrap (glfw , " glfwSetWindowIconifyCallback" )
185
- Window .setPosCallback = wrap (glfw , " glfwSetWindowPosCallback" )
186
- Window .setRefreshCallback = wrap (glfw , " glfwSetWindowRefreshCallback" )
187
- Window .setSizeCallback = wrap (glfw , " glfwSetWindowSizeCallback" )
189
+ Window .setInputMode = wrap (glfw , " glfwSetInputMode" )
188
190
Window .setKeyCallback = wrap (glfw , " glfwSetKeyCallback" )
189
- Window .setCharCallback = wrap (glfw , " glfwSetCharCallback" )
190
191
Window .setMouseButtonCallback = wrap (glfw , " glfwSetMouseButtonCallback" )
191
- Window .setCursorPosCallback = wrap (glfw , " glfwSetCursorPosCallback" )
192
- Window .setCursorEnterCallback = wrap (glfw , " glfwSetCursorEnterCallback" )
192
+ Window .setPos = wrap (glfw , " glfwSetWindowPos" )
193
+ Window .setPosCallback = wrap (glfw , " glfwSetWindowPosCallback" )
194
+ Window .setRefreshCallback = wrap (glfw , " glfwSetWindowRefreshCallback" )
193
195
Window .setScrollCallback = wrap (glfw , " glfwSetScrollCallback" )
196
+ Window .setShouldClose = wrap (glfw , " glfwSetWindowShouldClose" )
197
+ Window .setSize = wrap (glfw , " glfwSetWindowSize" )
198
+ Window .setSizeCallback = wrap (glfw , " glfwSetWindowSizeCallback" )
199
+ Window .setTitle = wrap (glfw , " glfwSetWindowTitle" )
200
+ Window .show = wrap (glfw , " glfwShowWindow" )
201
+ Window .swapBuffers = wrap (glfw , " glfwSwapBuffers" )
194
202
195
203
-- Functions with special Lua code
196
204
205
+ -- Errors on zero
206
+ function Window :getAttrib (attrib )
207
+ local v = glfw .glfwGetWindowAttrib (self , attrib )
208
+ if v == 0 then error (" glfwGetWindowAttrib failed" , 2 ) end
209
+ return v
210
+ end
211
+
197
212
-- Returns width, height instead of needing out parameters
198
213
function Window :getFramebufferSize ()
199
214
glfw .glfwGetFramebufferSize (self , int_buffer , int_buffer + 1 )
@@ -223,18 +238,16 @@ function Window:getCursorPos()
223
238
return double_buffer [0 ], double_buffer [1 ]
224
239
end
225
240
241
+ -- Returns a boolean
226
242
function Window :shouldClose ()
227
243
return glfw .glfwWindowShouldClose (self ) ~= 0
228
244
end
229
245
246
+ -- Prevents the GC from double free'ing
230
247
function Window :destroy ()
231
248
glfw .glfwDestroyWindow (ffi .gc (self , nil ))
232
249
end
233
250
234
- function Window :__gc ()
235
- glfw .glfwDestroyWindow (self )
236
- end
237
-
238
251
ffi .metatype (Window_t , Window )
239
252
240
253
---- -----------------------------------------------------------------------------------------------------------------
@@ -245,18 +258,31 @@ Monitor.__index = Monitor
245
258
local Monitor_t = ffi .typeof (" GLFWmonitor" )
246
259
Lib .Monitor = Monitor_t
247
260
248
- Monitor .setCallback = wrap (glfw , " glfwSetMonitorCallback" )
261
+ Monitor .setCallback = wrap (glfw , " glfwSetMonitorCallback" )
262
+ Monitor .getVideoMode = wrapErrorOnNull (glfw , " glfwGetVideoMode" )
249
263
264
+ -- Returns x,y instead of needing out params
250
265
function Monitor :getPos ()
251
266
glfw .glfwGetMonitorPos (self , int_buffer , int_buffer + 1 )
252
267
return int_buffer [0 ], int_buffer [1 ]
253
268
end
254
269
270
+ -- Retruns w,h instead of needing out params
255
271
function Monitor :getPhysicalSize ()
256
272
glfw .glfwGetMonitorPhysicalSize (self , int_buffer , int_buffer + 1 )
257
273
return int_buffer [0 ], int_buffer [1 ]
258
274
end
259
275
276
+ -- Returns Lua table
277
+ function Monitor :getVideoModes ()
278
+ local carr = glfw .glfwGetVideoModes (self , int_buffer )
279
+ local arr = {}
280
+ for i = 0 ,int_buffer [0 ]- 1 do
281
+ arr [i + 1 ] = carr [i ]
282
+ end
283
+ return arr
284
+ end
285
+
260
286
ffi .metatype (Monitor_t , Monitor )
261
287
262
288
---- -----------------------------------------------------------------------------------------------------------------
0 commit comments