1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 21:37:34 +00:00

Userland: Add horizontal mouse scroll support

This commit is contained in:
Dmitry Petrov 2021-12-13 23:22:28 +01:00 committed by Andreas Kling
parent d61cc47055
commit 1662213737
43 changed files with 112 additions and 84 deletions

View file

@ -214,6 +214,7 @@ if [ -z "$SERENITY_ETHERNET_DEVICE_TYPE" ]; then
SERENITY_ETHERNET_DEVICE_TYPE="e1000" SERENITY_ETHERNET_DEVICE_TYPE="e1000"
fi fi
# add -machine vmport=off below to run the machine with ps/2 mouse
if [ -z "$SERENITY_MACHINE" ]; then if [ -z "$SERENITY_MACHINE" ]; then
if [ "$SERENITY_ARCH" = "aarch64" ]; then if [ "$SERENITY_ARCH" = "aarch64" ]; then
SERENITY_MACHINE="-M raspi3b -serial stdio" SERENITY_MACHINE="-M raspi3b -serial stdio"

View file

@ -76,7 +76,7 @@ public:
auto vcols = desktop.workspace_columns(); auto vcols = desktop.workspace_columns();
auto vrows = desktop.workspace_rows(); auto vrows = desktop.workspace_rows();
auto direction = event.wheel_delta() < 0 ? 1 : -1; auto direction = event.wheel_delta_y() < 0 ? 1 : -1;
if (event.modifiers() & Mod_Shift) if (event.modifiers() & Mod_Shift)
col = abs((int)col + direction) % vcols; col = abs((int)col + direction) % vcols;

View file

@ -156,7 +156,7 @@ void GLContextWidget::mousemove_event(GUI::MouseEvent& event)
void GLContextWidget::mousewheel_event(GUI::MouseEvent& event) void GLContextWidget::mousewheel_event(GUI::MouseEvent& event)
{ {
if (event.wheel_delta() > 0) if (event.wheel_delta_y() > 0)
m_zoom /= 1.1f; m_zoom /= 1.1f;
else else
m_zoom *= 1.1f; m_zoom *= 1.1f;

View file

@ -75,7 +75,7 @@ void PDFViewer::mousewheel_event(GUI::MouseEvent& event)
if (!m_document) if (!m_document)
return; return;
bool scrolled_down = event.wheel_delta() > 0; bool scrolled_down = event.wheel_delta_y() > 0;
if (event.ctrl()) { if (event.ctrl()) {
if (scrolled_down) { if (scrolled_down) {

View file

@ -239,7 +239,12 @@ void RollWidget::mouseup_event([[maybe_unused]] GUI::MouseEvent& event)
void RollWidget::mousewheel_event(GUI::MouseEvent& event) void RollWidget::mousewheel_event(GUI::MouseEvent& event)
{ {
if (event.modifiers() & KeyModifier::Mod_Shift) { if (event.modifiers() & KeyModifier::Mod_Shift) {
horizontal_scrollbar().increase_slider_by(event.wheel_delta() * horizontal_scroll_sensitivity); horizontal_scrollbar().increase_slider_by(event.wheel_delta_y() * horizontal_scroll_sensitivity);
return;
}
if (event.wheel_delta_x() != 0) {
horizontal_scrollbar().increase_slider_by(event.wheel_delta_x() * horizontal_scroll_sensitivity);
return; return;
} }
@ -248,7 +253,7 @@ void RollWidget::mousewheel_event(GUI::MouseEvent& event)
return; return;
} }
double multiplier = event.wheel_delta() >= 0 ? 0.5 : 2; double multiplier = event.wheel_delta_y() >= 0 ? 0.5 : 2;
if (m_zoom_level * multiplier > max_zoom) if (m_zoom_level * multiplier > max_zoom)
return; return;

View file

@ -257,7 +257,8 @@ GUI::MouseEvent ImageEditor::event_with_pan_and_scale_applied(GUI::MouseEvent co
event.buttons(), event.buttons(),
event.button(), event.button(),
event.modifiers(), event.modifiers(),
event.wheel_delta() event.wheel_delta_x(),
event.wheel_delta_y(),
}; };
} }
@ -271,7 +272,8 @@ GUI::MouseEvent ImageEditor::event_adjusted_for_layer(GUI::MouseEvent const& eve
event.buttons(), event.buttons(),
event.button(), event.button(),
event.modifiers(), event.modifiers(),
event.wheel_delta() event.wheel_delta_x(),
event.wheel_delta_y(),
}; };
} }

View file

