mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:37:35 +00:00
WindowServer+LibGUI: Plumb mouse/enter/leave events to applet windows
Since applet windows live in the applet area window, the AppletManager has to keep track of which applet is hovered and send the appropriate enter/leave events to the applet windows. This makes applet tooltips work again. :^)
This commit is contained in:
parent
9bbc1c9c93
commit
0cd60a28ba
9 changed files with 44 additions and 13 deletions
|
@ -599,7 +599,7 @@ Gfx::IntRect Widget::window_relative_rect() const
|
||||||
Gfx::IntRect Widget::screen_relative_rect() const
|
Gfx::IntRect Widget::screen_relative_rect() const
|
||||||
{
|
{
|
||||||
auto window_position = window()->window_type() == WindowType::MenuApplet
|
auto window_position = window()->window_type() == WindowType::MenuApplet
|
||||||
? window()->rect_in_menubar().location()
|
? window()->applet_rect_on_screen().location()
|
||||||
: window()->rect().location();
|
: window()->rect().location();
|
||||||
return window_relative_rect().translated(window_position);
|
return window_relative_rect().translated(window_position);
|
||||||
}
|
}
|
||||||
|
|
|
@ -235,10 +235,10 @@ String Window::title() const
|
||||||
return WindowServerConnection::the().send_sync<Messages::WindowServer::GetWindowTitle>(m_window_id)->title();
|
return WindowServerConnection::the().send_sync<Messages::WindowServer::GetWindowTitle>(m_window_id)->title();
|
||||||
}
|
}
|
||||||
|
|
||||||
Gfx::IntRect Window::rect_in_menubar() const
|
Gfx::IntRect Window::applet_rect_on_screen() const
|
||||||
{
|
{
|
||||||
VERIFY(m_window_type == WindowType::MenuApplet);
|
VERIFY(m_window_type == WindowType::MenuApplet);
|
||||||
return WindowServerConnection::the().send_sync<Messages::WindowServer::GetWindowRectInMenubar>(m_window_id)->rect();
|
return WindowServerConnection::the().send_sync<Messages::WindowServer::GetAppletRectOnScreen>(m_window_id)->rect();
|
||||||
}
|
}
|
||||||
|
|
||||||
Gfx::IntRect Window::rect() const
|
Gfx::IntRect Window::rect() const
|
||||||
|
|
|
@ -101,7 +101,7 @@ public:
|
||||||
int height() const { return rect().height(); }
|
int height() const { return rect().height(); }
|
||||||
|
|
||||||
Gfx::IntRect rect() const;
|
Gfx::IntRect rect() const;
|
||||||
Gfx::IntRect rect_in_menubar() const;
|
Gfx::IntRect applet_rect_on_screen() const;
|
||||||
Gfx::IntSize size() const { return rect().size(); }
|
Gfx::IntSize size() const { return rect().size(); }
|
||||||
void set_rect(const Gfx::IntRect&);
|
void set_rect(const Gfx::IntRect&);
|
||||||
void set_rect(int x, int y, int width, int height) { set_rect({ x, y, width, height }); }
|
void set_rect(int x, int y, int width, int height) { set_rect({ x, y, width, height }); }
|
||||||
|
|
|
@ -189,7 +189,11 @@ private:
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
void reposition_slider_window() { m_slider_window->set_rect(window()->rect_in_menubar().x() - 20, 19, 50, 100); }
|
void reposition_slider_window()
|
||||||
|
{
|
||||||
|
auto applet_rect = window()->applet_rect_on_screen();
|
||||||
|
m_slider_window->set_rect(applet_rect.x() - 20, applet_rect.y() - 106, 50, 100);
|
||||||
|
}
|
||||||
|
|
||||||
struct VolumeBitmapPair {
|
struct VolumeBitmapPair {
|
||||||
int volume_threshold { 0 };
|
int volume_threshold { 0 };
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include "AppletManager.h"
|
#include "AppletManager.h"
|
||||||
#include <AK/QuickSort.h>
|
#include <AK/QuickSort.h>
|
||||||
|
#include <LibCore/EventLoop.h>
|
||||||
#include <LibGfx/Painter.h>
|
#include <LibGfx/Painter.h>
|
||||||
#include <WindowServer/MenuManager.h>
|
#include <WindowServer/MenuManager.h>
|
||||||
|
|
||||||
|
@ -60,21 +61,40 @@ void AppletManager::set_position(const Gfx::IntPoint& position)
|
||||||
m_window->set_visible(true);
|
m_window->set_visible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AppletManager::set_hovered_applet(Window* applet)
|
||||||
|
{
|
||||||
|
if (m_hovered_applet == applet)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_hovered_applet)
|
||||||
|
Core::EventLoop::current().post_event(*m_hovered_applet, make<Event>(Event::WindowLeft));
|
||||||
|
|
||||||
|
m_hovered_applet = applet;
|
||||||
|
|
||||||
|
if (m_hovered_applet)
|
||||||
|
Core::EventLoop::current().post_event(*m_hovered_applet, make<Event>(Event::WindowEntered));
|
||||||
|
}
|
||||||
|
|
||||||
void AppletManager::event(Core::Event& event)
|
void AppletManager::event(Core::Event& event)
|
||||||
{
|
{
|
||||||
|
if (event.type() == Event::WindowLeft && m_hovered_applet) {
|
||||||
|
set_hovered_applet(nullptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!is<MouseEvent>(event))
|
if (!is<MouseEvent>(event))
|
||||||
return;
|
return;
|
||||||
auto& mouse_event = static_cast<MouseEvent&>(event);
|
auto& mouse_event = static_cast<MouseEvent&>(event);
|
||||||
|
|
||||||
dbgln("mouse_event: {}", mouse_event.position());
|
|
||||||
|
|
||||||
for (auto& applet : m_applets) {
|
for (auto& applet : m_applets) {
|
||||||
if (!applet)
|
if (!applet)
|
||||||
continue;
|
continue;
|
||||||
if (!applet->rect_in_applet_area().contains(mouse_event.position()))
|
if (!applet->rect_in_applet_area().contains(mouse_event.position()))
|
||||||
continue;
|
continue;
|
||||||
auto local_event = mouse_event.translated(-applet->rect_in_applet_area().location());
|
auto local_event = mouse_event.translated(-applet->rect_in_applet_area().location());
|
||||||
applet->dispatch_event(local_event);
|
set_hovered_applet(applet);
|
||||||
|
Core::EventLoop::current().post_event(*applet, make<MouseEvent>(local_event));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,9 +54,11 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void draw_applet(const Window& applet);
|
void draw_applet(const Window& applet);
|
||||||
|
void set_hovered_applet(Window*);
|
||||||
|
|
||||||
Vector<WeakPtr<Window>> m_applets;
|
Vector<WeakPtr<Window>> m_applets;
|
||||||
RefPtr<Window> m_window;
|
RefPtr<Window> m_window;
|
||||||
|
WeakPtr<Window> m_hovered_applet;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -475,15 +475,20 @@ OwnPtr<Messages::WindowServer::GetWindowMinimumSizeResponse> ClientConnection::h
|
||||||
return make<Messages::WindowServer::GetWindowMinimumSizeResponse>(it->value->minimum_size());
|
return make<Messages::WindowServer::GetWindowMinimumSizeResponse>(it->value->minimum_size());
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnPtr<Messages::WindowServer::GetWindowRectInMenubarResponse> ClientConnection::handle(const Messages::WindowServer::GetWindowRectInMenubar& message)
|
OwnPtr<Messages::WindowServer::GetAppletRectOnScreenResponse> ClientConnection::handle(const Messages::WindowServer::GetAppletRectOnScreen& message)
|
||||||
{
|
{
|
||||||
int window_id = message.window_id();
|
int window_id = message.window_id();
|
||||||
auto it = m_windows.find(window_id);
|
auto it = m_windows.find(window_id);
|
||||||
if (it == m_windows.end()) {
|
if (it == m_windows.end()) {
|
||||||
did_misbehave("GetWindowRectInMenubar: Bad window ID");
|
did_misbehave("GetAppletRectOnScreen: Bad window ID");
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
return make<Messages::WindowServer::GetWindowRectInMenubarResponse>(it->value->rect_in_applet_area());
|
|
||||||
|
Gfx::IntRect applet_area_rect;
|
||||||
|
if (auto* applet_area_window = AppletManager::the().window())
|
||||||
|
applet_area_rect = applet_area_window->rect();
|
||||||
|
|
||||||
|
return make<Messages::WindowServer::GetAppletRectOnScreenResponse>(it->value->rect_in_applet_area().translated(applet_area_rect.location()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Window* ClientConnection::window_from_id(i32 window_id)
|
Window* ClientConnection::window_from_id(i32 window_id)
|
||||||
|
|
|
@ -126,7 +126,7 @@ private:
|
||||||
virtual OwnPtr<Messages::WindowServer::GetWindowRectResponse> handle(const Messages::WindowServer::GetWindowRect&) override;
|
virtual OwnPtr<Messages::WindowServer::GetWindowRectResponse> handle(const Messages::WindowServer::GetWindowRect&) override;
|
||||||
virtual OwnPtr<Messages::WindowServer::SetWindowMinimumSizeResponse> handle(const Messages::WindowServer::SetWindowMinimumSize&) override;
|
virtual OwnPtr<Messages::WindowServer::SetWindowMinimumSizeResponse> handle(const Messages::WindowServer::SetWindowMinimumSize&) override;
|
||||||
virtual OwnPtr<Messages::WindowServer::GetWindowMinimumSizeResponse> handle(const Messages::WindowServer::GetWindowMinimumSize&) override;
|
virtual OwnPtr<Messages::WindowServer::GetWindowMinimumSizeResponse> handle(const Messages::WindowServer::GetWindowMinimumSize&) override;
|
||||||
virtual OwnPtr<Messages::WindowServer::GetWindowRectInMenubarResponse> handle(const Messages::WindowServer::GetWindowRectInMenubar&) override;
|
virtual OwnPtr<Messages::WindowServer::GetAppletRectOnScreenResponse> handle(const Messages::WindowServer::GetAppletRectOnScreen&) override;
|
||||||
virtual void handle(const Messages::WindowServer::InvalidateRect&) override;
|
virtual void handle(const Messages::WindowServer::InvalidateRect&) override;
|
||||||
virtual void handle(const Messages::WindowServer::DidFinishPainting&) override;
|
virtual void handle(const Messages::WindowServer::DidFinishPainting&) override;
|
||||||
virtual OwnPtr<Messages::WindowServer::SetGlobalCursorTrackingResponse> handle(const Messages::WindowServer::SetGlobalCursorTracking&) override;
|
virtual OwnPtr<Messages::WindowServer::SetGlobalCursorTrackingResponse> handle(const Messages::WindowServer::SetGlobalCursorTracking&) override;
|
||||||
|
|
|
@ -62,7 +62,7 @@ endpoint WindowServer = 2
|
||||||
SetWindowMinimumSize(i32 window_id, Gfx::IntSize size) => ()
|
SetWindowMinimumSize(i32 window_id, Gfx::IntSize size) => ()
|
||||||
GetWindowMinimumSize(i32 window_id) => (Gfx::IntSize size)
|
GetWindowMinimumSize(i32 window_id) => (Gfx::IntSize size)
|
||||||
|
|
||||||
GetWindowRectInMenubar(i32 window_id) => (Gfx::IntRect rect)
|
GetAppletRectOnScreen(i32 window_id) => (Gfx::IntRect rect)
|
||||||
|
|
||||||
StartWindowResize(i32 window_id) =|
|
StartWindowResize(i32 window_id) =|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue