diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp index a7f642b1bae..84ac0f610bb 100644 --- a/Userland/Libraries/LibGUI/Window.cpp +++ b/Userland/Libraries/LibGUI/Window.cpp @@ -1281,4 +1281,11 @@ void Window::flush_pending_paints_immediately() handle_multi_paint_event(paint_event); } +void Window::set_always_on_top(bool always_on_top) +{ + if (!m_window_id) + return; + ConnectionToWindowServer::the().set_always_on_top(m_window_id, always_on_top); +} + } diff --git a/Userland/Libraries/LibGUI/Window.h b/Userland/Libraries/LibGUI/Window.h index 4a45d3d299b..47834a8cae8 100644 --- a/Userland/Libraries/LibGUI/Window.h +++ b/Userland/Libraries/LibGUI/Window.h @@ -232,6 +232,8 @@ public: void set_blocks_emoji_input(bool b) { m_blocks_emoji_input = b; } bool blocks_emoji_input() const { return m_blocks_emoji_input; } + void set_always_on_top(bool always_on_top = true); + protected: Window(Core::Object* parent = nullptr); virtual void wm_event(WMEvent&); diff --git a/Userland/Services/WindowServer/ConnectionFromClient.cpp b/Userland/Services/WindowServer/ConnectionFromClient.cpp index ec430909279..43e2e8bd97a 100644 --- a/Userland/Services/WindowServer/ConnectionFromClient.cpp +++ b/Userland/Services/WindowServer/ConnectionFromClient.cpp @@ -1341,6 +1341,15 @@ void ConnectionFromClient::remove_window_stealing(i32 window_id) window->remove_all_stealing(); } +void ConnectionFromClient::set_always_on_top(i32 window_id, bool always_on_top) +{ + auto window = window_from_id(window_id); + if (!window) + did_misbehave("SetAlwaysOnTop: Bad window ID"); + + window->set_always_on_top(always_on_top); +} + void ConnectionFromClient::notify_about_theme_change() { // Recalculate minimum size for each window, using the new theme metrics. diff --git a/Userland/Services/WindowServer/ConnectionFromClient.h b/Userland/Services/WindowServer/ConnectionFromClient.h index 7f431dbbd1b..211da366ed7 100644 --- a/Userland/Services/WindowServer/ConnectionFromClient.h +++ b/Userland/Services/WindowServer/ConnectionFromClient.h @@ -185,6 +185,7 @@ private: virtual void add_window_stealing_for_client(i32, i32) override; virtual void remove_window_stealing_for_client(i32, i32) override; virtual void remove_window_stealing(i32) override; + virtual void set_always_on_top(i32, bool) override; virtual Messages::WindowServer::GetColorUnderCursorResponse get_color_under_cursor() override; Window* window_from_id(i32 window_id); diff --git a/Userland/Services/WindowServer/WindowServer.ipc b/Userland/Services/WindowServer/WindowServer.ipc index 867586b8978..111a4ab83c3 100644 --- a/Userland/Services/WindowServer/WindowServer.ipc +++ b/Userland/Services/WindowServer/WindowServer.ipc @@ -182,4 +182,6 @@ endpoint WindowServer add_window_stealing_for_client(i32 client_id, i32 window_id) => () remove_window_stealing_for_client(i32 client_id, i32 window_id) => () remove_window_stealing(i32 window_id) => () + + set_always_on_top(i32 window_id, bool always_on_top) => () }