summaryrefslogtreecommitdiff
path: root/sdl3/bindings/events.scm
blob: f123b9502759fb5fd2c4034e5f654efedf38499e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
;;; guile-sdl3 -- Scheme bindings for SDL3
;;; Copyright © 2024 David Thompson <dthompson2@worcester.edu>
;;;
;;; Licensed under the Apache License, Version 2.0 (the "License");
;;; you may not use this file except in compliance with the License.
;;; You may obtain a copy of the License at
;;;
;;;    http://www.apache.org/licenses/LICENSE-2.0
;;;
;;; Unless required by applicable law or agreed to in writing, software
;;; distributed under the License is distributed on an "AS IS" BASIS,
;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;; See the License for the specific language governing permissions and
;;; limitations under the License.

;;; Commentary:
;;
;; Low-level FFI binding utilities.
;;
;;; Code:

(define-module (sdl3 bindings events)
  #:use-module (bstruct)
  #:use-module (sdl3 bindings utils)
  #:use-module (system foreign)
  #:export (SDL_EventType
            symbol->event-type
            event-type->symbol
            SDL_EVENT_FIRST
            SDL_EVENT_QUIT
            SDL_EVENT_TERMINATING
            SDL_EVENT_LOW_MEMORY
            SDL_EVENT_WILL_ENTER_BACKGROUND
            SDL_EVENT_DID_ENTER_BACKGROUND
            SDL_EVENT_WILL_ENTER_FOREGROUND
            SDL_EVENT_DID_ENTER_FOREGROUND
            SDL_EVENT_LOCALE_CHANGED
            SDL_EVENT_SYSTEM_THEME_CHANGED
            SDL_EVENT_DISPLAY_ORIENTATION
            SDL_EVENT_DISPLAY_ADDED
            SDL_EVENT_DISPLAY_REMOVED
            SDL_EVENT_DISPLAY_MOVED
            SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED
            SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED
            SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED
            SDL_EVENT_WINDOW_SHOWN
            SDL_EVENT_WINDOW_HIDDEN
            SDL_EVENT_WINDOW_EXPOSED
            SDL_EVENT_WINDOW_MOVED
            SDL_EVENT_WINDOW_RESIZED
            SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED
            SDL_EVENT_WINDOW_METAL_VIEW_RESIZED
            SDL_EVENT_WINDOW_MINIMIZED
            SDL_EVENT_WINDOW_MAXIMIZED
            SDL_EVENT_WINDOW_RESTORED
            SDL_EVENT_WINDOW_MOUSE_ENTER
            SDL_EVENT_WINDOW_MOUSE_LEAVE
            SDL_EVENT_WINDOW_FOCUS_GAINED
            SDL_EVENT_WINDOW_FOCUS_LOST
            SDL_EVENT_WINDOW_CLOSE_REQUESTED
            SDL_EVENT_WINDOW_HIT_TEST
            SDL_EVENT_WINDOW_ICCPROF_CHANGED
            SDL_EVENT_WINDOW_DISPLAY_CHANGED
            SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED
            SDL_EVENT_WINDOW_SAFE_AREA_CHANGED
            SDL_EVENT_WINDOW_OCCLUDED
            SDL_EVENT_WINDOW_ENTER_FULLSCREEN
            SDL_EVENT_WINDOW_LEAVE_FULLSCREEN
            SDL_EVENT_WINDOW_DESTROYED
            SDL_EVENT_WINDOW_HDR_STATE_CHANGED
            SDL_EVENT_KEY_DOWN
            SDL_EVENT_KEY_UP
            SDL_EVENT_TEXT_EDITING
            SDL_EVENT_TEXT_INPUT
            SDL_EVENT_KEYMAP_CHANGED
            SDL_EVENT_KEYBOARD_ADDED
            SDL_EVENT_KEYBOARD_REMOVED
            SDL_EVENT_TEXT_EDITING_CANDIDATES
            SDL_EVENT_MOUSE_MOTION
            SDL_EVENT_MOUSE_BUTTON_DOWN
            SDL_EVENT_MOUSE_BUTTON_UP
            SDL_EVENT_MOUSE_WHEEL
            SDL_EVENT_MOUSE_ADDED
            SDL_EVENT_MOUSE_REMOVED
            SDL_EVENT_JOYSTICK_AXIS_MOTION
            SDL_EVENT_JOYSTICK_BALL_MOTION
            SDL_EVENT_JOYSTICK_HAT_MOTION
            SDL_EVENT_JOYSTICK_BUTTON_DOWN
            SDL_EVENT_JOYSTICK_BUTTON_UP
            SDL_EVENT_JOYSTICK_ADDED
            SDL_EVENT_JOYSTICK_REMOVED
            SDL_EVENT_JOYSTICK_BATTERY_UPDATED
            SDL_EVENT_JOYSTICK_UPDATE_COMPLETE
            SDL_EVENT_GAMEPAD_AXIS_MOTION
            SDL_EVENT_GAMEPAD_BUTTON_DOWN
            SDL_EVENT_GAMEPAD_BUTTON_UP
            SDL_EVENT_GAMEPAD_ADDED
            SDL_EVENT_GAMEPAD_REMOVED
            SDL_EVENT_GAMEPAD_REMAPPED
            SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN
            SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION
            SDL_EVENT_GAMEPAD_TOUCHPAD_UP
            SDL_EVENT_GAMEPAD_SENSOR_UPDATE
            SDL_EVENT_GAMEPAD_UPDATE_COMPLETE
            SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED
            SDL_EVENT_FINGER_DOWN
            SDL_EVENT_FINGER_UP
            SDL_EVENT_FINGER_MOTION
            SDL_EVENT_CLIPBOARD_UPDATE
            SDL_EVENT_DROP_FILE
            SDL_EVENT_DROP_TEXT
            SDL_EVENT_DROP_BEGIN
            SDL_EVENT_DROP_COMPLETE
            SDL_EVENT_DROP_POSITION
            SDL_EVENT_AUDIO_DEVICE_ADDED
            SDL_EVENT_AUDIO_DEVICE_REMOVED
            SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED
            SDL_EVENT_SENSOR_UPDATE
            SDL_EVENT_PEN_PROXIMITY_IN
            SDL_EVENT_PEN_PROXIMITY_OUT
            SDL_EVENT_PEN_DOWN
            SDL_EVENT_PEN_UP
            SDL_EVENT_PEN_BUTTON_DOWN
            SDL_EVENT_PEN_BUTTON_UP
            SDL_EVENT_PEN_MOTION
            SDL_EVENT_PEN_AXIS
            SDL_EVENT_CAMERA_DEVICE_ADDED
            SDL_EVENT_CAMERA_DEVICE_REMOVED
            SDL_EVENT_CAMERA_DEVICE_APPROVED
            SDL_EVENT_CAMERA_DEVICE_DENIED
            SDL_EVENT_RENDER_TARGETS_RESET
            SDL_EVENT_RENDER_DEVICE_RESET
            SDL_EVENT_POLL_SENTINEL
            SDL_EVENT_DISPLAY_FIRST
            SDL_EVENT_DISPLAY_LAST
            SDL_EVENT_WINDOW_FIRST
            SDL_EVENT_WINDOW_LAST
            SDL_EVENT_USER
            SDL_EVENT_LAST
            SDL_EVENT_ENUM_PADDING

            SDL_CommonEvent
            SDL_DisplayEvent
            SDL_WindowEvent
            SDL_KeyboardDeviceEvent
            SDL_KeyboardEvent
            SDL_TextEditingEvent
            SDL_TextEditingCandidatesEvent
            SDL_TextInputEvent
            SDL_MouseDeviceEvent
            SDL_MouseMotionEvent
            SDL_MouseButtonEvent
            SDL_MouseWheelEvent
            SDL_JoyAxisEvent
            SDL_JoyBallEvent
            SDL_JoyHatEvent
            SDL_JoyButtonEvent
            SDL_JoyDeviceEvent
            SDL_JoyBatteryEvent
            SDL_GamepadAxisEvent
            SDL_GamepadButtonEvent
            SDL_GamepadDeviceEvent
            SDL_GamepadTouchpadEvent
            SDL_GamepadSensorEvent
            SDL_AudioDeviceEvent
            SDL_CameraDeviceEvent
            SDL_TouchFingerEvent
            SDL_PenProximityEvent
            SDL_PenMotionEvent
            SDL_PenTouchEvent
            SDL_PenButtonEvent
            SDL_PenAxisEvent
            SDL_DropEvent
            SDL_ClipboardEvent
            SDL_SensorEvent
            SDL_QuitEvent
            SDL_UserEvent
            SDL_Event

            SDL_PumpEvents
            SDL_HasEvent
            SDL_HasEvents
            SDL_FlushEvent
            SDL_FlushEvents
            SDL_PollEvent
            SDL_WaitEvent
            SDL_WaitEventTimeout
            SDL_PushEvent))

(define-enum SDL_EventType
  symbol->event-type
  event-type->symbol
  (first SDL_EVENT_FIRST)
  (quit SDL_EVENT_QUIT #x100)
  (terminating SDL_EVENT_TERMINATING)
  (low-memory SDL_EVENT_LOW_MEMORY)
  (will-enter-background SDL_EVENT_WILL_ENTER_BACKGROUND)
  (did-enter-background SDL_EVENT_DID_ENTER_BACKGROUND)
  (will-enter-foreground SDL_EVENT_WILL_ENTER_FOREGROUND)
  (did-enter-foreground SDL_EVENT_DID_ENTER_FOREGROUND)
  (locale-changed SDL_EVENT_LOCALE_CHANGED)
  (system-theme-changed SDL_EVENT_SYSTEM_THEME_CHANGED)
  (display-orientation SDL_EVENT_DISPLAY_ORIENTATION #x151)
  (display-added SDL_EVENT_DISPLAY_ADDED)
  (display-removed SDL_EVENT_DISPLAY_REMOVED)
  (display-moved SDL_EVENT_DISPLAY_MOVED)
  (display-desktop-mode-changed SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED)
  (display-current-mode-changed SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED)
  (display-content-scale-changed SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED)
  (window-shown SDL_EVENT_WINDOW_SHOWN #x202)
  (window-hidden SDL_EVENT_WINDOW_HIDDEN)
  (window-exposed SDL_EVENT_WINDOW_EXPOSED)
  (window-moved SDL_EVENT_WINDOW_MOVED)
  (window-resized SDL_EVENT_WINDOW_RESIZED)
  (window-pixel-size-changed SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED)
  (window-metal-view-resized SDL_EVENT_WINDOW_METAL_VIEW_RESIZED)
  (window-minimized SDL_EVENT_WINDOW_MINIMIZED)
  (window-maximized SDL_EVENT_WINDOW_MAXIMIZED)
  (window-restored SDL_EVENT_WINDOW_RESTORED)
  (window-mouse-enter SDL_EVENT_WINDOW_MOUSE_ENTER)
  (window-mouse-leave SDL_EVENT_WINDOW_MOUSE_LEAVE)
  (window-focus-gained SDL_EVENT_WINDOW_FOCUS_GAINED)
  (window-focus-lost SDL_EVENT_WINDOW_FOCUS_LOST)
  (window-close-requested SDL_EVENT_WINDOW_CLOSE_REQUESTED)
  (window-hit-test SDL_EVENT_WINDOW_HIT_TEST)
  (window-iccprof-changed SDL_EVENT_WINDOW_ICCPROF_CHANGED)
  (window-display-changed SDL_EVENT_WINDOW_DISPLAY_CHANGED)
  (window-display-scale-changed SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED)
  (window-safe-area-changed SDL_EVENT_WINDOW_SAFE_AREA_CHANGED)
  (window-occluded SDL_EVENT_WINDOW_OCCLUDED)
  (window-enter-fullscreen SDL_EVENT_WINDOW_ENTER_FULLSCREEN)
  (window-leave-fullscreen SDL_EVENT_WINDOW_LEAVE_FULLSCREEN)
  (window-destroyed SDL_EVENT_WINDOW_DESTROYED)
  (window-hdr-state-changed SDL_EVENT_WINDOW_HDR_STATE_CHANGED)
  (key-down SDL_EVENT_KEY_DOWN #x300)
  (key-up SDL_EVENT_KEY_UP)
  (text-editing SDL_EVENT_TEXT_EDITING)
  (text-input SDL_EVENT_TEXT_INPUT)
  (keymap-changed SDL_EVENT_KEYMAP_CHANGED)
  (keyboard-added SDL_EVENT_KEYBOARD_ADDED)
  (keyboard-removed SDL_EVENT_KEYBOARD_REMOVED)
  (text-editing-candidates SDL_EVENT_TEXT_EDITING_CANDIDATES)
  (mouse-motion SDL_EVENT_MOUSE_MOTION #x400)
  (mouse-button-down SDL_EVENT_MOUSE_BUTTON_DOWN)
  (mouse-button-up SDL_EVENT_MOUSE_BUTTON_UP)
  (mouse-wheel SDL_EVENT_MOUSE_WHEEL)
  (mouse-added SDL_EVENT_MOUSE_ADDED)
  (mouse-removed SDL_EVENT_MOUSE_REMOVED)
  (joystick-axis-motion SDL_EVENT_JOYSTICK_AXIS_MOTION #x600)
  (joystick-ball-motion SDL_EVENT_JOYSTICK_BALL_MOTION)
  (joystick-hat-motion SDL_EVENT_JOYSTICK_HAT_MOTION)
  (joystick-button-down SDL_EVENT_JOYSTICK_BUTTON_DOWN)
  (joystick-button-up SDL_EVENT_JOYSTICK_BUTTON_UP)
  (joystick-added SDL_EVENT_JOYSTICK_ADDED)
  (joystick-removed SDL_EVENT_JOYSTICK_REMOVED)
  (joystick-battery-updated SDL_EVENT_JOYSTICK_BATTERY_UPDATED)
  (joystick-update-complete SDL_EVENT_JOYSTICK_UPDATE_COMPLETE)
  (gamepad-axis-motion SDL_EVENT_GAMEPAD_AXIS_MOTION #x650)
  (gamepad-button-down SDL_EVENT_GAMEPAD_BUTTON_DOWN)
  (gamepad-button-up SDL_EVENT_GAMEPAD_BUTTON_UP)
  (gamepad-added SDL_EVENT_GAMEPAD_ADDED)
  (gamepad-removed SDL_EVENT_GAMEPAD_REMOVED)
  (gamepad-remapped SDL_EVENT_GAMEPAD_REMAPPED)
  (gamepad-touchpad-down SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN)
  (gamepad-touchpad-motion SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION)
  (gamepad-touchpad-up SDL_EVENT_GAMEPAD_TOUCHPAD_UP)
  (gamepad-sensor-update SDL_EVENT_GAMEPAD_SENSOR_UPDATE)
  (gamepad-update-complete SDL_EVENT_GAMEPAD_UPDATE_COMPLETE)
  (gamepad-steam-handle-updated SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED)
  (finger-down SDL_EVENT_FINGER_DOWN #x700)
  (finger-up SDL_EVENT_FINGER_UP)
  (finger-motion SDL_EVENT_FINGER_MOTION)
  (clipboard-update SDL_EVENT_CLIPBOARD_UPDATE #x900)
  (drop-file SDL_EVENT_DROP_FILE #x1000)
  (drop-text SDL_EVENT_DROP_TEXT)
  (drop-begin SDL_EVENT_DROP_BEGIN)
  (drop-complete SDL_EVENT_DROP_COMPLETE)
  (drop-position SDL_EVENT_DROP_POSITION)
  (audio-device-added SDL_EVENT_AUDIO_DEVICE_ADDED #x1100)
  (audio-device-removed SDL_EVENT_AUDIO_DEVICE_REMOVED)
  (audio-device-format-changed SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED)
  (sensor-update SDL_EVENT_SENSOR_UPDATE #x1200)
  (pen-proximity-in SDL_EVENT_PEN_PROXIMITY_IN #x1300)
  (pen-proximity-out SDL_EVENT_PEN_PROXIMITY_OUT)
  (pen-down SDL_EVENT_PEN_DOWN)
  (pen-up SDL_EVENT_PEN_UP)
  (pen-button-down SDL_EVENT_PEN_BUTTON_DOWN)
  (pen-button-up SDL_EVENT_PEN_BUTTON_UP)
  (pen-motion SDL_EVENT_PEN_MOTION)
  (pen-axis SDL_EVENT_PEN_AXIS)
  (camera-device-added SDL_EVENT_CAMERA_DEVICE_ADDED #x1400)
  (camera-device-removed SDL_EVENT_CAMERA_DEVICE_REMOVED)
  (camera-device-approved SDL_EVENT_CAMERA_DEVICE_APPROVED)
  (camera-device-denied SDL_EVENT_CAMERA_DEVICE_DENIED)
  (render-targets-reset SDL_EVENT_RENDER_TARGETS_RESET #x2000)
  (render-device-reset SDL_EVENT_RENDER_DEVICE_RESET)
  (poll-sentinel SDL_EVENT_POLL_SENTINEL #x7F00))

(define SDL_EVENT_DISPLAY_FIRST SDL_EVENT_DISPLAY_ORIENTATION)
(define SDL_EVENT_DISPLAY_LAST  SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED)
(define SDL_EVENT_WINDOW_FIRST  SDL_EVENT_WINDOW_SHOWN)
(define SDL_EVENT_WINDOW_LAST   SDL_EVENT_WINDOW_HDR_STATE_CHANGED)
(define SDL_EVENT_USER          #x8000)
(define SDL_EVENT_LAST          #xFFFF)
(define SDL_EVENT_ENUM_PADDING  #x7FFFFFFF)

(define-bstruct SDL_CommonEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)))

(define-bstruct SDL_DisplayEvent
  (struct
   (type int) ; SDL_EventType
   (reserved u32)
   (timestamp u64)
   (displayID u32) ; SDL_DisplayID
   (data1 s32)
   (data2 s32)))

(define-bstruct SDL_WindowEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (data1 s32)
   (data2 s32)))

(define-bstruct SDL_KeyboardDeviceEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_KeyboardID
   ))

(define-bstruct SDL_KeyboardEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (which u32) ; SDL_KeyboardID
   (scancode int) ; SDL_Scancode
   (key int) ; SDL_Keycode
   (mod u16) ; SDL_Keymod
   (raw u16)
   (down u8) ; bool
   (repeat u8) ; bool
   ))

(define-bstruct SDL_TextEditingEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (text (* u8)) ; char*
   (start s32)
   (length s32)))

(define-bstruct SDL_TextEditingCandidatesEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (candidates (* u8))
   (num_candidates s32)
   (selected_candidate s32)
   (horizontal u8) ; bool
   (_ u8)
   (_ u8)
   (_ u8)))

(define-bstruct SDL_TextInputEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (text (* u8))))

(define-bstruct SDL_MouseDeviceEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_MouseID
   ))

(define-bstruct SDL_MouseMotionEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (which u32) ; SDL_MouseID
   (state u32) ; SDL_MouseButtonFlags
   (x f32)
   (y f32)
   (xrel f32)
   (yrel f32)))

(define-bstruct SDL_MouseButtonEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (which u32) ; SDL_MouseID
   (button u8)
   (down u8) ; bool
   (clicks u8)
   (_ u8)
   (x f32)
   (y f32)))

(define-bstruct SDL_MouseWheelEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (which u32) ; SDL_MouseID
   (x f32)
   (y f32)
   (direction int) ; SDL_MouseWheelDirection
   (mouse_x f32)
   (mouse_y f32)))

(define-bstruct SDL_JoyAxisEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   (axis u8)
   (_ u8)
   (_ u8)
   (_ u8)
   (value s16)
   (_ u16)))

(define-bstruct SDL_JoyBallEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   (ball u8)
   (_ u8)
   (_ u8)
   (_ u8)
   (xrel s32)
   (yrel s32)))

(define-bstruct SDL_JoyHatEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   (hat u8)
   (value u8)
   (_ u8)
   (_ u8)))

(define-bstruct SDL_JoyButtonEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   (button u8)
   (down u8) ; bool
   (_ u8)
   (_ u8)
   ))

(define-bstruct SDL_JoyDeviceEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   ))

(define-bstruct SDL_JoyBatteryEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   (state int) ; SDL_PowerState
   (percent int)))

(define-bstruct SDL_GamepadAxisEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   (axis u8)
   (_ u8)
   (_ u8)
   (_ u8)
   (value s16)
   (_ u16)))

(define-bstruct SDL_GamepadButtonEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   (button u8)
   (down u8) ; bool
   (_ u8)
   (_ u8)))

(define-bstruct SDL_GamepadDeviceEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   ))

(define-bstruct SDL_GamepadTouchpadEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   (touchpad s32)
   (finger s32)
   (x f32)
   (y f32)
   (pressure f32)))

(define-bstruct SDL_GamepadSensorEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_JoystickID
   (sensor s32)
   (data (array 3 f32))
   (sensor_timestamp u64)))

(define-bstruct SDL_AudioDeviceEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_AudioDeviceID
   (recording u8) ; bool
   (_ u8)
   (_ u8)
   (_ u8)))

(define-bstruct SDL_CameraDeviceEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_CameraID
   ))

(define-bstruct SDL_TouchFingerEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (touchID u32) ; SDL_TouchID
   (fingerID u32) ; SDL_FingerID
   (x f32)
   (y f32)
   (dx f32)
   (dy f32)
   (pressure f32)
   (windowID u32) ; SDL_WindowID
   ))

(define-bstruct SDL_PenProximityEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (which u32) ; SDL_PenID
   ))

(define-bstruct SDL_PenMotionEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (which u32) ; SDL_PenID
   (pen_state u32) ; SDL_PenInputFlags
   ))

(define-bstruct SDL_PenTouchEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (which u32) ; SDL_PenID
   (pen_state u32) ; SDL_PenInputFlags
   (x f32)
   (y f32)
   (eraser u8) ; bool
   (down u8) ; bool
   ))

(define-bstruct SDL_PenButtonEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (which u32) ; SDL_PenID
   (pen_state u32) ; SDL_PenInputFlags
   (x f32)
   (y f32)
   (button u8)
   (down u8) ; bool
   ))

(define-bstruct SDL_PenAxisEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32)                       ; SDL_WindowID
   (which u32)                          ; SDL_PenID
   (pen_state u32)                      ; SDL_PenInputFlags
   (x f32)
   (y f32)
   (axis int)                           ; SDL_PenAxis
   (value f32)))

(define-bstruct SDL_DropEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (x f32)
   (y f32)
   (source (* u8)) ; char*
   (data (* u8)) ; char*
   ))

(define-bstruct SDL_ClipboardEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)))

(define-bstruct SDL_SensorEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (which u32) ; SDL_SensorID
   (data (array 6 f32))
   (sensor_timestamp u64)))

(define-bstruct SDL_QuitEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)))

(define-bstruct SDL_UserEvent
  (struct
   (type u32)
   (reserved u32)
   (timestamp u64)
   (windowID u32) ; SDL_WindowID
   (code s32)
   (data1 (* void))
   (data2 (* void))))

(define-bstruct SDL_Event
  (union
   (type u32)
   (common SDL_CommonEvent)
   (display SDL_DisplayEvent)
   (window SDL_WindowEvent)
   (kdevice SDL_KeyboardDeviceEvent)
   (key SDL_KeyboardEvent)
   (edit SDL_TextEditingEvent)
   (edit_candidates SDL_TextEditingCandidatesEvent)
   (text SDL_TextInputEvent)
   (mdevice SDL_MouseDeviceEvent)
   (motion SDL_MouseMotionEvent)
   (button SDL_MouseButtonEvent)
   (wheel SDL_MouseWheelEvent)
   (jdevice SDL_JoyDeviceEvent)
   (jaxis SDL_JoyAxisEvent)
   (jball SDL_JoyBallEvent)
   (jhat SDL_JoyHatEvent)
   (jbutton SDL_JoyButtonEvent)
   (jbattery SDL_JoyBatteryEvent)
   (gdevice SDL_GamepadDeviceEvent)
   (gaxis SDL_GamepadAxisEvent)
   (gbutton SDL_GamepadButtonEvent)
   (gtouchpad SDL_GamepadTouchpadEvent)
   (gsensor SDL_GamepadSensorEvent)
   (adevice SDL_AudioDeviceEvent)
   (cdevice SDL_CameraDeviceEvent)
   (sensor SDL_SensorEvent)
   (quit SDL_QuitEvent)
   (user SDL_UserEvent)
   (tfinger SDL_TouchFingerEvent)
   (pproximity SDL_PenProximityEvent)
   (ptouch SDL_PenTouchEvent)
   (pmotion SDL_PenMotionEvent)
   (pbutton SDL_PenButtonEvent)
   (paxis SDL_PenAxisEvent)
   (drop SDL_DropEvent)
   (clipboard SDL_ClipboardEvent)
   (_ (array 128 u8))))

(define-sdl SDL_PumpEvents)
;; SDL_PeepEvents
(define-sdl SDL_HasEvent uint32 -> bool)
(define-sdl SDL_HasEvents uint32 uint32 -> bool)
(define-sdl SDL_FlushEvent uint32)
(define-sdl SDL_FlushEvents uint32 uint32)
(define-sdl SDL_PollEvent '* -> bool)
(define-sdl SDL_WaitEvent '* -> bool)
(define-sdl SDL_WaitEventTimeout '* int32 -> bool)
(define-sdl SDL_PushEvent '* -> bool)
;; SDL_SetEventFilter
;; SDL_GetEventFilter
;; SDL_AddEventWatch
;; SDL_RemoveEventWatch
;; SDL_FilterEvents
;; SDL_SetEventEnabled
;; SDL_EventEnabled
;; SDL_RegisterEvents
;; SDL_GetWindowFromEvent