summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthankyouverycool <66646555+thankyouverycool@users.noreply.github.com>2020-07-24 16:16:30 -0400
committerAndreas Kling <kling@serenityos.org>2020-07-26 11:32:12 +0200
commitc50f258b7a9cb56ab6de3c06c95b6d67212c9daf (patch)
tree34c9c8ab7c7c9ac8d6569c018cafdfd2dd58c3ec
parent030f4150b83e04cf84a228f6f816b9481ecabc10 (diff)
downloadserenity-c50f258b7a9cb56ab6de3c06c95b6d67212c9daf.zip
LibGUI+WindowServer: Allow applets to retrieve their location
MenuApplet windows can now call rect_in_menubar to return their location in the MenuBar.
-rw-r--r--Libraries/LibGUI/Window.cpp6
-rw-r--r--Libraries/LibGUI/Window.h1
-rw-r--r--Services/WindowServer/ClientConnection.cpp11
-rw-r--r--Services/WindowServer/ClientConnection.h1
-rw-r--r--Services/WindowServer/WindowServer.ipc2
5 files changed, 21 insertions, 0 deletions
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<Messages::WindowServer::GetWindowTitle>(m_window_id)->title();
}
+Gfx::IntRect Window::rect_in_menubar() const
+{
+ ASSERT(m_window_type == WindowType::MenuApplet);
+ return WindowServerConnection::the().send_sync<Messages::WindowServer::GetWindowRectInMenubar>(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<Messages::WindowServer::GetWindowRectResponse> ClientConnection::handle(c
return make<Messages::WindowServer::GetWindowRectResponse>(it->value->rect());
}
+OwnPtr<Messages::WindowServer::GetWindowRectInMenubarResponse> 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<Messages::WindowServer::GetWindowRectInMenubarResponse>(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<Messages::WindowServer::IsMaximizedResponse> handle(const Messages::WindowServer::IsMaximized&) override;
virtual OwnPtr<Messages::WindowServer::SetWindowRectResponse> handle(const Messages::WindowServer::SetWindowRect&) override;
virtual OwnPtr<Messages::WindowServer::GetWindowRectResponse> handle(const Messages::WindowServer::GetWindowRect&) override;
+ virtual OwnPtr<Messages::WindowServer::GetWindowRectInMenubarResponse> handle(const Messages::WindowServer::GetWindowRectInMenubar&) override;
virtual void handle(const Messages::WindowServer::InvalidateRect&) override;
virtual void handle(const Messages::WindowServer::DidFinishPainting&) override;
virtual OwnPtr<Messages::WindowServer::SetGlobalCursorTrackingResponse> 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<Gfx::IntRect> rects, bool ignore_occlusion) =|