1/* Part of the SDL3 pack for SWI-Prolog. 2 3 SDL_video.h — window management. 4 5 @see https://wiki.libsdl.org/SDL3/SDL_video 6*/ 7 8:- module(sdl_video, [ 9 sdl_createwindow/5, 10 sdl_setwindowposition/3, 11 sdl_destroywindow/1, 12 sdl_window_flag/2, 13 sdl_windowpos/2 14]). 15 16:- use_module(library(sdl/foreign), [ 17 sdl_createwindow_/5, 18 sdl_setwindowposition_/3, 19 sdl_destroywindow/1, 20 sdl_window_blob_portray/2, 21 or_list/2 22]). 23:- reexport(library(sdl/foreign), [sdl_destroywindow/1]). 24 25:- multifile error:has_type/2. 26errorhas_type(sdl_window_blob, X) :- blob(X, sdl_window_blob). 27errorhas_type(sdl_window_flag, X) :- sdl_window_flag(X, _). 28errorhas_type(sdl_windowpos, X) :- ( atom(X) -> sdl_windowpos(X, _) ; integer(X) ). 29 30:- multifile prolog:error_message//1. 31prologerror_message(type_error(sdl_window_flag, Culprit)) --> 32 { findall(F, sdl_window_flag(F, _), Fs) }, 33 [ 'sdl_window_flag (one of ~q), found ~q'-[Fs, Culprit] ]. 34prologerror_message(type_error(sdl_windowpos, Culprit)) --> 35 { findall(F, sdl_windowpos(F, _), Fs) }, 36 [ 'sdl_windowpos (one of ~q or an integer pixel offset), found ~q'-[Fs, Culprit] ]. 37 38user:portray(Window) :- 39 blob(Window, sdl_window_blob), !, 40 sdl_window_blob_portray(current_output, Window).
The user-facing flag atoms are:
fullscreenopengloccludedhiddenborderlessresizableminimizedmaximizedmouse_grabbedinput_focusmouse_focusexternalhigh_pixel_densitymouse_capturemouse_relative_modealways_on_toputilitykeyboard_grabbedfill_documentvulkanmetaltransparentnot_focusableinput_grabbed -- synonym for mouse_grabbedallow_highdpi -- synonym for high_pixel_density
Flags requiring a parent window (modal, tooltip, popup_menu) are
not exposed.79sdl_window_flag(fullscreen, 0x00000001). 80sdl_window_flag(opengl, 0x00000002). 81sdl_window_flag(occluded, 0x00000004). 82sdl_window_flag(hidden, 0x00000008). 83sdl_window_flag(borderless, 0x00000010). 84sdl_window_flag(resizable, 0x00000020). 85sdl_window_flag(minimized, 0x00000040). 86sdl_window_flag(maximized, 0x00000080). 87sdl_window_flag(mouse_grabbed, 0x00000100). 88sdl_window_flag(input_focus, 0x00000200). 89sdl_window_flag(mouse_focus, 0x00000400). 90sdl_window_flag(external, 0x00000800). 91%sdl_window_flag(modal, 0x00001000). requires a parent window 92sdl_window_flag(high_pixel_density, 0x00002000). 93sdl_window_flag(mouse_capture, 0x00004000). 94sdl_window_flag(mouse_relative_mode, 0x00008000). 95sdl_window_flag(always_on_top, 0x00010000). 96sdl_window_flag(utility, 0x00020000). 97%sdl_window_flag(tooltip, 0x00040000). requires a parent window 98%sdl_window_flag(popup_menu, 0x00080000). requires a parent window 99sdl_window_flag(keyboard_grabbed, 0x00100000). 100sdl_window_flag(fill_document, 0x00200000). 101sdl_window_flag(vulkan, 0x10000000). 102sdl_window_flag(metal, 0x20000000). 103sdl_window_flag(transparent, 0x40000000). 104sdl_window_flag(not_focusable, 0x80000000). 105sdl_window_flag(input_grabbed, Flag) :- 106 sdl_window_flag(mouse_grabbed, Flag). 107sdl_window_flag(allow_highdpi, Flag) :- 108 sdl_window_flag(high_pixel_density, Flag).
121sdl_windowpos(centered, 0x2fff0000). 122sdl_windowpos(undefined, 0x1fff0000).
131sdl_createwindow(Handle, Title, Width, Height, Flags) :-
132 must_be(var, Handle),
133 must_be(string, Title),
134 must_be(positive_integer, Width),
135 must_be(positive_integer, Height),
136 must_be(list(sdl_window_flag), Flags),
137 maplist(sdl_window_flag, Flags, IntFlags),
138 or_list(IntFlags, IntFlag),
139 sdl_createwindow_(Handle, Title, Width, Height, IntFlag).148sdl_setwindowposition(Window, X, Y) :- 149 must_be(sdl_window_blob, Window), 150 must_be(sdl_windowpos, X), 151 must_be(sdl_windowpos, Y), 152 coord(X, Xp), 153 coord(Y, Yp), 154 sdl_setwindowposition_(Window, Xp, Yp). 155 156coord(C, Cp) :- ( atom(C) -> sdl_windowpos(C, Cp) ; Cp = C ).