From d847304cb9aaf099de0ba0e2dc133d7ad1b3c63b Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 1 May 2020 23:26:32 +0200 Subject: [PATCH] WindowServer+LibGUI: Add "frameless" window flag This allows you to create windows with no title bar or window frame. --- Libraries/LibGUI/Window.cpp | 1 + Libraries/LibGUI/Window.h | 4 ++++ Servers/WindowServer/ClientConnection.cpp | 2 ++ Servers/WindowServer/Window.h | 4 ++++ Servers/WindowServer/WindowFrame.cpp | 6 ++++++ Servers/WindowServer/WindowServer.ipc | 1 + 6 files changed, 18 insertions(+) diff --git a/Libraries/LibGUI/Window.cpp b/Libraries/LibGUI/Window.cpp index ca659bc073..480debb2e8 100644 --- a/Libraries/LibGUI/Window.cpp +++ b/Libraries/LibGUI/Window.cpp @@ -100,6 +100,7 @@ void Window::show() m_minimizable, m_resizable, m_fullscreen, + m_frameless, m_opacity_when_windowless, m_base_size, m_size_increment, diff --git a/Libraries/LibGUI/Window.h b/Libraries/LibGUI/Window.h index c900e58425..9bb118c26a 100644 --- a/Libraries/LibGUI/Window.h +++ b/Libraries/LibGUI/Window.h @@ -62,6 +62,9 @@ public: bool is_fullscreen() const { return m_fullscreen; } void set_fullscreen(bool); + bool is_frameless() const { return m_frameless; } + void set_frameless(bool frameless) { m_frameless = frameless; } + bool is_resizable() const { return m_resizable; } void set_resizable(bool resizable) { m_resizable = resizable; } @@ -219,6 +222,7 @@ private: bool m_resizable { true }; bool m_minimizable { true }; bool m_fullscreen { false }; + bool m_frameless { false }; bool m_layout_pending { false }; bool m_visible_for_timer_purposes { true }; bool m_visible { false }; diff --git a/Servers/WindowServer/ClientConnection.cpp b/Servers/WindowServer/ClientConnection.cpp index 0be46dad83..32b2ba3100 100644 --- a/Servers/WindowServer/ClientConnection.cpp +++ b/Servers/WindowServer/ClientConnection.cpp @@ -475,6 +475,8 @@ OwnPtr ClientConnection::handle(co window->set_parent_window(*parent_window); } + window->set_frameless(message.frameless()); + window->set_has_alpha_channel(message.has_alpha_channel()); window->set_title(message.title()); if (!message.fullscreen()) { diff --git a/Servers/WindowServer/Window.h b/Servers/WindowServer/Window.h index b6eb46eb93..54a884b066 100644 --- a/Servers/WindowServer/Window.h +++ b/Servers/WindowServer/Window.h @@ -229,6 +229,9 @@ public: Vector>& child_windows() { return m_child_windows; } const Vector>& child_windows() const { return m_child_windows; } + void set_frameless(bool frameless) { m_frameless = frameless; } + bool is_frameless() const { return m_frameless; } + private: void handle_mouse_event(const MouseEvent&); void update_menu_item_text(PopupMenuItem item); @@ -259,6 +262,7 @@ private: WindowTileType m_tiled { WindowTileType::None }; Gfx::Rect m_untiled_rect; bool m_occluded { false }; + bool m_frameless { false }; RefPtr m_backing_store; RefPtr m_last_backing_store; int m_window_id { -1 }; diff --git a/Servers/WindowServer/WindowFrame.cpp b/Servers/WindowServer/WindowFrame.cpp index 1106622e24..2d6b8cad73 100644 --- a/Servers/WindowServer/WindowFrame.cpp +++ b/Servers/WindowServer/WindowFrame.cpp @@ -257,6 +257,9 @@ void WindowFrame::paint_normal_frame(Gfx::Painter& painter) void WindowFrame::paint(Gfx::Painter& painter) { + if (m_window.is_frameless()) + return; + Gfx::PainterStateSaver saver(painter); painter.translate(rect().location()); @@ -274,6 +277,9 @@ void WindowFrame::paint(Gfx::Painter& painter) static Gfx::Rect frame_rect_for_window(Window& window, const Gfx::Rect& rect) { + if (window.is_frameless()) + return rect; + auto type = window.type(); switch (type) { diff --git a/Servers/WindowServer/WindowServer.ipc b/Servers/WindowServer/WindowServer.ipc index 4ae930326d..d1be40824a 100644 --- a/Servers/WindowServer/WindowServer.ipc +++ b/Servers/WindowServer/WindowServer.ipc @@ -36,6 +36,7 @@ endpoint WindowServer = 2 bool minimizable, bool resizable, bool fullscreen, + bool frameless, float opacity, Gfx::Size base_size, Gfx::Size size_increment,