@@ -113,37 +113,40 @@ namespace
113113 return QPoint { p.y (), p.x () };
114114 }
115115
116- void sendWheelEventForDelta (QPoint const & delta,
117- PixelCoordinate const & position,
118- vtbackend::Modifiers modifiers,
119- TerminalSession& session)
116+ void sendWheelEvent (crispy::point const & pixelDelta,
117+ crispy::point const & angleDelta,
118+ PixelCoordinate const & currentMousePixelPosition,
119+ vtbackend::Modifiers modifiers,
120+ TerminalSession& session)
120121 {
121122 using VTMouseButton = vtbackend::MouseButton;
122123
123- session.addScrollX (delta. x () );
124- session.addScrollY (delta. y () );
124+ session.addToAccumulatedScroll (pixelDelta, angleDelta );
125+ auto const [linesScroll, columnsScroll] = session.consumeScroll ( );
125126
126- inputLog ()(" [{}] Accumulate scroll with current value {}" ,
127+ inputLog ()(" [{}] Accumulate scroll with by value {} pixelDelta / {} angleDelta, {} lines, {} columns "
128+ " (against {})" ,
127129 modifiers,
128- crispy::point { .x = session.getScrollX (), .y = session.getScrollY () });
130+ pixelDelta,
131+ angleDelta,
132+ linesScroll,
133+ columnsScroll,
134+ session.terminal ().cellPixelSize ());
129135
130- if (std::abs (session.getScrollX ()) > unbox<int >(session.terminal ().cellPixelSize ().width ))
136+ auto const horizontalScrollEvent =
137+ columnsScroll.as <int >() > 0 ? VTMouseButton::WheelRight : VTMouseButton::WheelLeft;
138+
139+ for (int i = 0 ; i < std::abs (columnsScroll.as <int >()); ++i)
131140 {
132- session.sendMousePressEvent (modifiers,
133- session.getScrollX () > 0 ? VTMouseButton::WheelRight
134- : VTMouseButton::WheelLeft,
135- position);
136- session.resetScrollX (session.getScrollX () % unbox<int >(session.terminal ().cellPixelSize ().width ));
141+ session.sendMousePressEvent (modifiers, horizontalScrollEvent, currentMousePixelPosition);
137142 }
138143
139- if (std::abs (session.getScrollY ()) > unbox<int >(session.terminal ().cellPixelSize ().height ))
144+ auto const verticalScrollEvent =
145+ linesScroll.as <int >() > 0 ? VTMouseButton::WheelUp : VTMouseButton::WheelDown;
146+
147+ for (int i = 0 ; i < std::abs (linesScroll.as <int >()); ++i)
140148 {
141- session.sendMousePressEvent (modifiers,
142- session.getScrollY () > 0 ? VTMouseButton::WheelUp
143- : VTMouseButton::WheelDown,
144- position);
145- session.resetScrollY (session.getScrollY ()
146- % unbox<int >(session.terminal ().cellPixelSize ().height ));
149+ session.sendMousePressEvent (modifiers, verticalScrollEvent, currentMousePixelPosition);
147150 }
148151 }
149152
@@ -416,6 +419,9 @@ bool sendKeyEvent(QKeyEvent* event, vtbackend::KeyboardEventType eventType, Term
416419
417420void sendWheelEvent (QWheelEvent* event, TerminalSession& session)
418421{
422+ if (event->pixelDelta ().isNull () && event->angleDelta ().isNull ())
423+ return ;
424+
419425 using vtbackend::Modifier;
420426
421427 auto const modifiers = makeModifiers (event->modifiers ());
@@ -427,28 +433,31 @@ void sendWheelEvent(QWheelEvent* event, TerminalSession& session)
427433 // it will send horizontal wheel events instead of vertical ones. We need to compensate
428434 // for that here.
429435
430- if (!event->pixelDelta ().isNull ())
431- {
436+ auto const pixelDelta = [&]() -> crispy::point {
437+ if (event->pixelDelta ().isNull ())
438+ return { .x = 0 , .y = 0 };
439+
432440 auto const scaledPixelDelta = session.display ()->contentScale () * event->pixelDelta ();
433- auto const pixelDelta = (modifiers & Modifier::Alt) ? transposed (scaledPixelDelta) : scaledPixelDelta;
441+ auto const x = scaledPixelDelta.x ();
442+ auto const y = scaledPixelDelta.y ();
443+ if (modifiers & Modifier::Alt)
444+ return { .x = y, .y = x };
445+ else
446+ return { .x = x, .y = y };
447+ }();
448+
449+ auto const angleDelta = [&]() -> crispy::point {
450+ if (event->angleDelta ().isNull ())
451+ return { .x = 0 , .y = 0 };
434452
435- sendWheelEventForDelta (pixelDelta, pixelPosition, modifiers, session);
436- event->accept ();
437- }
438- else if (!event->angleDelta ().isNull ())
439- {
440453 auto const numDegrees =
441- ((modifiers & Modifier::Alt) ? transposed (event->angleDelta ()) : event->angleDelta ()) / 8 ;
442-
443- auto const numSteps = numDegrees / 15 ;
444- auto const cellSize = session.terminal ().cellPixelSize ();
445- auto const scaledDelta = QPoint {
446- numSteps.x () * unbox<int >(cellSize.width ),
447- numSteps.y () * unbox<int >(cellSize.height ),
448- };
449- sendWheelEventForDelta (scaledDelta, pixelPosition, modifiers, session);
450- event->accept ();
451- }
454+ ((modifiers & Modifier::Alt) ? transposed (event->angleDelta ()) : event->angleDelta ());
455+
456+ return { .x = numDegrees.x (), .y = numDegrees.y () };
457+ }();
458+
459+ sendWheelEvent (pixelDelta, angleDelta, pixelPosition, modifiers, session);
460+ event->accept ();
452461}
453462
454463void sendMousePressEvent (QMouseEvent* event, TerminalSession& session)
0 commit comments