diff --git a/Source/Engine/Platform/Linux/LinuxWindow.cpp b/Source/Engine/Platform/Linux/LinuxWindow.cpp index 9004ed84c..fa0770cd1 100644 --- a/Source/Engine/Platform/Linux/LinuxWindow.cpp +++ b/Source/Engine/Platform/Linux/LinuxWindow.cpp @@ -42,6 +42,15 @@ extern Array KeyCodeMap; extern X11::Cursor Cursors[(int32)CursorType::MAX]; extern Window* MouseTrackingWindow; +typedef struct XDisplayHints +{ + unsigned long flags; + unsigned long functions; + unsigned long decorations; + long inputMode; + unsigned long status; +} XDisplayHints; + static constexpr uint32 MouseDoubleClickTime = 500; static constexpr uint32 MaxDoubleClickDistanceSquared = 10; static X11::Time MouseLastButtonPressTime = 0; @@ -332,6 +341,33 @@ void LinuxWindow::Maximize() Maximize(true); } +void LinuxWindow::SetBorderless(bool isBorderless, bool maximized) +{ + LINUX_WINDOW_PROLOG; + if (!display) + return; + XDisplayHints hints; + hints.flags = 2; + hints.decorations = isBorderless ? 0 : 1; + const X11::Atom property = X11::XInternAtom(display, "_MOTIF_WM_HINTS", true); + if (property != 0) { + X11::XChangeProperty(display, window, property, property, 32, PropModeReplace, (unsigned char *)&hints, 5); + } +} + +void LinuxWindow::SetIsFullscreen(bool isFullscreen) +{ + if (isFullscreen) + { + SetBorderless(true); + Maximize(false); + } else + { + SetBorderless(false); + Restore(); + } +} + void LinuxWindow::Restore() { if (IsMaximized()) diff --git a/Source/Engine/Platform/Linux/LinuxWindow.h b/Source/Engine/Platform/Linux/LinuxWindow.h index 52c039f6f..454fc26c1 100644 --- a/Source/Engine/Platform/Linux/LinuxWindow.h +++ b/Source/Engine/Platform/Linux/LinuxWindow.h @@ -71,14 +71,16 @@ public: void Hide() override; void Minimize() override; void Maximize() override; - void Restore() override; + void SetBorderless(bool isBorderless, bool maximized = false) override; + void Restore() override; bool IsClosed() const override; bool IsForegroundWindow() const override; void BringToFront(bool force = false) override; void SetClientBounds(const Rectangle& clientArea) override; void SetPosition(const Float2& position) override; void SetClientPosition(const Float2& position) override; - Float2 GetPosition() const override; + void SetIsFullscreen(bool isFullscreen) override; + Float2 GetPosition() const override; Float2 GetSize() const override; Float2 GetClientSize() const override; Float2 ScreenToClient(const Float2& screenPos) const override;