diff --git a/SurrealEngine/GameWindow.cpp b/SurrealEngine/GameWindow.cpp index e4e700f4..86d35c7d 100644 --- a/SurrealEngine/GameWindow.cpp +++ b/SurrealEngine/GameWindow.cpp @@ -39,6 +39,35 @@ int GameWindow::GetPixelHeight() return GetNativePixelHeight(); } +void GameWindow::ToggleWindowFullscreen(Size newResolution) +{ + if (this->IsFullscreen()) + { + // First switch to normal + this->ShowNormal(); + + // Then resize the window + auto geometry = this->GetFrameGeometry(); + geometry.width = newResolution.width; + geometry.height = newResolution.height; + this->SetFrameGeometry(geometry); + } + else + { + // Get the nearest valid fullscreen resolution first + auto selectedResolution = GetClosestResolution(newResolution); + + // Then resize the window to the resolution + auto geometry = this->GetFrameGeometry(); + geometry.width = selectedResolution.width; + geometry.height = selectedResolution.height; + this->SetFrameGeometry(geometry); + + // Finally switch to fullscreen + this->ShowFullscreen(); + } +} + bool GameWindow::GetKeyState(EInputKey key) { return Widget::GetKeyState((InputKey)key); @@ -248,7 +277,7 @@ void GameWindow::SetResolution(const std::string& resolutionString) Rect windowRect = GetFrameGeometry(); - if (isWindowFullscreen) + if (IsFullscreen()) { parsedResolution = GetClosestResolution(parsedResolution); windowRect.x = 0; diff --git a/SurrealEngine/GameWindow.h b/SurrealEngine/GameWindow.h index a3f2a5af..06ba35cc 100644 --- a/SurrealEngine/GameWindow.h +++ b/SurrealEngine/GameWindow.h @@ -124,6 +124,8 @@ class GameWindow : public Widget int GetPixelWidth(); int GetPixelHeight(); + void ToggleWindowFullscreen(Size newResolution); + std::string GetAvailableResolutions() const; void SetResolution(const std::string& resolutionString); @@ -149,8 +151,6 @@ class GameWindow : public Widget Size ParseResolutionString(const std::string& resolutionString) const; Size GetClosestResolution(Size resolution) const; - bool isWindowFullscreen = false; - GameWindowHost* windowHost = nullptr; std::unique_ptr device; }; diff --git a/Thirdparty/ZWidget/include/zwidget/core/widget.h b/Thirdparty/ZWidget/include/zwidget/core/widget.h index 08e49147..09e23456 100644 --- a/Thirdparty/ZWidget/include/zwidget/core/widget.h +++ b/Thirdparty/ZWidget/include/zwidget/core/widget.h @@ -88,6 +88,7 @@ class Widget : DisplayWindowHost void SetVisible(bool enable) { if (enable) Show(); else Hide(); } void Show(); void ShowFullscreen(); + bool IsFullscreen(); void ShowMaximized(); void ShowMinimized(); void ShowNormal(); diff --git a/Thirdparty/ZWidget/include/zwidget/window/window.h b/Thirdparty/ZWidget/include/zwidget/window/window.h index eeebece0..4aca8d0b 100644 --- a/Thirdparty/ZWidget/include/zwidget/window/window.h +++ b/Thirdparty/ZWidget/include/zwidget/window/window.h @@ -155,6 +155,7 @@ class DisplayWindow virtual void ShowMaximized() = 0; virtual void ShowMinimized() = 0; virtual void ShowNormal() = 0; + virtual bool IsWindowFullscreen() = 0; virtual void Hide() = 0; virtual void Activate() = 0; virtual void ShowCursor(bool enable) = 0; diff --git a/Thirdparty/ZWidget/src/core/widget.cpp b/Thirdparty/ZWidget/src/core/widget.cpp index 09daa84f..4fca86df 100644 --- a/Thirdparty/ZWidget/src/core/widget.cpp +++ b/Thirdparty/ZWidget/src/core/widget.cpp @@ -218,6 +218,16 @@ void Widget::ShowFullscreen() } } +bool Widget::IsFullscreen() +{ + if (Type != WidgetType::Child) + { + return DispWindow->IsWindowFullscreen(); + } + + return false; +} + void Widget::ShowMaximized() { if (Type != WidgetType::Child) diff --git a/Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.cpp b/Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.cpp index c8480309..173d7260 100644 --- a/Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.cpp +++ b/Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.cpp @@ -108,6 +108,7 @@ void SDL2DisplayWindow::ShowFullscreen() { SDL_ShowWindow(Handle.window); SDL_SetWindowFullscreen(Handle.window, SDL_WINDOW_FULLSCREEN_DESKTOP); + isFullscreen = true; } void SDL2DisplayWindow::ShowMaximized() @@ -126,6 +127,12 @@ void SDL2DisplayWindow::ShowNormal() { SDL_ShowWindow(Handle.window); SDL_SetWindowFullscreen(Handle.window, 0); + isFullscreen = false; +} + +bool SDL2DisplayWindow::IsWindowFullscreen() +{ + return isFullscreen; } void SDL2DisplayWindow::Hide() diff --git a/Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.h b/Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.h index 4d587c7f..e6e015ad 100644 --- a/Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.h +++ b/Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.h @@ -20,6 +20,7 @@ class SDL2DisplayWindow : public DisplayWindow void ShowMaximized() override; void ShowMinimized() override; void ShowNormal() override; + bool IsWindowFullscreen() override; void Hide() override; void Activate() override; void ShowCursor(bool enable) override; @@ -96,4 +97,6 @@ class SDL2DisplayWindow : public DisplayWindow static bool ExitRunLoop; static Uint32 PaintEventNumber; static std::unordered_map WindowList; + + bool isFullscreen = false; }; diff --git a/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.cpp b/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.cpp index ab7f6c9e..6a436f99 100644 --- a/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.cpp +++ b/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.cpp @@ -147,7 +147,16 @@ void WaylandDisplayWindow::Show() void WaylandDisplayWindow::ShowFullscreen() { if (m_XDGToplevel) + { m_XDGToplevel.set_fullscreen(backend->m_waylandOutput); + isFullscreen = true; + } + +} + +bool WaylandDisplayWindow::IsWindowFullscreen() +{ + return isFullscreen; } void WaylandDisplayWindow::ShowMaximized() @@ -165,7 +174,10 @@ void WaylandDisplayWindow::ShowMinimized() void WaylandDisplayWindow::ShowNormal() { if (m_XDGToplevel) + { m_XDGToplevel.unset_fullscreen(); + isFullscreen = true; + } } void WaylandDisplayWindow::Hide() diff --git a/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.h b/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.h index 6c5fc50f..6807601a 100644 --- a/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.h +++ b/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.h @@ -96,6 +96,7 @@ class WaylandDisplayWindow : public DisplayWindow void ShowMaximized() override; void ShowMinimized() override; void ShowNormal() override; + bool IsWindowFullscreen() override; void Hide() override; void Activate() override; void ShowCursor(bool enable) override; @@ -182,6 +183,8 @@ class WaylandDisplayWindow : public DisplayWindow std::shared_ptr shared_mem; + bool isFullscreen; + // Helper functions void CreateBuffers(int32_t width, int32_t height); std::string GetWaylandWindowID(); diff --git a/Thirdparty/ZWidget/src/window/win32/win32_display_window.cpp b/Thirdparty/ZWidget/src/window/win32/win32_display_window.cpp index e3b8cf7a..8c5d423e 100644 --- a/Thirdparty/ZWidget/src/window/win32/win32_display_window.cpp +++ b/Thirdparty/ZWidget/src/window/win32/win32_display_window.cpp @@ -148,6 +148,12 @@ void Win32DisplayWindow::ShowMinimized() void Win32DisplayWindow::ShowNormal() { ShowWindow(WindowHandle.hwnd, SW_NORMAL); + Fullscreen = false; +} + +bool Win32DisplayWindow::IsWindowFullscreen() +{ + return Fullscreen; } void Win32DisplayWindow::Hide() diff --git a/Thirdparty/ZWidget/src/window/win32/win32_display_window.h b/Thirdparty/ZWidget/src/window/win32/win32_display_window.h index b3a44b09..60093756 100644 --- a/Thirdparty/ZWidget/src/window/win32/win32_display_window.h +++ b/Thirdparty/ZWidget/src/window/win32/win32_display_window.h @@ -21,6 +21,7 @@ class Win32DisplayWindow : public DisplayWindow void ShowMaximized() override; void ShowMinimized() override; void ShowNormal() override; + bool IsWindowFullscreen() override; void Hide() override; void Activate() override; void ShowCursor(bool enable) override; diff --git a/Thirdparty/ZWidget/src/window/x11/x11_display_window.cpp b/Thirdparty/ZWidget/src/window/x11/x11_display_window.cpp index 168c08d1..59de5780 100644 --- a/Thirdparty/ZWidget/src/window/x11/x11_display_window.cpp +++ b/Thirdparty/ZWidget/src/window/x11/x11_display_window.cpp @@ -230,9 +230,15 @@ void X11DisplayWindow::ShowFullscreen() { Atom state = GetAtom("_NET_WM_STATE_FULLSCREEN"); XChangeProperty(display, window, GetAtom("_NET_WM_STATE"), XA_ATOM, 32, PropModeReplace, (unsigned char *)&state, 1); + isFullscreen = true; } } +bool X11DisplayWindow::IsWindowFullscreen() +{ + return isFullscreen; +} + void X11DisplayWindow::ShowMaximized() { Show(); @@ -251,6 +257,7 @@ void X11DisplayWindow::ShowMinimized() void X11DisplayWindow::ShowNormal() { Show(); + isFullscreen = false; } void X11DisplayWindow::Hide() diff --git a/Thirdparty/ZWidget/src/window/x11/x11_display_window.h b/Thirdparty/ZWidget/src/window/x11/x11_display_window.h index c66424d3..9174e6a2 100644 --- a/Thirdparty/ZWidget/src/window/x11/x11_display_window.h +++ b/Thirdparty/ZWidget/src/window/x11/x11_display_window.h @@ -23,6 +23,7 @@ class X11DisplayWindow : public DisplayWindow void ShowMaximized() override; void ShowMinimized() override; void ShowNormal() override; + bool IsWindowFullscreen() override; void Hide() override; void Activate() override; void ShowCursor(bool enable) override; @@ -128,5 +129,7 @@ class X11DisplayWindow : public DisplayWindow bool needsUpdate = false; + bool isFullscreen = false; + friend class X11DisplayBackend; };