mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:08:12 +00:00
WindowServer+LibGUI: Handle mouse wheel deltas in the mouse event stream.
The wheel events will end up in GWidget::mousewheel_event(GMouseEvent&) on the client-side. This patch also implements basic wheel scrolling in GScrollableWidget via this mechanism. :^)
This commit is contained in:
parent
dae8eb6454
commit
dab9901235
13 changed files with 58 additions and 25 deletions
|
@ -170,19 +170,19 @@ void GWindow::set_override_cursor(GStandardCursor cursor)
|
|||
|
||||
void GWindow::event(CEvent& event)
|
||||
{
|
||||
if (event.type() == GEvent::MouseUp || event.type() == GEvent::MouseDown || event.type() == GEvent::MouseMove) {
|
||||
if (event.type() == GEvent::MouseUp || event.type() == GEvent::MouseDown || event.type() == GEvent::MouseMove || event.type() == GEvent::MouseWheel) {
|
||||
auto& mouse_event = static_cast<GMouseEvent&>(event);
|
||||
if (m_global_cursor_tracking_widget) {
|
||||
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>((GEvent::Type)event.type(), local_point, mouse_event.buttons(), mouse_event.button(), mouse_event.modifiers());
|
||||
auto local_event = make<GMouseEvent>((GEvent::Type)event.type(), local_point, mouse_event.buttons(), mouse_event.button(), mouse_event.modifiers(), mouse_event.wheel_delta());
|
||||
m_global_cursor_tracking_widget->event(*local_event);
|
||||
return;
|
||||
}
|
||||
if (m_automatic_cursor_tracking_widget) {
|
||||
auto window_relative_rect = m_automatic_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>((GEvent::Type)event.type(), local_point, mouse_event.buttons(), mouse_event.button(), mouse_event.modifiers());
|
||||
auto local_event = make<GMouseEvent>((GEvent::Type)event.type(), local_point, mouse_event.buttons(), mouse_event.button(), mouse_event.modifiers(), mouse_event.wheel_delta());
|
||||
m_automatic_cursor_tracking_widget->event(*local_event);
|
||||
if (mouse_event.buttons() == 0)
|
||||
m_automatic_cursor_tracking_widget = nullptr;
|
||||
|
@ -190,16 +190,14 @@ void GWindow::event(CEvent& event)
|
|||
}
|
||||
if (!m_main_widget)
|
||||
return;
|
||||
if (m_main_widget) {
|
||||
auto result = m_main_widget->hit_test(mouse_event.position());
|
||||
auto local_event = make<GMouseEvent>((GEvent::Type)event.type(), result.local_position, mouse_event.buttons(), mouse_event.button(), mouse_event.modifiers());
|
||||
ASSERT(result.widget);
|
||||
set_hovered_widget(result.widget);
|
||||
if (mouse_event.buttons() != 0 && !m_automatic_cursor_tracking_widget)
|
||||
m_automatic_cursor_tracking_widget = result.widget->make_weak_ptr();
|
||||
if (result.widget != m_global_cursor_tracking_widget.ptr())
|
||||
return result.widget->event(*local_event);
|
||||
}
|
||||
auto result = m_main_widget->hit_test(mouse_event.position());
|
||||
auto local_event = make<GMouseEvent>((GEvent::Type)event.type(), result.local_position, mouse_event.buttons(), mouse_event.button(), mouse_event.modifiers(), mouse_event.wheel_delta());
|
||||
ASSERT(result.widget);
|
||||
set_hovered_widget(result.widget);
|
||||
if (mouse_event.buttons() != 0 && !m_automatic_cursor_tracking_widget)
|
||||
m_automatic_cursor_tracking_widget = result.widget->make_weak_ptr();
|
||||
if (result.widget != m_global_cursor_tracking_widget.ptr())
|
||||
return result.widget->event(*local_event);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue