mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 09:28:11 +00:00
WindowServer+LibGUI: Fix global mouse tracking with recursive widget trees.
Also avoid sending multiple copies of mouse events to global trackers.
This commit is contained in:
parent
2fb3fa7f69
commit
1effe70543
2 changed files with 10 additions and 7 deletions
|
@ -140,9 +140,9 @@ void GWindow::event(GEvent& event)
|
||||||
{
|
{
|
||||||
if (event.is_mouse_event()) {
|
if (event.is_mouse_event()) {
|
||||||
if (m_global_cursor_tracking_widget) {
|
if (m_global_cursor_tracking_widget) {
|
||||||
// FIXME: This won't work for widgets-within-widgets.
|
|
||||||
auto& mouse_event = static_cast<GMouseEvent&>(event);
|
auto& mouse_event = static_cast<GMouseEvent&>(event);
|
||||||
Point local_point { mouse_event.x() - m_global_cursor_tracking_widget->relative_rect().x(), mouse_event.y() - m_global_cursor_tracking_widget->relative_rect().y() };
|
auto window_relative_rect = m_global_cursor_tracking_widget->window_relative_rect();
|
||||||
|
Point local_point { mouse_event.x() - window_relative_rect.x(), mouse_event.y() - window_relative_rect.y() };
|
||||||
auto local_event = make<GMouseEvent>(event.type(), local_point, mouse_event.buttons(), mouse_event.button());
|
auto local_event = make<GMouseEvent>(event.type(), local_point, mouse_event.buttons(), mouse_event.button());
|
||||||
m_global_cursor_tracking_widget->event(*local_event);
|
m_global_cursor_tracking_widget->event(*local_event);
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,8 @@ void GWindow::event(GEvent& event)
|
||||||
auto local_event = make<GMouseEvent>(event.type(), Point { result.localX, result.localY }, mouse_event.buttons(), mouse_event.button());
|
auto local_event = make<GMouseEvent>(event.type(), Point { result.localX, result.localY }, mouse_event.buttons(), mouse_event.button());
|
||||||
ASSERT(result.widget);
|
ASSERT(result.widget);
|
||||||
set_hovered_widget(result.widget);
|
set_hovered_widget(result.widget);
|
||||||
return result.widget->event(*local_event);
|
if (result.widget != m_global_cursor_tracking_widget.ptr())
|
||||||
|
return result.widget->event(*local_event);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -740,10 +740,12 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_
|
||||||
return IterationDecision::Abort;
|
return IterationDecision::Abort;
|
||||||
}
|
}
|
||||||
event_window = &window;
|
event_window = &window;
|
||||||
// FIXME: Should we just alter the coordinates of the existing MouseEvent and pass it through?
|
if (!window.global_cursor_tracking()) {
|
||||||
Point position { event.x() - window.rect().x(), event.y() - window.rect().y() };
|
// FIXME: Should we just alter the coordinates of the existing MouseEvent and pass it through?
|
||||||
auto local_event = make<WSMouseEvent>(event.type(), position, event.buttons(), event.button());
|
Point position { event.x() - window.rect().x(), event.y() - window.rect().y() };
|
||||||
window.on_message(*local_event);
|
auto local_event = make<WSMouseEvent>(event.type(), position, event.buttons(), event.button());
|
||||||
|
window.on_message(*local_event);
|
||||||
|
}
|
||||||
return IterationDecision::Abort;
|
return IterationDecision::Abort;
|
||||||
}
|
}
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue