diff --git a/Libraries/LibGUI/Window.cpp b/Libraries/LibGUI/Window.cpp index 30d4473de6..f590184ff2 100644 --- a/Libraries/LibGUI/Window.cpp +++ b/Libraries/LibGUI/Window.cpp @@ -177,6 +177,12 @@ String Window::title() const return WindowServerConnection::the().send_sync(m_window_id)->title(); } +Gfx::IntRect Window::rect_in_menubar() const +{ + ASSERT(m_window_type == WindowType::MenuApplet); + return WindowServerConnection::the().send_sync(m_window_id)->rect(); +} + Gfx::IntRect Window::rect() const { if (!is_visible()) diff --git a/Libraries/LibGUI/Window.h b/Libraries/LibGUI/Window.h index b6e8688978..a13e51b651 100644 --- a/Libraries/LibGUI/Window.h +++ b/Libraries/LibGUI/Window.h @@ -107,6 +107,7 @@ public: int height() const { return rect().height(); } Gfx::IntRect rect() const; + Gfx::IntRect rect_in_menubar() const; Gfx::IntSize size() const { return rect().size(); } void set_rect(const Gfx::IntRect&); void set_rect(int x, int y, int width, int height) { set_rect({ x, y, width, height }); } diff --git a/Services/WindowServer/ClientConnection.cpp b/Services/WindowServer/ClientConnection.cpp index 9bbc8d6b7c..ee7ffbd76a 100644 --- a/Services/WindowServer/ClientConnection.cpp +++ b/Services/WindowServer/ClientConnection.cpp @@ -424,6 +424,17 @@ OwnPtr ClientConnection::handle(c return make(it->value->rect()); } +OwnPtr ClientConnection::handle(const Messages::WindowServer::GetWindowRectInMenubar& message) +{ + int window_id = message.window_id(); + auto it = m_windows.find(window_id); + if (it == m_windows.end()) { + did_misbehave("GetWindowRectInMenubar: Bad window ID"); + return nullptr; + } + return make(it->value->rect_in_menubar()); +} + Window* ClientConnection::window_from_id(i32 window_id) { auto it = m_windows.find(window_id); diff --git a/Services/WindowServer/ClientConnection.h b/Services/WindowServer/ClientConnection.h index 7c5ff5aeca..d5b261329b 100644 --- a/Services/WindowServer/ClientConnection.h +++ b/Services/WindowServer/ClientConnection.h @@ -109,6 +109,7 @@ private: virtual OwnPtr handle(const Messages::WindowServer::IsMaximized&) override; virtual OwnPtr handle(const Messages::WindowServer::SetWindowRect&) override; virtual OwnPtr handle(const Messages::WindowServer::GetWindowRect&) override; + virtual OwnPtr handle(const Messages::WindowServer::GetWindowRectInMenubar&) override; virtual void handle(const Messages::WindowServer::InvalidateRect&) override; virtual void handle(const Messages::WindowServer::DidFinishPainting&) override; virtual OwnPtr handle(const Messages::WindowServer::SetGlobalCursorTracking&) override; diff --git a/Services/WindowServer/WindowServer.ipc b/Services/WindowServer/WindowServer.ipc index a0b34bf9ee..b06ac6de3c 100644 --- a/Services/WindowServer/WindowServer.ipc +++ b/Services/WindowServer/WindowServer.ipc @@ -56,6 +56,8 @@ endpoint WindowServer = 2 SetWindowRect(i32 window_id, Gfx::IntRect rect) => (Gfx::IntRect rect) GetWindowRect(i32 window_id) => (Gfx::IntRect rect) + GetWindowRectInMenubar(i32 window_id) => (Gfx::IntRect rect) + IsMaximized(i32 window_id) => (bool maximized) InvalidateRect(i32 window_id, Vector rects, bool ignore_occlusion) =|