mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-06 08:36:15 +00:00
LibGUI: Implement enter/leave events (with WindowServer support.)
Windows now learn when the mouse cursor leaves or enters them.
Use this to implement GWidget::{enter,leave}_event() and use that
to implement the CoolBar button effect. :^)
This commit is contained in:
@@ -157,6 +157,7 @@ void GWindow::event(GEvent& event)
|
||||
auto result = m_main_widget->hit_test(mouse_event.x(), mouse_event.y());
|
||||
auto local_event = make<GMouseEvent>(event.type(), Point { result.localX, result.localY }, mouse_event.buttons(), mouse_event.button());
|
||||
ASSERT(result.widget);
|
||||
set_hovered_widget(result.widget);
|
||||
return result.widget->event(*local_event);
|
||||
}
|
||||
return;
|
||||
@@ -203,6 +204,11 @@ void GWindow::event(GEvent& event)
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.type() == GEvent::WindowLeft) {
|
||||
set_hovered_widget(nullptr);
|
||||
return;
|
||||
}
|
||||
|
||||
GObject::event(event);
|
||||
}
|
||||
|
||||
@@ -301,3 +307,17 @@ void GWindow::set_opacity(float opacity)
|
||||
m_opacity_when_windowless = opacity;
|
||||
GEventLoop::main().post_message_to_server(request);
|
||||
}
|
||||
|
||||
void GWindow::set_hovered_widget(GWidget* widget)
|
||||
{
|
||||
if (widget == m_hovered_widget.ptr())
|
||||
return;
|
||||
|
||||
if (m_hovered_widget)
|
||||
GEventLoop::main().post_event(m_hovered_widget.ptr(), make<GEvent>(GEvent::Leave));
|
||||
|
||||
m_hovered_widget = widget ? widget->make_weak_ptr() : nullptr;
|
||||
|
||||
if (m_hovered_widget)
|
||||
GEventLoop::main().post_event(m_hovered_widget.ptr(), make<GEvent>(GEvent::Enter));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user