sdl2_ffi 0.0.4 → 0.0.5

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/Gemfile +6 -0
  4. data/Guardfile +47 -25
  5. data/Rakefile +6 -0
  6. data/bin/approvals +16 -0
  7. data/bin/autospec +16 -0
  8. data/bin/htmldiff +16 -0
  9. data/bin/ldiff +16 -0
  10. data/bin/nokogiri +16 -0
  11. data/bin/rspec +16 -0
  12. data/lib/enumerable_constants.rb +23 -8
  13. data/lib/sdl2.rb +116 -39
  14. data/lib/sdl2/color.rb +19 -7
  15. data/lib/sdl2/events.rb +184 -85
  16. data/lib/sdl2/gamecontroller.rb +1 -1
  17. data/lib/sdl2/gem_version.rb +1 -1
  18. data/lib/sdl2/joystick.rb +1 -1
  19. data/lib/sdl2/keyboard.rb +3 -0
  20. data/lib/sdl2/mouse.rb +5 -5
  21. data/lib/sdl2/pixel_format.rb +11 -3
  22. data/lib/sdl2/pixels.rb +40 -40
  23. data/lib/sdl2/point.rb +17 -1
  24. data/lib/sdl2/power.rb +12 -3
  25. data/lib/sdl2/rect.rb +19 -0
  26. data/lib/sdl2/render.rb +3 -3
  27. data/lib/sdl2/scancode.rb +7 -0
  28. data/lib/sdl2/stdinc.rb +2 -0
  29. data/lib/sdl2/surface.rb +64 -12
  30. data/lib/sdl2/ttf.rb +52 -66
  31. data/lib/sdl2/ttf/font.rb +115 -0
  32. data/lib/sdl2/video.rb +23 -23
  33. data/lib/sdl2/window.rb +15 -15
  34. data/sdl2_ffi.gemspec +5 -2
  35. data/spec/fixtures/approvals/lazyfoonet_lesson_01_hello_world/draws_hello_to_the_window_surface.approved.png +0 -0
  36. data/spec/fixtures/approvals/lazyfoonet_lesson_01_hello_world/loaded_and_optimizes_hello_bitmap.approved.png +0 -0
  37. data/spec/fixtures/approvals/lazyfoonet_lesson_02_optimized_images/draws_the_message_and_background.approved.png +0 -0
  38. data/spec/fixtures/approvals/lazyfoonet_lesson_03_extension_libraries/should_blit_a_png_to_screen.approved.png +0 -0
  39. data/spec/fixtures/approvals/lazyfoonet_lesson_04_event_driven_programming/draws_something_to_the_screen.approved.png +0 -0
  40. data/spec/fixtures/approvals/lazyfoonet_lesson_05_color_keying/draws_the_sprite_using_a_color_key.approved.png +0 -0
  41. data/spec/fixtures/approvals/lazyfoonet_lesson_06_clip_blitting_and_sprite_sheets/draws_the_clipped_sprites_to_the_screen.approved.png +0 -0
  42. data/spec/fixtures/approvals/lazyfoonet_lesson_07_true_type_fonts/draws_the_message_to_the_screen.approved.png +0 -0
  43. data/spec/fixtures/approvals/lazyfoonet_lesson_07_true_type_fonts/writes_a_message_to_a_surface.approved.png +0 -0
  44. data/spec/fixtures/approvals/lazyfoonet_lesson_08_key_presses/rendered_the_down_message.approved.png +0 -0
  45. data/spec/fixtures/approvals/lazyfoonet_lesson_08_key_presses/rendered_the_left_message.approved.png +0 -0
  46. data/spec/fixtures/approvals/lazyfoonet_lesson_08_key_presses/rendered_the_right_message.approved.png +0 -0
  47. data/spec/fixtures/approvals/lazyfoonet_lesson_08_key_presses/rendered_the_up_message.approved.png +0 -0
  48. data/spec/fixtures/approvals/sdl2_color/looks_blue_when_it_should.approved.png +0 -0
  49. data/spec/fixtures/approvals/sdl2_color/looks_green_when_it_should.approved.png +0 -0
  50. data/spec/fixtures/approvals/sdl2_color/looks_red_when_it_should.approved.png +0 -0
  51. data/spec/fixtures/approvals/sdl2_color/should_cast_arrays_properly.approved.png +0 -0
  52. data/spec/fixtures/approvals/sdl2_color/should_cast_hashes_properly.approved.png +0 -0
  53. data/spec/fixtures/fonts/FreeMono.ttf +0 -0
  54. data/spec/fixtures/fonts/GaroaHackerClubeBold.otf +0 -0
  55. data/spec/fixtures/fonts/GaroaHackerClubeBold.otf.credits.yaml +4 -0
  56. data/spec/fixtures/images/an_example.png +0 -0
  57. data/spec/fixtures/images/background.bmp +0 -0
  58. data/spec/fixtures/images/background.jpg +0 -0
  59. data/spec/fixtures/images/background.png +0 -0
  60. data/spec/fixtures/images/foo.jpg +0 -0
  61. data/spec/fixtures/images/hello.bmp +0 -0
  62. data/spec/fixtures/images/sprites.jpg +0 -0
  63. data/spec/fixtures/images/tile.png +0 -0
  64. data/spec/fixtures/images/x.png +0 -0
  65. data/spec/functional/lazy_foo_tutorial/lazy_foo_01_hello_world_spec.rb +39 -0
  66. data/spec/functional/lazy_foo_tutorial/lazy_foo_02_optimized_images_spec.rb +51 -0
  67. data/spec/functional/lazy_foo_tutorial/lazy_foo_03_extension_libraries_spec.rb +31 -0
  68. data/spec/functional/lazy_foo_tutorial/lazy_foo_04_event_driven_programming_spec.rb +55 -0
  69. data/spec/functional/lazy_foo_tutorial/lazy_foo_05_color_keying_spec.rb +41 -0
  70. data/spec/functional/lazy_foo_tutorial/lazy_foo_06_clip_blitting_and_sprite_sheets_spec.rb +41 -0
  71. data/spec/functional/lazy_foo_tutorial/lazy_foo_07_true_type_fonts_spec.rb +56 -0
  72. data/spec/functional/lazy_foo_tutorial/lazy_foo_08_key_presses_spec.rb +120 -0
  73. data/spec/functional/lazy_foo_tutorial/lazy_foo_helper.rb +6 -0
  74. data/spec/png_writer.rb +21 -0
  75. data/spec/spec_helper.rb +23 -0
  76. data/spec/unit/sdl2/color_spec.rb +46 -0
  77. data/spec/unit/unit_helper.rb +3 -0
  78. data/test/approvals/clip_blitting_and_sprite_sheets.received.bmp +0 -0
  79. data/test/approvals/color_keying_example.approved.png +0 -0
  80. data/test/approvals/hello_world_example_hello.approved.png +0 -0
  81. data/test/approvals/hello_world_example_screen.approved.png +0 -0
  82. data/test/approvals/optimized_surface_loading.approved.png +0 -0
  83. data/test/fixtures/background.jpg +0 -0
  84. data/test/fixtures/foo.jpg +0 -0
  85. data/test/fixtures/sprites.jpg +0 -0
  86. data/test/fixtures/x.png +0 -0
  87. data/test/functional/examples/lazyfoo.net_s/test_clip_blitting_and_sprite_sheets.rb +50 -0
  88. data/test/functional/examples/lazyfoo.net_s/test_color_keying.rb +42 -0
  89. data/test/functional/examples/test_lazy_foo_examples.rb +120 -48
  90. data/test/test_helper.rb +9 -0
  91. metadata +138 -4
  92. data/graph +0 -566
