From 63a18aa89e24b3ba4e598f99a6422ccefb4d6a08 Mon Sep 17 00:00:00 2001 From: demostanis Date: Sun, 9 Oct 2022 10:57:44 +0200 Subject: [PATCH] LibGUI+WindowServer: Add Window::set_always_on_top() --- Userland/Libraries/LibGUI/Window.cpp | 7 +++++++ Userland/Libraries/LibGUI/Window.h | 2 ++ Userland/Services/WindowServer/ConnectionFromClient.cpp | 9 +++++++++ Userland/Services/WindowServer/ConnectionFromClient.h | 1 + Userland/Services/WindowServer/WindowServer.ipc | 2 ++ 5 files changed, 21 insertions(+) diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp index a7f642b1ba..84ac0f610b 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 4a45d3d299..47834a8cae 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 ec43090927..43e2e8bd97 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 7f431dbbd1..211da366ed 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 867586b897..111a4ab83c 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) => () }