12#include <SDL2/SDL_vulkan.h>
19 , _clearColour(DefaultColours::BLACK)
77 position.
x = SDL_WINDOWPOS_CENTERED_DISPLAY(descriptor.
targetDisplay);
81 position.
y = SDL_WINDOWPOS_CENTERED_DISPLAY(descriptor.
targetDisplay);
127 if (!listener(args)) {
134 if (event.type != SDL_WINDOWEVENT) {
138 if (_windowID != event.window.windowID) {
151 args.
x =
event.window.data1;
152 args.
y =
event.window.data2;
155 switch (event.window.event) {
156 case SDL_WINDOWEVENT_CLOSE: {
157 args.
x =
event.quit.type;
158 args.
y =
event.quit.timestamp;
162 case SDL_WINDOWEVENT_ENTER: {
167 case SDL_WINDOWEVENT_LEAVE: {
172 case SDL_WINDOWEVENT_FOCUS_GAINED: {
177 case SDL_WINDOWEVENT_FOCUS_LOST: {
182 case SDL_WINDOWEVENT_RESIZED: {
184 const U16 width =
to_U16(event.window.data1);
185 const U16 height =
to_U16(event.window.data2);
196 case SDL_WINDOWEVENT_SIZE_CHANGED: {
202 case SDL_WINDOWEVENT_MOVED: {
211 case SDL_WINDOWEVENT_SHOWN: {
217 case SDL_WINDOWEVENT_HIDDEN: {
223 case SDL_WINDOWEVENT_MINIMIZED: {
228 case SDL_WINDOWEVENT_MAXIMIZED: {
233 case SDL_WINDOWEVENT_RESTORED: {
245 const I32 displayIndex = SDL_GetWindowDisplayIndex(
_sdlWindow);
246 assert(displayIndex != -1);
251 I32 top = 0, left = 0, bottom = 0, right = 0;
252 if (SDL_GetWindowBordersSize(
_sdlWindow, &top, &left, &bottom, &right) != -1) {
253 return { top, left, bottom, right };
282 SDL_Vulkan_GetDrawableSize(
_sdlWindow, &w, &h );
283 if ( w > 0 && h > 0 )
292 if ( w > 0 && h > 0 )
302 if (SDL_SetWindowOpacity(_sdlWindow,
to_F32(opacity) / 255) != -1) {
303 _prevOpacity = _opacity;
314 x = SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex);
315 }
else if (!global && offset) {
319 y = SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex);
320 }
else if (!global && offset) {
331 if (!global && offset) {
350 SDL_SetWindowBordered(_sdlWindow, state ? SDL_TRUE : SDL_FALSE);
356 if (((SDL_GetWindowFlags(_sdlWindow) &
to_U32(SDL_WINDOW_SHOWN)) != 0u) == state)
360 SDL_HideWindow(_sdlWindow);
364 SDL_ShowWindow(_sdlWindow);
379 if (((SDL_GetWindowFlags(_sdlWindow) &
to_U32(SDL_WINDOW_MINIMIZED)) != 0u) != state)
383 SDL_MinimizeWindow(_sdlWindow);
395 if (((SDL_GetWindowFlags(_sdlWindow) &
to_U32(SDL_WINDOW_MAXIMIZED)) != 0u) != state)
399 SDL_MaximizeWindow(_sdlWindow);
411 return SDL_GetWindowGrab(
_sdlWindow) == SDL_TRUE;
415 SDL_SetWindowGrab(_sdlWindow, state ? SDL_TRUE : SDL_FALSE);
419 if (_type == newWindowType) {
424 _type = newWindowType;
425 I32 switchState = -1;
428 switch (newWindowType) {
430 switchState = SDL_SetWindowFullscreen(
_sdlWindow, 0);
431 assert(switchState >= 0);
435 switchState = SDL_SetWindowFullscreen(
_sdlWindow, SDL_WINDOW_FULLSCREEN_DESKTOP);
436 assert(switchState >= 0);
441 switchState = SDL_SetWindowFullscreen(
_sdlWindow, SDL_WINDOW_FULLSCREEN);
442 assert(switchState >= 0);
473 SDL_DisplayMode mode = {}, closestMode = {};
478 width =
to_U16(closestMode.w);
479 height =
to_U16(closestMode.h);
480 SDL_SetWindowDisplayMode(
_sdlWindow, &closestMode);
495 if (newW == width && newH == height) {
508 I32 width = -1, height = -1;
509 SDL_GetWindowSize(
_sdlWindow, &width, &height);
515 _renderingViewport.
set(viewport);
vec2< I32 > getPosition(bool global=false, bool offset=false) const
void bringToFront() const noexcept
vec2< U16 > getDrawableSize() const noexcept
bool _internalMoveEvent
Did we generate the window move event?
void updateDrawableSize() noexcept
void handleChangeWindowType(WindowType newWindowType)
bool hidden() const noexcept
bool maximized() const noexcept
bool minimized() const noexcept
WindowHandle handle() const noexcept
virtual ~DisplayWindow() override
std::array< GFX::CommandBufferQueue, Config::MAX_FRAMES_IN_FLIGHT > _commandBufferQueues
ErrorCode destroyWindow()
bool _internalResizeEvent
GFX::CommandBufferQueue & getCurrentCommandBufferQueue()
bool onSDLEvent(SDL_Event event) override
std::array< EventListeners, to_base(WindowEvent::COUNT)> _eventListeners
const Rect< I32 > & renderingViewport() const noexcept
bool decorated() const noexcept
void centerWindowPosition()
Centering is also easier via SDL.
vec2< U16 > _prevDimensions
void setPosition(I32 x, I32 y, bool global=false, bool offset=false)
Window positioning is handled by SDL.
DELEGATE< void > _destroyCbk
DisplayWindow(WindowManager &parent, PlatformContext &context)
bool setDimensions(U16 width, U16 height)
width and height get adjusted to the closest supported value
bool fullscreen() const noexcept
vec2< U16 > _drawableSize
I32 currentDisplayIndex() const noexcept
vec2< U16 > getDimensions() const noexcept
void opacity(U8 opacity) noexcept
Rect< I32 > getBorderSizes() const noexcept
void changeType(WindowType newType)
void notifyListeners(WindowEvent event, const WindowEventArgs &args)
bool grabState() const noexcept
ErrorCode init(U32 windowFlags, WindowType initialType, const WindowDescriptor &descriptor)
vec2< U16 > getPreviousDimensions() const noexcept
static U64 FrameCount() noexcept
FORCE_INLINE I64 getGUID() const noexcept
PlatformContext & _context
GFXDevice & gfx() noexcept
static vec2< U16 > GetFullscreenResolution() noexcept
static void DestroyAPISettings(DisplayWindow *window) noexcept
const vector< MonitorData > & monitorData() const noexcept
void set(const T *v) noexcept
set the 2 components of the vector manually using a source pointer to a (large enough) array
void set(const T *v) noexcept
set the 4 components of the vector manually using a source pointer to a (large enough) array
constexpr U8 MAX_FRAMES_IN_FLIGHT
Maximum number of active frames until we start waiting on a fence/sync.
Str StringFormat(const char *fmt, Args &&...args)
Handle console commands that start with a forward slash.
void GetWindowHandle(void *window, WindowHandle &handleOut) noexcept
constexpr U32 to_U32(const T value)
constexpr U16 to_U16(const T value)
constexpr F32 to_F32(const T value)
@ Vulkan
not supported yet
@ None
No rendering. Used for testing or server code.
constexpr I32 to_I32(const T value)
constexpr auto to_base(const Type value) -> Type
static NO_INLINE void errorfn(const char *format, T &&... args)
static NO_INLINE void printfn(const char *format, T &&... args)
DisplayWindow * parentWindow