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.   26error:has_type(sdl_window_blob,   X) :- blob(X, sdl_window_blob).
   27error:has_type(sdl_window_flag, X) :- sdl_window_flag(X, _).
   28error:has_type(sdl_windowpos,   X) :- ( atom(X) -> sdl_windowpos(X, _) ; integer(X) ).
   29
   30:- multifile prolog:error_message//1.   31prolog:error_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] ].
   34prolog:error_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).
 sdl_window_flag(?Flag:atom, ?Value:integer) is nondet
Enumerate the window creation flags. Each flag is a Prolog atom linked to its SDL bit-mask value.

The user-facing flag atoms are:

See also
- https://wiki.libsdl.org/SDL3/SDL_CreateWindow
   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).
 sdl_windowpos(?Pos:term, ?Value:integer) is nondet
Special window-position constants. A window position is either one of these atoms or a plain integer pixel offset (validated by the sdl_windowpos type, which accepts both).
[99, 101, 110, 116, 101, 114, 101, 100]
[117, 110, 100, 101, 102, 105, 110, 101, 100]
@see https://wiki.libsdl.org/SDL3/SDL_CreateWindow @see https://wiki.libsdl.org/SDL3/SDL_WINDOWPOS_CENTERED
  121sdl_windowpos(centered, 0x2fff0000).
  122sdl_windowpos(undefined, 0x1fff0000).
 sdl_createwindow(-Handle:blob, +Title:string, +Width:positive_integer, +Height:positive_integer, +Flags:list(sdl_window_flag)) is det
Create a window. Each element of Flags must be one of the atoms enumerated by sdl_window_flag/2.
See also
- https://wiki.libsdl.org/SDL3/SDL_CreateWindow
  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).
 sdl_setwindowposition(+Window:blob, +X:sdl_windowpos, +Y:sdl_windowpos) is det
Move the window. X and Y are each either an atom enumerated by sdl_windowpos/2 or an integer pixel offset.
See also
- https://wiki.libsdl.org/SDL3/SDL_SetWindowPosition
  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 ).
 sdl_destroywindow(+Window:blob) is det
Destroy a previously created window blob.
See also
- https://wiki.libsdl.org/SDL3/SDL_DestroyWindow