mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 15:37:46 +00:00
Userland: Add horizontal mouse scroll support
This commit is contained in:
parent
d61cc47055
commit
1662213737
43 changed files with 112 additions and 84 deletions
|
@ -47,11 +47,26 @@ void AbstractScrollableWidget::handle_wheel_event(MouseEvent& event, Widget& eve
|
|||
event.ignore();
|
||||
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()) {
|
||||
horizontal_scrollbar().increase_slider_by(event.wheel_delta() * 60);
|
||||
} else {
|
||||
vertical_scrollbar().increase_slider_by(event.wheel_delta() * 20);
|
||||
wheel_delta_x = event.wheel_delta_y();
|
||||
vertical_scroll_hijacked = true;
|
||||
}
|
||||
|
||||
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());
|
||||
return widget_position;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -111,7 +111,7 @@ Gfx::FloatRect AbstractZoomPanWidget::content_to_frame_rect(Gfx::IntRect const&
|
|||
|
||||
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());
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ private:
|
|||
if (!is_focused())
|
||||
set_focus(true);
|
||||
if (on_mousewheel)
|
||||
on_mousewheel(event.wheel_delta());
|
||||
on_mousewheel(event.wheel_delta_y());
|
||||
}
|
||||
|
||||
virtual void keydown_event(KeyEvent& event) override
|
||||
|
|
|
@ -370,13 +370,14 @@ private:
|
|||
|
||||
class MouseEvent final : public Event {
|
||||
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)
|
||||
, m_position(position)
|
||||
, m_buttons(buttons)
|
||||
, m_button(button)
|
||||
, 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 super() const { return m_modifiers & Mod_Super; }
|
||||
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:
|
||||
Gfx::IntPoint m_position;
|
||||
unsigned m_buttons { 0 };
|
||||
MouseButton m_button { MouseButton::None };
|
||||
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 {
|
||||
|
|
|
@ -139,7 +139,7 @@ void OpacitySlider::mouseup_event(MouseEvent& event)
|
|||
|
||||
void OpacitySlider::mousewheel_event(MouseEvent& event)
|
||||
{
|
||||
decrease_slider_by(event.wheel_delta());
|
||||
decrease_slider_by(event.wheel_delta_y());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -299,7 +299,7 @@ void Scrollbar::mousewheel_event(MouseEvent& event)
|
|||
{
|
||||
if (!is_scrollable())
|
||||
return;
|
||||
increase_slider_by_steps(event.wheel_delta());
|
||||
increase_slider_by_steps(event.wheel_delta_y());
|
||||
Widget::mousewheel_event(event);
|
||||
}
|
||||
|
||||
|
|
|
@ -139,7 +139,7 @@ void Slider::mouseup_event(MouseEvent& event)
|
|||
void Slider::mousewheel_event(MouseEvent& event)
|
||||
{
|
||||
auto acceleration_modifier = step();
|
||||
auto wheel_delta = event.wheel_delta();
|
||||
auto wheel_delta = event.wheel_delta_y();
|
||||
|
||||
if (event.modifiers() == KeyModifier::Mod_Ctrl)
|
||||
acceleration_modifier *= 6;
|
||||
|
|
|
@ -87,7 +87,7 @@ void SpinBox::set_range(int min, int max, AllowCallback allow_callback)
|
|||
|
||||
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)
|
||||
wheel_delta *= 6;
|
||||
set_value(m_value - wheel_delta);
|
||||
|
|
|
@ -162,7 +162,7 @@ void ValueSlider::leave_event(Core::Event&)
|
|||
|
||||
void ValueSlider::mousewheel_event(MouseEvent& event)
|
||||
{
|
||||
if (event.wheel_delta() < 0)
|
||||
if (event.wheel_delta_y() < 0)
|
||||
increase_slider_by(1);
|
||||
else
|
||||
decrease_slider_by(1);
|
||||
|
|
|
@ -366,7 +366,7 @@ void Window::handle_mouse_event(MouseEvent& event)
|
|||
if (m_automatic_cursor_tracking_widget) {
|
||||
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() };
|
||||
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);
|
||||
if (event.buttons() == 0)
|
||||
m_automatic_cursor_tracking_widget = nullptr;
|
||||
|
@ -375,7 +375,7 @@ void Window::handle_mouse_event(MouseEvent& event)
|
|||
if (!m_main_widget)
|
||||
return;
|
||||
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);
|
||||
set_hovered_widget(result.widget);
|
||||
if (event.buttons() != 0 && !m_automatic_cursor_tracking_widget)
|
||||
|
|
|
@ -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))
|
||||
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))
|
||||
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 (is_drag)
|
||||
Core::EventLoop::current().post_event(*window, make<DragEvent>(Event::DragMove, mouse_position, mime_types));
|
||||
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))
|
||||
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))
|
||||
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)
|
||||
|
|
|
@ -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 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_down(i32, Gfx::IntPoint const&, u32, u32, u32, i32) override;
|
||||
virtual void mouse_double_click(i32, Gfx::IntPoint const&, u32, u32, u32, i32) override;
|
||||
virtual void mouse_up(i32, Gfx::IntPoint const&, u32, u32, u32, i32) override;
|
||||
virtual void mouse_wheel(i32, Gfx::IntPoint const&, u32, u32, u32, i32) 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, 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, 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_left(i32) override;
|
||||
virtual void key_down(i32, u32, u32, u32, u32) override;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue