blob: 35a37c87a7c7af38b24f1de120490063d7ef32ab (
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
|
;;; 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:
;;
;; SDL3 display and window management.
;;
;;; Code:
(define-module (sdl3 video)
#:use-module (rnrs bytevectors)
#:use-module (sdl3 bindings video)
#:use-module (sdl3 errors)
#:use-module (system foreign)
#:export (make-window
destroy-window!
window-size-in-pixels)
#:re-export (window?
window-destroyed?))
(define* (make-window title width height #:key
opengl?
vulkan?
metal?
(shown? #t)
fullscreen?
borderless?
transparent?
resizable?
(focusable? #t)
high-pixel-density?
always-on-top?
utility?)
"Open a window with the specified @var{title} and dimensions
@var{width} by @var{height} pixels and return a handle to that window."
(wrap-window
(sdl-assert-non-null
'make-window
(SDL_CreateWindow (string->pointer title)
width height
(logior
(if opengl? SDL_WINDOW_OPENGL 0)
(if vulkan? SDL_WINDOW_VULKAN 0)
(if metal? SDL_WINDOW_METAL 0)
(if fullscreen? SDL_WINDOW_FULLSCREEN 0)
(if shown? 0 SDL_WINDOW_HIDDEN)
(if borderless? SDL_WINDOW_BORDERLESS 0)
(if transparent? SDL_WINDOW_TRANSPARENT 0)
(if resizable? SDL_WINDOW_RESIZABLE 0)
(if focusable? 0 SDL_WINDOW_NOT_FOCUSABLE)
(if high-pixel-density? SDL_WINDOW_HIGH_PIXEL_DENSITY 0)
(if always-on-top? SDL_WINDOW_ALWAYS_ON_TOP 0)
(if utility? SDL_WINDOW_UTILITY 0))))))
;; FIXME: SDL_DestroyWindow recursively destroys child windows. Do we
;; need to keep track of those in Scheme, then?
(define (destroy-window! window)
"Close @var{window} and make handle unusable for further window
management calls."
(unless (window-destroyed? window)
(SDL_DestroyWindow (unwrap-window window))
(set-window-destroyed! window #t)))
(define (window-size-in-pixels window)
(let* ((size (sizeof int))
(bv (make-bytevector (* size 2))))
(sdl-assert
'window-size-in-pixels
(SDL_GetWindowSizeInPixels (unwrap-window window)
(bytevector->pointer bv)
(bytevector->pointer bv size)))
(values (bytevector-sint-ref bv 0 (native-endianness) size)
(bytevector-sint-ref bv size (native-endianness) size))))
|