Browse Source

LibGUI+WindowServer: Add Window::set_always_on_top()

demostanis 2 years ago
parent
commit
63a18aa89e

+ 7 - 0
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);
+}
+
 }

+ 2 - 0
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&);

+ 9 - 0
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.

+ 1 - 0
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);

+ 2 - 0
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) => ()
 }