@ -316,8 +316,8 @@ void TreeMapWidget::doubleclick_event(GUI::MouseEvent& event)
void TreeMapWidget::mousewheel_event(GUI::MouseEvent& event) void TreeMapWidget::mousewheel_event(GUI::MouseEvent& event)
{ {
int delta = event.wheel_delta(); int delta = event.wheel_delta_y();
// FIXME: The wheel_delta is premultiplied in the window server, we actually want a raw value here. // FIXME: The wheel_delta_y is premultiplied in the window server, we actually want a raw value here.
int step_size = GUI::WindowServerConnection::the().get_scroll_step_size(); int step_size = GUI::WindowServerConnection::the().get_scroll_step_size();
if (delta > 0) { if (delta > 0) {
size_t step_back = delta / step_size; size_t step_back = delta / step_size;

View file

@ -350,7 +350,7 @@ void Mandelbrot::mouseup_event(GUI::MouseEvent& event)
void Mandelbrot::mousewheel_event(GUI::MouseEvent& event) void Mandelbrot::mousewheel_event(GUI::MouseEvent& event)
{ {
zoom(event.wheel_delta() < 0 ? Zoom::In : Zoom::Out, event.position()); zoom(event.wheel_delta_y() < 0 ? Zoom::In : Zoom::Out, event.position());
} }
void Mandelbrot::resize_event(GUI::ResizeEvent& event) void Mandelbrot::resize_event(GUI::ResizeEvent& event)

View file

@ -138,7 +138,7 @@ public:
void mousewheel_event(GUI::MouseEvent& event) override void mousewheel_event(GUI::MouseEvent& event) override
{ {
m_wheel_delta_acc = (m_wheel_delta_acc + event.wheel_delta() + 36) % 36; m_wheel_delta_acc = (m_wheel_delta_acc + event.wheel_delta_y() + 36) % 36;
m_show_scroll_wheel = true; m_show_scroll_wheel = true;
update(); update();
if (!has_timer()) if (!has_timer())

View file

@ -67,7 +67,7 @@ void TimelineView::mousewheel_event(GUI::MouseEvent& event)
{ {
if (event.modifiers() == Mod_Ctrl) { if (event.modifiers() == Mod_Ctrl) {
event.accept(); event.accept();
m_scale += event.wheel_delta(); m_scale += event.wheel_delta_y();
m_scale = clamp(m_scale, 1.0f, 100.0f); m_scale = clamp(m_scale, 1.0f, 100.0f);
for_each_child_of_type<TimelineTrack>([&](auto& track) { for_each_child_of_type<TimelineTrack>([&](auto& track) {
track.set_scale(m_scale); track.set_scale(m_scale);

View file

@ -47,11 +47,26 @@ void AbstractScrollableWidget::handle_wheel_event(MouseEvent& event, Widget& eve
event.ignore(); event.ignore();
return; return;
} }
// FIXME: The wheel delta multiplier should probably come from... somewhere?
int wheel_delta_x { 0 };
bool vertical_scroll_hijacked { false };
if (event.shift() || &event_source == m_horizontal_scrollbar.ptr()) { if (event.shift() || &event_source == m_horizontal_scrollbar.ptr()) {
horizontal_scrollbar().increase_slider_by(event.wheel_delta() * 60); wheel_delta_x = event.wheel_delta_y();
} else { vertical_scroll_hijacked = true;
vertical_scrollbar().increase_slider_by(event.wheel_delta() * 20); }
if (event.wheel_delta_x() != 0) {
wheel_delta_x = event.wheel_delta_x();
}
if (wheel_delta_x != 0) {
// FIXME: The wheel delta multiplier should probably come from... somewhere?
horizontal_scrollbar().increase_slider_by(wheel_delta_x * 60);
}
if (!vertical_scroll_hijacked && event.wheel_delta_y() != 0) {
vertical_scrollbar().increase_slider_by(event.wheel_delta_y() * 20);
} }
} }
@ -283,5 +298,4 @@ Gfx::IntPoint AbstractScrollableWidget::to_widget_position(const Gfx::IntPoint&
widget_position.translate_by(frame_thickness(), frame_thickness()); widget_position.translate_by(frame_thickness(), frame_thickness());
return widget_position; return widget_position;
} }
} }

View file

@ -111,7 +111,7 @@ Gfx::FloatRect AbstractZoomPanWidget::content_to_frame_rect(Gfx::IntRect const&
void AbstractZoomPanWidget::mousewheel_event(GUI::MouseEvent& event) void AbstractZoomPanWidget::mousewheel_event(GUI::MouseEvent& event)
{ {
float new_scale = scale() / AK::exp2(event.wheel_delta() / wheel_zoom_factor); float new_scale = scale() / AK::exp2(event.wheel_delta_y() / wheel_zoom_factor);
scale_centered(new_scale, event.position()); scale_centered(new_scale, event.position());
} }

View file

@ -36,7 +36,7 @@ private:
if (!is_focused()) if (!is_focused())
set_focus(true); set_focus(true);
if (on_mousewheel) if (on_mousewheel)
on_mousewheel(event.wheel_delta()); on_mousewheel(event.wheel_delta_y());
} }
virtual void keydown_event(KeyEvent& event) override virtual void keydown_event(KeyEvent& event) override

View file

@ -370,13 +370,14 @@ private:
class MouseEvent final : public Event { class MouseEvent final : public Event {
public: public:
MouseEvent(Type type, const Gfx::IntPoint& position, unsigned buttons, MouseButton button, unsigned modifiers, int wheel_delta) MouseEvent(Type type, const Gfx::IntPoint& position, unsigned buttons, MouseButton button, unsigned modifiers, int wheel_delta_x, int wheel_delta_y)
: Event(type) : Event(type)
, m_position(position) , m_position(position)
, m_buttons(buttons) , m_buttons(buttons)
, m_button(button) , m_button(button)
, m_modifiers(modifiers) , m_modifiers(modifiers)
, m_wheel_delta(wheel_delta) , m_wheel_delta_x(wheel_delta_x)
, m_wheel_delta_y(wheel_delta_y)
{ {
} }
@ -390,14 +391,16 @@ public:
bool shift() const { return m_modifiers & Mod_Shift; } bool shift() const { return m_modifiers & Mod_Shift; }
bool super() const { return m_modifiers & Mod_Super; } bool super() const { return m_modifiers & Mod_Super; }
unsigned modifiers() const { return m_modifiers; } unsigned modifiers() const { return m_modifiers; }
int wheel_delta() const { return m_wheel_delta; } int wheel_delta_x() const { return m_wheel_delta_x; }
int wheel_delta_y() const { return m_wheel_delta_y; }
private: private:
Gfx::IntPoint m_position; Gfx::IntPoint m_position;
unsigned m_buttons { 0 }; unsigned m_buttons { 0 };
MouseButton m_button { MouseButton::None }; MouseButton m_button { MouseButton::None };
unsigned m_modifiers { 0 }; unsigned m_modifiers { 0 };
int m_wheel_delta { 0 }; int m_wheel_delta_x { 0 };
int m_wheel_delta_y { 0 };
}; };
class DragEvent final : public Event { class DragEvent final : public Event {

View file

@ -139,7 +139,7 @@ void OpacitySlider::mouseup_event(MouseEvent& event)
void OpacitySlider::mousewheel_event(MouseEvent& event) void OpacitySlider::mousewheel_event(MouseEvent& event)
{ {
decrease_slider_by(event.wheel_delta()); decrease_slider_by(event.wheel_delta_y());
} }
} }

View file

@ -299,7 +299,7 @@ void Scrollbar::mousewheel_event(MouseEvent& event)
{ {
if (!is_scrollable()) if (!is_scrollable())
return; return;
increase_slider_by_steps(event.wheel_delta()); increase_slider_by_steps(event.wheel_delta_y());
Widget::mousewheel_event(event); Widget::mousewheel_event(event);
} }

View file

@ -139,7 +139,7 @@ void Slider::mouseup_event(MouseEvent& event)
void Slider::mousewheel_event(MouseEvent& event) void Slider::mousewheel_event(MouseEvent& event)
{ {
auto acceleration_modifier = step(); auto acceleration_modifier = step();
auto wheel_delta = event.wheel_delta(); auto wheel_delta = event.wheel_delta_y();
if (event.modifiers() == KeyModifier::Mod_Ctrl) if (event.modifiers() == KeyModifier::Mod_Ctrl)
acceleration_modifier *= 6; acceleration_modifier *= 6;

View file

@ -87,7 +87,7 @@ void SpinBox::set_range(int min, int max, AllowCallback allow_callback)
void SpinBox::mousewheel_event(MouseEvent& event) void SpinBox::mousewheel_event(MouseEvent& event)
{ {
auto wheel_delta = event.wheel_delta() / abs(event.wheel_delta()); auto wheel_delta = event.wheel_delta_y() / abs(event.wheel_delta_y());
if (event.modifiers() == KeyModifier::Mod_Ctrl) if (event.modifiers() == KeyModifier::Mod_Ctrl)
wheel_delta *= 6; wheel_delta *= 6;
set_value(m_value - wheel_delta); set_value(m_value - wheel_delta);

View file

@ -162,7 +162,7 @@ void ValueSlider::leave_event(Core::Event&)
void ValueSlider::mousewheel_event(MouseEvent& event) void ValueSlider::mousewheel_event(MouseEvent& event)
{ {
if (event.wheel_delta() < 0) if (event.wheel_delta_y() < 0)
increase_slider_by(1); increase_slider_by(1);
else else
decrease_slider_by(1); decrease_slider_by(1);

View file

@ -366,7 +366,7 @@ void Window::handle_mouse_event(MouseEvent& event)
if (m_automatic_cursor_tracking_widget) { if (m_automatic_cursor_tracking_widget) {
auto window_relative_rect = m_automatic_cursor_tracking_widget->window_relative_rect(); auto window_relative_rect = m_automatic_cursor_tracking_widget->window_relative_rect();
Gfx::IntPoint local_point { event.x() - window_relative_rect.x(), event.y() - window_relative_rect.y() }; Gfx::IntPoint local_point { event.x() - window_relative_rect.x(), event.y() - window_relative_rect.y() };
auto local_event = MouseEvent((Event::Type)event.type(), local_point, event.buttons(), event.button(), event.modifiers(), event.wheel_delta()); auto local_event = MouseEvent((Event::Type)event.type(), local_point, event.buttons(), event.button(), event.modifiers(), event.wheel_delta_x(), event.wheel_delta_y());
m_automatic_cursor_tracking_widget->dispatch_event(local_event, this); m_automatic_cursor_tracking_widget->dispatch_event(local_event, this);
if (event.buttons() == 0) if (event.buttons() == 0)
m_automatic_cursor_tracking_widget = nullptr; m_automatic_cursor_tracking_widget = nullptr;
@ -375,7 +375,7 @@ void Window::handle_mouse_event(MouseEvent& event)
if (!m_main_widget) if (!m_main_widget)
return; return;
auto result = m_main_widget->hit_test(event.position()); auto result = m_main_widget->hit_test(event.position());
auto local_event = MouseEvent((Event::Type)event.type(), result.local_position, event.buttons(), event.button(), event.modifiers(), event.wheel_delta()); auto local_event = MouseEvent((Event::Type)event.type(), result.local_position, event.buttons(), event.button(), event.modifiers(), event.wheel_delta_x(), event.wheel_delta_y());
VERIFY(result.widget); VERIFY(result.widget);
set_hovered_widget(result.widget); set_hovered_widget(result.widget);
if (event.buttons() != 0 && !m_automatic_cursor_tracking_widget) if (event.buttons() != 0 && !m_automatic_cursor_tracking_widget)

View file

@ -228,38 +228,38 @@ static MouseButton to_mouse_button(u32 button)
} }
} }
void WindowServerConnection::mouse_down(i32 window_id, Gfx::IntPoint const& mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta) void WindowServerConnection::mouse_down(i32 window_id, Gfx::IntPoint const& mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y)
{ {
if (auto* window = Window::from_window_id(window_id)) if (auto* window = Window::from_window_id(window_id))
Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseDown, mouse_position, buttons, to_mouse_button(button), modifiers, wheel_delta)); Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseDown, mouse_position, buttons, to_mouse_button(button), modifiers, wheel_delta_x, wheel_delta_y));
} }
void WindowServerConnection::mouse_up(i32 window_id, Gfx::IntPoint const& mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta) void WindowServerConnection::mouse_up(i32 window_id, Gfx::IntPoint const& mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y)
{ {
if (auto* window = Window::from_window_id(window_id)) if (auto* window = Window::from_window_id(window_id))
Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseUp, mouse_position, buttons, to_mouse_button(button), modifiers, wheel_delta)); Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseUp, mouse_position, buttons, to_mouse_button(button), modifiers, wheel_delta_x, wheel_delta_y));
} }
void WindowServerConnection::mouse_move(i32 window_id, Gfx::IntPoint const& mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta, bool is_drag, Vector<String> const& mime_types) void WindowServerConnection::mouse_move(i32 window_id, Gfx::IntPoint const& mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y, bool is_drag, Vector<String> const& mime_types)
{ {
if (auto* window = Window::from_window_id(window_id)) { if (auto* window = Window::from_window_id(window_id)) {
if (is_drag) if (is_drag)
Core::EventLoop::current().post_event(*window, make<DragEvent>(Event::DragMove, mouse_position, mime_types)); Core::EventLoop::current().post_event(*window, make<DragEvent>(Event::DragMove, mouse_position, mime_types));
else else
Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseMove, mouse_position, buttons, to_mouse_button(button), modifiers, wheel_delta)); Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseMove, mouse_position, buttons, to_mouse_button(button), modifiers, wheel_delta_x, wheel_delta_y));
} }
} }
void WindowServerConnection::mouse_double_click(i32 window_id, Gfx::IntPoint const& mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta) void WindowServerConnection::mouse_double_click(i32 window_id, Gfx::IntPoint const& mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y)
{ {
if (auto* window = Window::from_window_id(window_id)) if (auto* window = Window::from_window_id(window_id))
Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseDoubleClick, mouse_position, buttons, to_mouse_button(button), modifiers, wheel_delta)); Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseDoubleClick, mouse_position, buttons, to_mouse_button(button), modifiers, wheel_delta_x, wheel_delta_y));
} }
void WindowServerConnection::mouse_wheel(i32 window_id, Gfx::IntPoint const& mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta) void WindowServerConnection::mouse_wheel(i32 window_id, Gfx::IntPoint const& mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y)
{ {
if (auto* window = Window::from_window_id(window_id)) if (auto* window = Window::from_window_id(window_id))
Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseWheel, mouse_position, buttons, to_mouse_button(button), modifiers, wheel_delta)); Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseWheel, mouse_position, buttons, to_mouse_button(button), modifiers, wheel_delta_x, wheel_delta_y));
} }
void WindowServerConnection::menu_visibility_did_change(i32 menu_id, bool visible) void WindowServerConnection::menu_visibility_did_change(i32 menu_id, bool visible)

