mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:27: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
|
@ -27,6 +27,7 @@
|
|||
|
||||
#include "AppletManager.h"
|
||||
#include <AK/QuickSort.h>
|
||||
#include <LibCore/EventLoop.h>
|
||||
#include <LibGfx/Painter.h>
|
||||
#include <WindowServer/MenuManager.h>
|
||||
|
||||
|
@ -60,21 +61,40 @@ void AppletManager::set_position(const Gfx::IntPoint& position)
|
|||
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)
|
||||
{
|
||||
if (event.type() == Event::WindowLeft && m_hovered_applet) {
|
||||
set_hovered_applet(nullptr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!is<MouseEvent>(event))
|
||||
return;
|
||||
auto& mouse_event = static_cast<MouseEvent&>(event);
|
||||
|
||||
dbgln("mouse_event: {}", mouse_event.position());
|
||||
|
||||
for (auto& applet : m_applets) {
|
||||
if (!applet)
|
||||
continue;
|
||||
if (!applet->rect_in_applet_area().contains(mouse_event.position()))
|
||||
continue;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue