summaryrefslogtreecommitdiff
path: root/sdl3/video.scm
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))))