View file

@ -26,11 +26,11 @@ private:
virtual void fast_greet(Vector<Gfx::IntRect> const&, u32, u32, u32, Core::AnonymousBuffer const&, String const&, String const&, i32) override; virtual void fast_greet(Vector<Gfx::IntRect> const&, u32, u32, u32, Core::AnonymousBuffer const&, String const&, String const&, i32) override;
virtual void paint(i32, Gfx::IntSize const&, Vector<Gfx::IntRect> const&) override; virtual void paint(i32, Gfx::IntSize const&, Vector<Gfx::IntRect> const&) override;
virtual void mouse_move(i32, Gfx::IntPoint const&, u32, u32, u32, i32, bool, Vector<String> const&) override; virtual void mouse_move(i32, Gfx::IntPoint const&, u32, u32, u32, i32, i32, bool, Vector<String> const&) override;
virtual void mouse_down(i32, Gfx::IntPoint const&, u32, u32, u32, i32) override; virtual void mouse_down(i32, Gfx::IntPoint const&, u32, u32, u32, i32, i32) override;
virtual void mouse_double_click(i32, Gfx::IntPoint const&, u32, u32, u32, i32) override; virtual void mouse_double_click(i32, Gfx::IntPoint const&, u32, u32, u32, i32, i32) override;
virtual void mouse_up(i32, Gfx::IntPoint const&, u32, u32, u32, i32) override; virtual void mouse_up(i32, Gfx::IntPoint const&, u32, u32, u32, i32, i32) override;
virtual void mouse_wheel(i32, Gfx::IntPoint const&, u32, u32, u32, i32) override; virtual void mouse_wheel(i32, Gfx::IntPoint const&, u32, u32, u32, i32, i32) override;
virtual void window_entered(i32) override; virtual void window_entered(i32) override;
virtual void window_left(i32) override; virtual void window_left(i32) override;
virtual void key_down(i32, u32, u32, u32, u32) override; virtual void key_down(i32, u32, u32, u32, u32) override;

