UI: Inform WebContent when the mouse leaves the WebView widget

Previously, when the mouse left the WebView, the currently hovered node
would remain hovered (including the scroll bar). This felt a bit awkward
and is not how other browsers behave.
This commit is contained in:
Timothy Flynn 2025-07-27 09:55:26 -04:00 committed by Alexander Kalenik
commit bc4112bf18
Notes: github-actions[bot] 2025-07-28 03:39:09 +00:00
3 changed files with 20 additions and 1 deletions

View file

@ -137,7 +137,7 @@ struct HideCursor {
[self setWebViewCallbacks];
auto* area = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:NSTrackingActiveInKeyWindow | NSTrackingInVisibleRect | NSTrackingMouseMoved
options:NSTrackingActiveInKeyWindow | NSTrackingInVisibleRect | NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved
owner:self
userInfo:nil];
[self addTrackingArea:area];
@ -1574,6 +1574,14 @@ static void copy_data_to_clipboard(StringView data, NSPasteboardType pasteboard_
return YES;
}
- (void)mouseExited:(NSEvent*)event
{
static constexpr Web::DevicePixelPoint point { NumericLimits<Web::DevicePixels::Type>::max(), NumericLimits<Web::DevicePixels::Type>::max() };
Web::MouseEvent mouse_event { Web::MouseEvent::Type::MouseMove, point, point, Web::UIEvents::MouseButton::None, Web::UIEvents::MouseButton::None, Web::UIEvents::KeyModifier::Mod_None, 0, 0, nullptr };
m_web_view_bridge->enqueue_input_event(move(mouse_event));
}
- (void)mouseMoved:(NSEvent*)event
{
auto mouse_event = Ladybird::ns_event_to_mouse_event(Web::MouseEvent::Type::MouseMove, event, self, Web::UIEvents::MouseButton::None);

View file

@ -402,6 +402,16 @@ QVariant WebContentView::inputMethodQuery(Qt::InputMethodQuery) const
return QVariant();
}
void WebContentView::leaveEvent(QEvent* event)
{
static constexpr QPointF point { NumericLimits<qreal>::max(), NumericLimits<qreal>::max() };
QMouseEvent mouse_event { QEvent::Type::MouseMove, point, point, Qt::MouseButton::NoButton, Qt::MouseButton::NoButton, Qt::KeyboardModifier::NoModifier };
enqueue_native_event(Web::MouseEvent::Type::MouseMove, mouse_event);
QWidget::leaveEvent(event);
}
void WebContentView::mouseMoveEvent(QMouseEvent* event)
{
if (!m_tooltip_override) {

View file

@ -59,6 +59,7 @@ public:
virtual void paintEvent(QPaintEvent*) override;
virtual void resizeEvent(QResizeEvent*) override;
virtual void leaveEvent(QEvent* event) override;
virtual void mouseMoveEvent(QMouseEvent*) override;
virtual void mousePressEvent(QMouseEvent*) override;
virtual void mouseReleaseEvent(QMouseEvent*) override;