@@ -9,12 +9,19 @@ module SDL2
9
9
  :b, :uint8,
10
10
  :a, :uint8
11
11
 
12
- [:r,:g,:b,:a].each do |field|
13
- define_method field do
14
- self[field]
15
- end
16
- define_method "#{field}=".to_sym do |value|
17
- self[field]=value
12
+ member_readers *members
13
+ member_writers *members
14
+
15
+ # If possible, convert argument into a SDL::Color
16
+ def self.cast(something)
17
+ if something.kind_of? Array
18
+ something.map!(&:to_i)
19
+ result = new
20
+ result.set(*something)
21
+
22
+ return result
23
+ else
24
+ return super
18
25
  end
19
26
  end
20
27
 
@@ -22,7 +29,7 @@ module SDL2
22
29
  self.r = r
23
30
  self.g = g
24
31
  self.b = b
25
- self.a = a unless a.nil?
32
+ self.a = a.nil? ? ALPHA_OPAQUE : a
26
33
  end
27
34
 
28
35
  def copy_from(color)
@@ -30,6 +37,11 @@ module SDL2
30
37
  self.send("#{c}=", color.send(c))
31
38
  end
32
39
  end
40
+
41
+ def to_a
42
+ [r, g, b, a]
43
+ end
33
44
  end
45
+ # Alternative spelling of Color
34
46
  Colour = Color # Because SDL does it
35
47
  end
@@ -21,48 +21,48 @@ module SDL2
21
21
 
22
22
  QUIT = 0x100
23
23
 
24
- APP_TERMINATING = next_const_value
25
- APP_LOWMEMORY = next_const_value
26
- APP_WILLENTERBACKGROUND = next_const_value
27
- APP_DIDENTERBACKGROUND = next_const_value
28
- APP_WILLENTERFOREGROUND = next_const_value
29
- APP_DIDENTERFOREGROUND = next_const_value
24
+ APP_TERMINATING
25
+ APP_LOWMEMORY
26
+ APP_WILLENTERBACKGROUND
27
+ APP_DIDENTERBACKGROUND
28
+ APP_WILLENTERFOREGROUND
29
+ APP_DIDENTERFOREGROUND
30
30
 
31
31
  WINDOWEVENT = 0x200
32
- SYSWMEVENT = next_const_value
32
+ SYSWMEVENT
33
33
 
34
34
  KEYDOWN = 0x300
35
- KEYUP = next_const_value
36
- TEXTEDITING = next_const_value
37
- TEXTINPUT = next_const_value
35
+ KEYUP
36
+ TEXTEDITING
37
+ TEXTINPUT
38
38
 
39
39
  MOUSEMOTION = 0x400
40
- MOUSEBUTTONDOWN = next_const_value
41
- MOUSEBUTTONUP = next_const_value
42
- MOUSEWHEEL = next_const_value
40
+ MOUSEBUTTONDOWN
41
+ MOUSEBUTTONUP
42
+ MOUSEWHEEL
43
43
 
44
44
  JOYAXISMOTION = 0x600
45
- JOYBALLMOTION = next_const_value
46
- JOYHATMOTION = next_const_value
47
- JOYBUTTONDOWN = next_const_value
48
- JOYBUTTONUP = next_const_value
49
- JOYDEVICEADDED = next_const_value
50
- JOYDEVICEREMOVED = next_const_value
45
+ JOYBALLMOTION
46
+ JOYHATMOTION
47
+ JOYBUTTONDOWN
48
+ JOYBUTTONUP
49
+ JOYDEVICEADDED
50
+ JOYDEVICEREMOVED
51
51
 
52
52
  CONTROLLERAXISMOTION = 0x650
53
- CONTROLLERBUTTONDOWN = next_const_value
54
- CONTROLLERBUTTONUP = next_const_value
55
- CONTROLLERDEVICEADDED = next_const_value
56
- CONTROLLERDEVICEREMOVED = next_const_value
57
- CONTROLLERDEVICEREMAPPED = next_const_value
53
+ CONTROLLERBUTTONDOWN
54
+ CONTROLLERBUTTONUP
55
+ CONTROLLERDEVICEADDED
56
+ CONTROLLERDEVICEREMOVED
57
+ CONTROLLERDEVICEREMAPPED
58
58
 
59
59
  FINGERDOWN = 0x700
60
- FINGERUP = next_const_value
61
- FINGERMOTION = next_const_value
60
+ FINGERUP
61
+ FINGERMOTION
62
62
 
63
63
  DOLLARGESTURE = 0x800
64
- DOLLARRECORD = next_const_value
65
- MULTIGESTURE = next_const_value
64
+ DOLLARRECORD
65
+ MULTIGESTURE
66
66
 
67
67
  CLIPBOARDUPDATE = 0x900
68
68
 
@@ -75,16 +75,20 @@ module SDL2
75
75
 
76
76
  enum :event_type, EVENTTYPE.flatten_consts
77
77
 
78
+ class AbstractEvent < Struct
79
+ SHARED = [:type, :event_type, :timestamp, :uint32]
80
+ end
81
+
78
82
  # Fields shared by every event
79
- class CommonEvent < Struct
80
- LAYOUT = [:type, :uint32, :timestamp, :uint32]
81
- layout *LAYOUT
83
+ class CommonEvent < AbstractEvent
82
84
 
85
+ layout *SHARED
83
86
  end
84
87
 
85
88
  # Window state change event data (event.window.*)
86
- class WindowEvent < Struct
87
- layout *CommonEvent::LAYOUT + [
89
+ class WindowEvent < AbstractEvent
90
+
91
+ layout *SHARED + [
88
92
  :windowID, :uint32,
89
93
  :event, :uint8,
90
94
  :padding1, :uint8,
@@ -93,11 +97,14 @@ module SDL2
93
97
  :data1, :int32,
94
98
  :data2, :int32
95
99
  ]
100
+ member_readers *members
101
+ member_writers *members
96
102
  end
97
103
 
98
104
  # Keyboard button event structure (event.key.*)
99
- class KeyboardEvent < Struct
100
- layout *CommonEvent::LAYOUT + [
105
+ class KeyboardEvent < AbstractEvent
106
+
107
+ layout *SHARED + [
101
108
  :windowID, :uint32,
102
109
  :state, :uint8,
103
110
  :repeat, :uint8,
@@ -105,31 +112,40 @@ module SDL2
105
112
  :padding3, :uint8,
106
113
  :keysym, Keysym
107
114
  ]
115
+ member_readers *members
116
+ member_writers *members
108
117
  end
109
118
 
110
119
  # Keyboard text editing event structure (event.edit.*)
111
- class TextEditingEvent < Struct
120
+ class TextEditingEvent < AbstractEvent
121
+
112
122
  TEXT_SIZE = 32 # Line 188
113
- layout *CommonEvent::LAYOUT + [
123
+ layout *SHARED + [
114
124
  :windowID, :uint32,
115
125
  :char, [:char, TEXT_SIZE],
116
126
  :start, :int32,
117
127
  :length, :int32
118
128
  ]
129
+ member_readers *members
130
+ member_writers *members
119
131
  end
120
132
 
121
133
  # Keyboard text input event structure (event.text.*)
122
- class TextInputEvent < Struct
134
+ class TextInputEvent < AbstractEvent
135
+
123
136
  TEXT_SIZE = 32 # Line 203
124
- layout *CommonEvent::LAYOUT + [
137
+ layout *SHARED + [
125
138
  :windowID, :uint32,
126
139
  :char, [:char, TEXT_SIZE]
127
140
  ]
141
+ member_readers *members
142
+ member_writers *members
128
143
  end
129
144
 
130
145
  # Mouse motion event structure (event.motion.*)
131
- class MouseMotionEvent < Struct
132
- layout *CommonEvent::LAYOUT + [
146
+ class MouseMotionEvent < AbstractEvent
147
+
148
+ layout *SHARED + [
133
149
  :windowID, :uint32,
134
150
  :which, :uint32,
135
151
  :state, :uint32,
@@ -138,11 +154,14 @@ module SDL2
138
154
  :xrel, :int32,
139
155
  :yrel, :int32
140
156
  ]
157
+ member_readers *members
158
+ member_writers *members
141
159
  end
142
160
 
143
161
  # Mouse button event structure (event.button.*)
144
- class MouseButtonEvent < Struct
145
- layout *CommonEvent::LAYOUT + [
162
+ class MouseButtonEvent < AbstractEvent
163
+
164
+ layout *SHARED + [
146
165
  :windowID, :uint32,
147
166
  :which, :uint32,
148
167
  :button, :uint8,
@@ -152,21 +171,27 @@ module SDL2
152
171
  :x, :int32,
153
172
  :y, :int32
154
173
  ]
174
+ member_readers *members
175
+ member_writers *members
155
176
  end
156
177
 
157
178
  # Mouse wheel event structure (event.wheel.*)
158
- class MouseWheelEvent < Struct
159
- layout *CommonEvent::LAYOUT + [
179
+ class MouseWheelEvent < AbstractEvent
180
+
181
+ layout *SHARED + [
160
182
  :windowID, :uint32,
161
183
  :which, :uint32,
162
184
  :x, :int32,
163
185
  :y, :int32
164
186
  ]
187
+ member_readers *members
188
+ member_writers *members
165
189
  end
166
190
 
167
191
  # Joystick axis motion event structure (event.jaxis.*)
168
- class JoyAxisEvent < Struct
169
- layout *CommonEvent::LAYOUT + [
192
+ class JoyAxisEvent < AbstractEvent
193
+
194
+ layout *SHARED + [
170
195
  :which, :joystick_id,
171
196
  :axis, :uint8,
172
197
  :padding1, :uint8,
@@ -175,11 +200,14 @@ module SDL2
175
200
  :value, :int16,
176
201
  :padding4, :uint16
177
202
  ]
203
+ member_readers *members
204
+ member_writers *members
178
205
  end
179
206
 
180
207
  # Joystick trackball motion event structure (event.jball.*)
181
- class JoyBallEvent < Struct
182
- layout *CommonEvent::LAYOUT + [
208
+ class JoyBallEvent < AbstractEvent
209
+
210
+ layout *SHARED + [
183
211
  :which, :joystick_id,
184
212
  :ball, :uint8,
185
213
  :padding1, :uint8,
@@ -188,40 +216,52 @@ module SDL2
188
216
  :xrel, :int16,
189
217
  :yrel, :int16
190
218
  ]
219
+ member_readers *members
220
+ member_writers *members
191
221
  end
192
222
 
193
223
  # Joystick hat position change event structure (event.jhat.*)
194
- class JoyHatEvent < Struct
195
- layout *CommonEvent::LAYOUT + [
224
+ class JoyHatEvent < AbstractEvent
225
+
226
+ layout *SHARED + [
196
227
  :which, :joystick_id,
197
228
  :hat, :uint8,
198
229
  :value, :uint8,
199
230
  :padding1, :uint8,
200
231
  :padding2, :uint8
201
232
  ]
233
+ member_readers *members
234
+ member_writers *members
202
235
  end
203
236
 
204
237
  # Joystick button event structure (event.jbutton.*)
205
- class JoyButtonEvent < Struct
206
- layout *CommonEvent::LAYOUT + [
238
+ class JoyButtonEvent < AbstractEvent
239
+
240
+ layout *SHARED + [
207
241
  :which, :joystick_id,
208
242
  :button, :uint8,
209
243
  :state, :uint8,
210
244
  :padding1, :uint8,
211
245
  :padding2, :uint8
212
246
  ]
247
+ member_readers *members
248
+ member_writers *members
213
249
  end
214
250
 
215
251
  # Joystick device event structure (event.jdevice.*)
216
- class JoyDeviceEvent < Struct
217
- layout *CommonEvent::LAYOUT + [
252
+ class JoyDeviceEvent < AbstractEvent
253
+
254
+ layout *SHARED + [
218
255
  :which, :joystick_id
219
256
  ]
257
+ member_readers *members
258
+ member_writers *members
220
259
  end
221
260
 
222
261
  # Game controller axis motion event structure (event.caxis.*)
223
- class ControllerAxisEvent < Struct
224
- layout *CommonEvent::LAYOUT + [
262
+ class ControllerAxisEvent < AbstractEvent
263
+
264
+ layout *SHARED + [
225
265
  :which, :joystick_id,
226
266
  :axis, :uint8,
227
267
  :padding1, :uint8,
@@ -230,29 +270,38 @@ module SDL2
230
270
  :value, :int16,
231
271
  :padding4, :uint16
232
272
  ]
273
+ member_readers *members
274
+ member_writers *members
233
275
  end
234
276
 
235
277
  # Game controller button event structure (event.cbutton.*)
236
- class ControllerButtonEvent < Struct
237
- layout *CommonEvent::LAYOUT + [
278
+ class ControllerButtonEvent < AbstractEvent
279
+
280
+ layout *SHARED + [
238
281
  :which, :joystick_id,
239
282
  :button, :uint8,
240
283
  :state, :uint8,
241
284
  :padding1, :uint8,
242
285
  :padding2, :uint8
243
286
  ]
287
+ member_readers *members
288
+ member_writers *members
244
289
  end
245
290
 
246
291
  # Controller device event structure (event.cdevice.*)
247
- class ControllerDeviceEvent < Struct
248
- layout *CommonEvent::LAYOUT + [
292
+ class ControllerDeviceEvent < AbstractEvent
293
+
294
+ layout *SHARED + [
249
295
  :which, :joystick_id
250
296
  ]
297
+ member_readers *members
298
+ member_writers *members
251
299
  end
252
300
 
253
301
  # Touch finger event structure (event.tfinger.*)
254
- class TouchFingerEvent < Struct
255
- layout *CommonEvent::LAYOUT + [
302
+ class TouchFingerEvent < AbstractEvent
303
+
304
+ layout *SHARED + [
256
305
  :touchId, :touch_id,
257
306
  :fingerId, :finger_id,
258
307
  :x, :float,
@@ -261,11 +310,14 @@ module SDL2
261
310
  :dy, :float,
262
311
  :pressure, :float
263
312
  ]
313
+ member_readers *members
314
+ member_writers *members
264
315
  end
265
316
 
266
317
  # Multiple Finger Gesture Event (event.mgesture.*)
267
- class MultiGestureEvent < Struct
268
- layout *CommonEvent::LAYOUT + [
318
+ class MultiGestureEvent < AbstractEvent
319
+
320
+ layout *SHARED + [
269
321
  :touchId, :touch_id,
270
322
  :dTheta, :float,
271
323
  :dDist, :float,
@@ -274,11 +326,14 @@ module SDL2
274
326
  :numFingers, :uint16,
275
327
  :padding, :uint16
276
328
  ]
329
+ member_readers *members
330
+ member_writers *members
277
331
  end
278
332
 
279
333
  # Dollar Gesture Event (event.dgesture.*)
280
- class DollarGestureEvent < Struct
281
- layout *CommonEvent::LAYOUT + [
334
+ class DollarGestureEvent < AbstractEvent
335
+
336
+ layout *SHARED + [
282
337
  :touchId, :touch_id,
283
338
  :gestureId, :gesture_id,
284
339
  :numFingers, :uint32,
@@ -286,6 +341,8 @@ module SDL2
286
341
  :x, :float,
287
342
  :y, :float
288
343
  ]
344
+ member_readers *members
345
+ member_writers *members
289
346
  end
290
347
 
291
348
  # @brief An event used to request a file open by the system (event.drop.*)
@@ -293,30 +350,41 @@ module SDL2
293
350
  # SDL_EventState()
294
351
  # @note If you enable this event, you must free the filename in the event.
295
352
  #
296
- class DropEvent < Struct
297
- layout *CommonEvent::LAYOUT + [
353
+ class DropEvent < AbstractEvent
354
+
355
+ layout *SHARED + [
298
356
  :file, :string
299
357
  ]
358
+ member_readers *members
359
+ member_writers *members
300
360
  end
301
361
 
302
362
  # The "quit requested" event
303
- class QuitEvent < Struct
304
- layout *CommonEvent::LAYOUT
363
+ class QuitEvent < AbstractEvent
364
+
365
+ layout *SHARED
366
+ member_readers *members
367
+ member_writers *members
305
368
  end
306
369
 
307
370
  # OS Specific event
308
- class OSEvent < Struct
309
- layout *CommonEvent::LAYOUT
371
+ class OSEvent < AbstractEvent
372
+
373
+ layout *SHARED
374
+ member_readers *members
375
+ member_writers *members
310
376
  end
311
377
 
312
378
  # A user-defined event type (event.user.*)
313
- class UserEvent < Struct
314
- layout *CommonEvent::LAYOUT + [
379
+ class UserEvent < AbstractEvent
380
+ layout *SHARED + [
315
381
  :windowID, :uint32,
316
382
  :code, :int32,
317
383
  :data1, :pointer,
318
384
  :data2, :pointer
319
385
  ]
386
+ member_readers *members
387
+ member_writers *members
320
388
  end
321
389
 
322
390
  # @brief A video driver dependent system event (event.syswm.*)
@@ -324,8 +392,8 @@ module SDL2
324
392
  # SDL_EventState()
325
393
  #
326
394
  # @note If you want to use this event, you should include SDL_syswm.h.
327
- class SysWMEvent < Struct
328
- layout *CommonEvent::LAYOUT + [
395
+ class SysWMEvent < AbstractEvent
396
+ layout *SHARED + [
329
397
  :msg, SDL2::SysWM::Msg.by_ref
330
398
  ]
331
399
  end
@@ -333,8 +401,8 @@ module SDL2
333
401
  # General event UNION (structure)
334
402
  # Remember that this is a union, all other structures not related to #type are
335
403
  # garbage
336
- class Event < FFI::Union
337
- layout :type, :uint32,
404
+ class Event < Union
405
+ layout :type, :event_type,
338
406
  :common, CommonEvent,
339
407
  :window, WindowEvent,
340
408
  :key, KeyboardEvent,
@@ -357,13 +425,43 @@ module SDL2
357
425
  :mgesture, MultiGestureEvent,
358
426
  :drop, DropEvent,
359
427
  :padding, [:uint8, 56] # From SDL_events.h:529
428
+
429
+ member_readers *members
430
+ member_writers *members
431
+
432
+ # Polls for currently pending events
433
+ # @returns SDL2::Event or nil if there are no events.
434
+ def self.poll()
435
+ tmp_event = SDL2::Event.new
436
+ unless SDL2.poll_event?(tmp_event)
437
+ tmp_event.pointer.free
438
+ tmp_event = nil
439
+ end
440
+ return tmp_event # May be nil if SDL2.poll_event fails.
441
+ end
442
+
443
+ def self.cast(something)
444
+ if something.kind_of? AbstractEvent
445
+ return self.new(something.pointer)
446
+ else
447
+ raise "Is not an AbstractEvent!: #{something.inspect}"
448
+ end
449
+ end
450
+
451
+ # Converts SDL's type integer into a EVENTTYPE symbol
452
+ # Returns :UNKOWN on failure.
453
+ def type_symbol
454
+ sym = EVENTTYPE.by_value[self.type]
455
+ sym.nil? ? :UNKOWN : sym
456
+ end
457
+
360
458
  end
361
459
 
362
460
  module EVENTACTION
363
461
  include EnumerableConstants
364
- ADD = next_const_value
365
- PEEK = next_const_value
366
- GET = next_const_value
462
+ ADD
463
+ PEEK
464
+ GET
367
465
  end
368
466
 
369
467
  enum :eventaction, EVENTACTION.flatten_consts
@@ -376,9 +474,10 @@ module SDL2
376
474
  api :SDL_FlushEvent, [:uint32], :void
377
475
  api :SDL_FlushEvents, [:uint32, :uint32], :void
378
476
  api :SDL_PollEvent, [Event.by_ref], :int
477
+ boolean? :poll_event, TRUE_WHEN_ONE
379
478
  api :SDL_WaitEvent, [Event.by_ref], :int
380
479
  api :SDL_WaitEventTimeout, [Event.by_ref, :count], :int
381
- api :SDL_PushEvent, [Event.by_ref, :count], :int
480
+ api :SDL_PushEvent, [Event.by_ref], :int, {error: true, filter: TRUE_WHEN_ONE}
382
481
 
383
482
  ##
384
483
  # callback event_filter #=> Proc.new do |pointer, event|; return int; end
@@ -403,11 +502,11 @@ module SDL2
403
502
  DISABLE = 0
404
503
  ENABLE = 1
405
504
  end
406
-
505
+
407
506
  enum :event_state, EVENTSTATE.flatten_consts
408
507
 
409
508
  ##
410
- #
509
+ #
411
510
  api :SDL_EventState, [:uint32, :event_state], :uint8
412
511
 
413
512
  def get_event_state(type)