View file

@ -918,7 +918,7 @@ void TerminalWidget::mousewheel_event(GUI::MouseEvent& event)
if (!is_scrollable()) if (!is_scrollable())
return; return;
set_auto_scroll_direction(AutoScrollDirection::None); set_auto_scroll_direction(AutoScrollDirection::None);
m_scrollbar->increase_slider_by(event.wheel_delta() * scroll_length()); m_scrollbar->increase_slider_by(event.wheel_delta_y() * scroll_length());
GUI::Frame::mousewheel_event(event); GUI::Frame::mousewheel_event(event);
} }

View file

@ -237,7 +237,7 @@ void InProcessWebView::mouseup_event(GUI::MouseEvent& event)
void InProcessWebView::mousewheel_event(GUI::MouseEvent& event) void InProcessWebView::mousewheel_event(GUI::MouseEvent& event)
{ {
page().handle_mousewheel(to_content_position(event.position()), event.button(), event.modifiers(), event.wheel_delta()); page().handle_mousewheel(to_content_position(event.position()), event.button(), event.modifiers(), event.wheel_delta_x(), event.wheel_delta_y());
GUI::AbstractScrollableWidget::mousewheel_event(event); GUI::AbstractScrollableWidget::mousewheel_event(event);
} }

View file

@ -136,12 +136,12 @@ void BlockContainer::set_scroll_offset(const Gfx::FloatPoint& offset)
set_needs_display(); set_needs_display();
} }
bool BlockContainer::handle_mousewheel(Badge<EventHandler>, const Gfx::IntPoint&, unsigned int, unsigned int, int wheel_delta) bool BlockContainer::handle_mousewheel(Badge<EventHandler>, const Gfx::IntPoint&, unsigned int, unsigned int, int wheel_delta_x, int wheel_delta_y)
{ {
if (!is_scrollable()) if (!is_scrollable())
return false; return false;
auto new_offset = m_scroll_offset; auto new_offset = m_scroll_offset;
new_offset.translate_by(0, wheel_delta); new_offset.translate_by(wheel_delta_x, wheel_delta_y);
set_scroll_offset(new_offset); set_scroll_offset(new_offset);
return true; return true;

View file

@ -50,7 +50,7 @@ protected:
private: private:
virtual bool is_block_container() const final { return true; } virtual bool is_block_container() const final { return true; }
virtual bool wants_mouse_events() const override { return false; } virtual bool wants_mouse_events() const override { return false; }
virtual bool handle_mousewheel(Badge<EventHandler>, const Gfx::IntPoint&, unsigned buttons, unsigned modifiers, int wheel_delta) override; virtual bool handle_mousewheel(Badge<EventHandler>, const Gfx::IntPoint&, unsigned buttons, unsigned modifiers, int wheel_delta_x, int wheel_delta_y) override;
bool should_clip_overflow() const; bool should_clip_overflow() const;

View file

@ -494,13 +494,13 @@ void Node::handle_mousemove(Badge<EventHandler>, const Gfx::IntPoint&, unsigned,
{ {
} }
bool Node::handle_mousewheel(Badge<EventHandler>, const Gfx::IntPoint&, unsigned, unsigned, int wheel_delta) bool Node::handle_mousewheel(Badge<EventHandler>, const Gfx::IntPoint&, unsigned, unsigned, int wheel_delta_x, int wheel_delta_y)
{ {
if (auto* containing_block = this->containing_block()) { if (auto* containing_block = this->containing_block()) {
if (!containing_block->is_scrollable()) if (!containing_block->is_scrollable())
return false; return false;
auto new_offset = containing_block->scroll_offset(); auto new_offset = containing_block->scroll_offset();
new_offset.translate_by(0, wheel_delta); new_offset.translate_by(wheel_delta_x, wheel_delta_y);
containing_block->set_scroll_offset(new_offset); containing_block->set_scroll_offset(new_offset);
return true; return true;
} }

View file

@ -89,7 +89,7 @@ public:
virtual void handle_mousedown(Badge<EventHandler>, const Gfx::IntPoint&, unsigned button, unsigned modifiers); virtual void handle_mousedown(Badge<EventHandler>, const Gfx::IntPoint&, unsigned button, unsigned modifiers);
virtual void handle_mouseup(Badge<EventHandler>, const Gfx::IntPoint&, unsigned button, unsigned modifiers); virtual void handle_mouseup(Badge<EventHandler>, const Gfx::IntPoint&, unsigned button, unsigned modifiers);
virtual void handle_mousemove(Badge<EventHandler>, const Gfx::IntPoint&, unsigned buttons, unsigned modifiers); virtual void handle_mousemove(Badge<EventHandler>, const Gfx::IntPoint&, unsigned buttons, unsigned modifiers);
virtual bool handle_mousewheel(Badge<EventHandler>, const Gfx::IntPoint&, unsigned buttons, unsigned modifiers, int wheel_delta); virtual bool handle_mousewheel(Badge<EventHandler>, const Gfx::IntPoint&, unsigned buttons, unsigned modifiers, int wheel_delta_x, int wheel_delta_y);
virtual void before_children_paint(PaintContext&, PaintPhase) {}; virtual void before_children_paint(PaintContext&, PaintPhase) {};
virtual void paint(PaintContext&, PaintPhase) = 0; virtual void paint(PaintContext&, PaintPhase) = 0;

View file

@ -183,7 +183,7 @@ void OutOfProcessWebView::mousemove_event(GUI::MouseEvent& event)
void OutOfProcessWebView::mousewheel_event(GUI::MouseEvent& event) void OutOfProcessWebView::mousewheel_event(GUI::MouseEvent& event)
{ {
client().async_mouse_wheel(to_content_position(event.position()), event.button(), event.buttons(), event.modifiers(), event.wheel_delta()); client().async_mouse_wheel(to_content_position(event.position()), event.button(), event.buttons(), event.modifiers(), event.wheel_delta_x(), event.wheel_delta_y());
} }
void OutOfProcessWebView::theme_change_event(GUI::ThemeChangeEvent& event) void OutOfProcessWebView::theme_change_event(GUI::ThemeChangeEvent& event)

View file

@ -112,7 +112,7 @@ Layout::InitialContainingBlock* EventHandler::layout_root()
return m_frame.active_document()->layout_node(); return m_frame.active_document()->layout_node();
} }
bool EventHandler::handle_mousewheel(const Gfx::IntPoint& position, unsigned int buttons, unsigned int modifiers, int wheel_delta) bool EventHandler::handle_mousewheel(const Gfx::IntPoint& position, unsigned int buttons, unsigned int modifiers, int wheel_delta_x, int wheel_delta_y)
{ {
if (!layout_root()) if (!layout_root())
return false; return false;
@ -121,12 +121,12 @@ bool EventHandler::handle_mousewheel(const Gfx::IntPoint& position, unsigned int
auto result = layout_root()->hit_test(position, Layout::HitTestType::Exact); auto result = layout_root()->hit_test(position, Layout::HitTestType::Exact);
if (result.layout_node) { if (result.layout_node) {
if (result.layout_node->handle_mousewheel({}, position, buttons, modifiers, wheel_delta)) if (result.layout_node->handle_mousewheel({}, position, buttons, modifiers, wheel_delta_x, wheel_delta_y))
return true; return true;
} }
if (auto* page = m_frame.page()) { if (auto* page = m_frame.page()) {
page->client().page_did_request_scroll(0, wheel_delta * 20); page->client().page_did_request_scroll(wheel_delta_x * 20, wheel_delta_y * 20);
return true; return true;
} }

View file

@ -25,7 +25,7 @@ public:
bool handle_mouseup(const Gfx::IntPoint&, unsigned button, unsigned modifiers); bool handle_mouseup(const Gfx::IntPoint&, unsigned button, unsigned modifiers);
bool handle_mousedown(const Gfx::IntPoint&, unsigned button, unsigned modifiers); bool handle_mousedown(const Gfx::IntPoint&, unsigned button, unsigned modifiers);
bool handle_mousemove(const Gfx::IntPoint&, unsigned buttons, unsigned modifiers); bool handle_mousemove(const Gfx::IntPoint&, unsigned buttons, unsigned modifiers);
bool handle_mousewheel(const Gfx::IntPoint&, unsigned buttons, unsigned modifiers, int wheel_delta); bool handle_mousewheel(const Gfx::IntPoint&, unsigned buttons, unsigned modifiers, int wheel_delta_x, int wheel_delta_y);
bool handle_keydown(KeyCode, unsigned modifiers, u32 code_point); bool handle_keydown(KeyCode, unsigned modifiers, u32 code_point);
bool handle_keyup(KeyCode, unsigned modifiers, u32 code_point); bool handle_keyup(KeyCode, unsigned modifiers, u32 code_point);

View file

@ -61,9 +61,9 @@ CSS::PreferredColorScheme Page::preferred_color_scheme() const
return m_client.preferred_color_scheme(); return m_client.preferred_color_scheme();
} }
bool Page::handle_mousewheel(const Gfx::IntPoint& position, unsigned button, unsigned modifiers, int wheel_delta) bool Page::handle_mousewheel(const Gfx::IntPoint& position, unsigned button, unsigned modifiers, int wheel_delta_x, int wheel_delta_y)
{ {
return top_level_browsing_context().event_handler().handle_mousewheel(position, button, modifiers, wheel_delta); return top_level_browsing_context().event_handler().handle_mousewheel(position, button, modifiers, wheel_delta_x, wheel_delta_y);
} }
bool Page::handle_mouseup(const Gfx::IntPoint& position, unsigned button, unsigned modifiers) bool Page::handle_mouseup(const Gfx::IntPoint& position, unsigned button, unsigned modifiers)

View file

@ -50,7 +50,7 @@ public:
bool handle_mouseup(const Gfx::IntPoint&, unsigned button, unsigned modifiers); bool handle_mouseup(const Gfx::IntPoint&, unsigned button, unsigned modifiers);
bool handle_mousedown(const Gfx::IntPoint&, unsigned button, unsigned modifiers); bool handle_mousedown(const Gfx::IntPoint&, unsigned button, unsigned modifiers);
bool handle_mousemove(const Gfx::IntPoint&, unsigned buttons, unsigned modifiers); bool handle_mousemove(const Gfx::IntPoint&, unsigned buttons, unsigned modifiers);
bool handle_mousewheel(const Gfx::IntPoint&, unsigned button, unsigned modifiers, int wheel_delta); bool handle_mousewheel(const Gfx::IntPoint&, unsigned button, unsigned modifiers, int wheel_delta_x, int wheel_delta_y);
bool handle_keydown(KeyCode, unsigned modifiers, u32 code_point); bool handle_keydown(KeyCode, unsigned modifiers, u32 code_point);
bool handle_keyup(KeyCode, unsigned modifiers, u32 code_point); bool handle_keyup(KeyCode, unsigned modifiers, u32 code_point);

View file

@ -211,7 +211,7 @@ void TaskbarWindow::event(Core::Event& event)
if (adjusted_point != mouse_event.position()) { if (adjusted_point != mouse_event.position()) {
GUI::WindowServerConnection::the().async_set_global_cursor_position(position() + adjusted_point); GUI::WindowServerConnection::the().async_set_global_cursor_position(position() + adjusted_point);
GUI::MouseEvent adjusted_event = { (GUI::Event::Type)mouse_event.type(), adjusted_point, mouse_event.buttons(), mouse_event.button(), mouse_event.modifiers(), mouse_event.wheel_delta() }; GUI::MouseEvent adjusted_event = { (GUI::Event::Type)mouse_event.type(), adjusted_point, mouse_event.buttons(), mouse_event.button(), mouse_event.modifiers(), mouse_event.wheel_delta_x(), mouse_event.wheel_delta_y() };
Window::event(adjusted_event); Window::event(adjusted_event);
return; return;
} }

View file

@ -154,9 +154,9 @@ void ClientConnection::mouse_up(const Gfx::IntPoint& position, unsigned int butt
page().handle_mouseup(position, button, modifiers); page().handle_mouseup(position, button, modifiers);
} }
void ClientConnection::mouse_wheel(const Gfx::IntPoint& position, unsigned int button, [[maybe_unused]] unsigned int buttons, unsigned int modifiers, i32 wheel_delta) void ClientConnection::mouse_wheel(const Gfx::IntPoint& position, unsigned int button, [[maybe_unused]] unsigned int buttons, unsigned int modifiers, i32 wheel_delta_x, i32 wheel_delta_y)
{ {
page().handle_mousewheel(position, button, modifiers, wheel_delta); page().handle_mousewheel(position, button, modifiers, wheel_delta_x, wheel_delta_y);
} }
void ClientConnection::key_down(i32 key, unsigned int modifiers, u32 code_point) void ClientConnection::key_down(i32 key, unsigned int modifiers, u32 code_point)

View file

@ -47,7 +47,7 @@ private:
virtual void mouse_down(Gfx::IntPoint const&, unsigned, unsigned, unsigned) override; virtual void mouse_down(Gfx::IntPoint const&, unsigned, unsigned, unsigned) override;
virtual void mouse_move(Gfx::IntPoint const&, unsigned, unsigned, unsigned) override; virtual void mouse_move(Gfx::IntPoint const&, unsigned, unsigned, unsigned) override;
virtual void mouse_up(Gfx::IntPoint const&, unsigned, unsigned, unsigned) override; virtual void mouse_up(Gfx::IntPoint const&, unsigned, unsigned, unsigned) override;
virtual void mouse_wheel(Gfx::IntPoint const&, unsigned, unsigned, unsigned, i32) override; virtual void mouse_wheel(Gfx::IntPoint const&, unsigned, unsigned, unsigned, i32, i32) override;
virtual void key_down(i32, unsigned, u32) override; virtual void key_down(i32, unsigned, u32) override;
virtual void key_up(i32, unsigned, u32) override; virtual void key_up(i32, unsigned, u32) override;
virtual void add_backing_store(i32, Gfx::ShareableBitmap const&) override; virtual void add_backing_store(i32, Gfx::ShareableBitmap const&) override;

View file

@ -21,7 +21,7 @@ endpoint WebContentServer
mouse_down(Gfx::IntPoint position, unsigned button, unsigned buttons, unsigned modifiers) =| mouse_down(Gfx::IntPoint position, unsigned button, unsigned buttons, unsigned modifiers) =|
mouse_move(Gfx::IntPoint position, unsigned button, unsigned buttons, unsigned modifiers) =| mouse_move(Gfx::IntPoint position, unsigned button, unsigned buttons, unsigned modifiers) =|
mouse_up(Gfx::IntPoint position, unsigned button, unsigned buttons, unsigned modifiers) =| mouse_up(Gfx::IntPoint position, unsigned button, unsigned buttons, unsigned modifiers) =|
mouse_wheel(Gfx::IntPoint position, unsigned button, unsigned buttons, unsigned modifiers, i32 wheel_delta) =| mouse_wheel(Gfx::IntPoint position, unsigned button, unsigned buttons, unsigned modifiers, i32 wheel_delta_x, i32 wheel_delta_y) =|
key_down(i32 key, unsigned modifiers, u32 code_point) =| key_down(i32 key, unsigned modifiers, u32 code_point) =|
key_up(i32 key, unsigned modifiers, u32 code_point) =| key_up(i32 key, unsigned modifiers, u32 code_point) =|

View file

@ -88,13 +88,14 @@ private:
class MouseEvent final : public Event { class MouseEvent final : public Event {
public: public:
MouseEvent(Type type, const Gfx::IntPoint& position, unsigned buttons, MouseButton button, unsigned modifiers, int wheel_delta = 0) MouseEvent(Type type, const Gfx::IntPoint& position, unsigned buttons, MouseButton button, unsigned modifiers, int wheel_delta_x = 0, int wheel_delta_y = 0)
: Event(type) : Event(type)
, m_position(position) , m_position(position)
, m_buttons(buttons) , m_buttons(buttons)
, m_button(button) , m_button(button)
, m_modifiers(modifiers) , m_modifiers(modifiers)
, m_wheel_delta(wheel_delta) , m_wheel_delta_x(wheel_delta_x)
, m_wheel_delta_y(wheel_delta_y)
{ {
} }
@ -104,7 +105,8 @@ public:
MouseButton button() const { return m_button; } MouseButton button() const { return m_button; }
unsigned buttons() const { return m_buttons; } unsigned buttons() const { return m_buttons; }
unsigned modifiers() const { return m_modifiers; } unsigned modifiers() const { return m_modifiers; }
int wheel_delta() const { return m_wheel_delta; } int wheel_delta_x() const { return m_wheel_delta_x; }
int wheel_delta_y() const { return m_wheel_delta_y; }
bool is_drag() const { return m_drag; } bool is_drag() const { return m_drag; }
Vector<String> mime_types() const Vector<String> mime_types() const
@ -129,7 +131,8 @@ private:
unsigned m_buttons { 0 }; unsigned m_buttons { 0 };
MouseButton m_button { MouseButton::None }; MouseButton m_button { MouseButton::None };
unsigned m_modifiers { 0 }; unsigned m_modifiers { 0 };
int m_wheel_delta { 0 }; int m_wheel_delta_x { 0 };
int m_wheel_delta_y { 0 };
bool m_drag { false }; bool m_drag { false };
RefPtr<const Core::MimeData> m_mime_data; RefPtr<const Core::MimeData> m_mime_data;
}; };

View file

@ -393,7 +393,7 @@ void Menu::event(Core::Event& event)
VERIFY(menu_window()); VERIFY(menu_window());
auto& mouse_event = static_cast<const MouseEvent&>(event); auto& mouse_event = static_cast<const MouseEvent&>(event);
auto previous_scroll_offset = m_scroll_offset; auto previous_scroll_offset = m_scroll_offset;
m_scroll_offset += mouse_event.wheel_delta(); m_scroll_offset += mouse_event.wheel_delta_y();
m_scroll_offset = clamp(m_scroll_offset, 0, m_max_scroll_offset); m_scroll_offset = clamp(m_scroll_offset, 0, m_max_scroll_offset);
if (m_scroll_offset != previous_scroll_offset) if (m_scroll_offset != previous_scroll_offset)
redraw(); redraw();

View file

@ -461,8 +461,8 @@ void ScreenInput::on_receive_mouse_data(const MousePacket& packet)
Core::EventLoop::current().post_event(WindowManager::the(), move(message)); Core::EventLoop::current().post_event(WindowManager::the(), move(message));
} }
if (packet.z) { if (packet.z || packet.w) {
auto message = make<MouseEvent>(Event::MouseWheel, m_cursor_location, buttons, MouseButton::None, m_modifiers, packet.z * m_scroll_step_size); auto message = make<MouseEvent>(Event::MouseWheel, m_cursor_location, buttons, MouseButton::None, m_modifiers, packet.w * m_scroll_step_size, packet.z * m_scroll_step_size);
Core::EventLoop::current().post_event(WindowManager::the(), move(message)); Core::EventLoop::current().post_event(WindowManager::the(), move(message));
} }

View file

@ -264,19 +264,19 @@ void Window::handle_mouse_event(const MouseEvent& event)
switch (event.type()) { switch (event.type()) {
case Event::MouseMove: case Event::MouseMove:
m_client->async_mouse_move(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta(), event.is_drag(), event.mime_types()); m_client->async_mouse_move(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta_x(), event.wheel_delta_y(), event.is_drag(), event.mime_types());
break; break;
case Event::MouseDown: case Event::MouseDown:
m_client->async_mouse_down(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta()); m_client->async_mouse_down(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta_x(), event.wheel_delta_y());
break; break;
case Event::MouseDoubleClick: case Event::MouseDoubleClick:
m_client->async_mouse_double_click(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta()); m_client->async_mouse_double_click(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta_x(), event.wheel_delta_y());
break; break;
case Event::MouseUp: case Event::MouseUp:
m_client->async_mouse_up(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta()); m_client->async_mouse_up(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta_x(), event.wheel_delta_y());
break; break;
case Event::MouseWheel: case Event::MouseWheel:
m_client->async_mouse_wheel(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta()); m_client->async_mouse_wheel(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta_x(), event.wheel_delta_y());
break; break;
default: default:
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();

View file

@ -6,11 +6,11 @@ endpoint WindowClient
fast_greet(Vector<Gfx::IntRect> screen_rects, u32 main_screen_index, u32 workspace_rows, u32 workspace_columns, Core::AnonymousBuffer theme_buffer, String default_font_query, String fixed_width_font_query, i32 client_id) =| fast_greet(Vector<Gfx::IntRect> screen_rects, u32 main_screen_index, u32 workspace_rows, u32 workspace_columns, Core::AnonymousBuffer theme_buffer, String default_font_query, String fixed_width_font_query, i32 client_id) =|
paint(i32 window_id, Gfx::IntSize window_size, Vector<Gfx::IntRect> rects) =| paint(i32 window_id, Gfx::IntSize window_size, Vector<Gfx::IntRect> rects) =|
mouse_move(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta, bool is_drag, Vector<String> mime_types) =| mouse_move(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y, bool is_drag, Vector<String> mime_types) =|
mouse_down(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta) =| mouse_down(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y) =|
mouse_double_click(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta) =| mouse_double_click(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y) =|
mouse_up(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta) =| mouse_up(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y) =|
mouse_wheel(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta) =| mouse_wheel(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y) =|
window_entered(i32 window_id) =| window_entered(i32 window_id) =|
window_left(i32 window_id) =| window_left(i32 window_id) =|
window_input_entered(i32 window_id) =| window_input_entered(i32 window_id) =|

View file

@ -1099,7 +1099,7 @@ void WindowManager::process_event_for_doubleclick(Window& window, MouseEvent& ev
} else { } else {
dbgln_if(DOUBLECLICK_DEBUG, "Transforming MouseUp to MouseDoubleClick ({} < {})!", metadata.clock.elapsed(), m_double_click_speed); dbgln_if(DOUBLECLICK_DEBUG, "Transforming MouseUp to MouseDoubleClick ({} < {})!", metadata.clock.elapsed(), m_double_click_speed);
event = MouseEvent(Event::MouseDoubleClick, event.position(), event.buttons(), event.button(), event.modifiers(), event.wheel_delta()); event = MouseEvent(Event::MouseDoubleClick, event.position(), event.buttons(), event.button(), event.modifiers(), event.wheel_delta_x(), event.wheel_delta_y());
// invalidate this now we've delivered a doubleclick, otherwise // invalidate this now we've delivered a doubleclick, otherwise
// tripleclick will deliver two doubleclick events (incorrectly). // tripleclick will deliver two doubleclick events (incorrectly).
metadata.clock = {}; metadata.clock = {};