Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Widget/Window: Add fullscreen mode checks #153

Merged
merged 4 commits into from
Dec 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion SurrealEngine/GameWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -248,7 +277,7 @@ void GameWindow::SetResolution(const std::string& resolutionString)

Rect windowRect = GetFrameGeometry();

if (isWindowFullscreen)
if (IsFullscreen())
{
parsedResolution = GetClosestResolution(parsedResolution);
windowRect.x = 0;
Expand Down
4 changes: 2 additions & 2 deletions SurrealEngine/GameWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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<RenderDevice> device;
};
1 change: 1 addition & 0 deletions Thirdparty/ZWidget/include/zwidget/core/widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
1 change: 1 addition & 0 deletions Thirdparty/ZWidget/include/zwidget/window/window.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
10 changes: 10 additions & 0 deletions Thirdparty/ZWidget/src/core/widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
7 changes: 7 additions & 0 deletions Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ void SDL2DisplayWindow::ShowFullscreen()
{
SDL_ShowWindow(Handle.window);
SDL_SetWindowFullscreen(Handle.window, SDL_WINDOW_FULLSCREEN_DESKTOP);
isFullscreen = true;
}

void SDL2DisplayWindow::ShowMaximized()
Expand All @@ -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()
Expand Down
3 changes: 3 additions & 0 deletions Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -96,4 +97,6 @@ class SDL2DisplayWindow : public DisplayWindow
static bool ExitRunLoop;
static Uint32 PaintEventNumber;
static std::unordered_map<int, SDL2DisplayWindow*> WindowList;

bool isFullscreen = false;
};
12 changes: 12 additions & 0 deletions Thirdparty/ZWidget/src/window/wayland/wayland_display_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -165,7 +174,10 @@ void WaylandDisplayWindow::ShowMinimized()
void WaylandDisplayWindow::ShowNormal()
{
if (m_XDGToplevel)
{
m_XDGToplevel.unset_fullscreen();
isFullscreen = true;
}
}

void WaylandDisplayWindow::Hide()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -182,6 +183,8 @@ class WaylandDisplayWindow : public DisplayWindow

std::shared_ptr<SharedMemHelper> shared_mem;

bool isFullscreen;

// Helper functions
void CreateBuffers(int32_t width, int32_t height);
std::string GetWaylandWindowID();
Expand Down
6 changes: 6 additions & 0 deletions Thirdparty/ZWidget/src/window/win32/win32_display_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
1 change: 1 addition & 0 deletions Thirdparty/ZWidget/src/window/win32/win32_display_window.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions Thirdparty/ZWidget/src/window/x11/x11_display_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -251,6 +257,7 @@ void X11DisplayWindow::ShowMinimized()
void X11DisplayWindow::ShowNormal()
{
Show();
isFullscreen = false;
}

void X11DisplayWindow::Hide()
Expand Down
3 changes: 3 additions & 0 deletions Thirdparty/ZWidget/src/window/x11/x11_display_window.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -128,5 +129,7 @@ class X11DisplayWindow : public DisplayWindow

bool needsUpdate = false;

bool isFullscreen = false;

friend class X11DisplayBackend;
};
Loading