summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Persch <chpe@src.gnome.org>2022-04-29 18:13:14 +0200
committerChristian Persch <chpe@src.gnome.org>2022-04-29 18:13:50 +0200
commitfe868c82a071faf05a011942da066b1b9078f121 (patch)
tree5393f6b65b83963c1aa80ce03c62dfee73219b81
parent1398ac862fb10b3cb7cdfc8267be2df5d5f39eb5 (diff)
downloadvte-wip/issue-2561.tar.gz
widget: Ignore synthetic scroll eventswip/issue-2561
https://gitlab.gnome.org/GNOME/vte/-/issues/2561
-rw-r--r--src/widget.cc27
-rw-r--r--src/widget.hh2
2 files changed, 19 insertions, 10 deletions
diff --git a/src/widget.cc b/src/widget.cc
index 47baa04e..ddf22df9 100644
--- a/src/widget.cc
+++ b/src/widget.cc
@@ -842,15 +842,18 @@ Widget::event_leave(GdkEventCrossing *event)
m_terminal->widget_mouse_leave(mouse_event);
}
+
bool
Widget::event_scroll(GdkEventScroll *event)
{
- auto scroll_event = scroll_event_from_gdk(reinterpret_cast<GdkEvent*>(event));
+ if (auto const scroll_event = scroll_event_from_gdk(reinterpret_cast<GdkEvent*>(event))) {
+ _vte_debug_print(VTE_DEBUG_EVENTS, "Scroll delta_x=%.3f delta_y=%.3f\n",
+ scroll_event->dx(), scroll_event->dy());
- _vte_debug_print(VTE_DEBUG_EVENTS, "Scroll delta_x=%.3f delta_y=%.3f\n",
- scroll_event.dx(), scroll_event.dy());
+ return m_terminal->widget_mouse_scroll(*scroll_event);
+ }
- return m_terminal->widget_mouse_scroll(scroll_event);
+ return false;
}
bool
@@ -1438,9 +1441,15 @@ Widget::notify_scroll_value_changed()
#if VTE_GTK == 3
-ScrollEvent
-Widget::scroll_event_from_gdk(GdkEvent* event) const /* throws */
+std::optional<ScrollEvent>
+Widget::scroll_event_from_gdk(GdkEvent* event) const
{
+ /* Ignore emulated scroll events, see
+ * https://gitlab.gnome.org/GNOME/vte/-/issues/2561
+ */
+ if (gdk_event_get_pointer_emulated(event))
+ return std::nullopt;
+
auto dx = double{}, dy = double{};
if (!gdk_event_get_scroll_deltas(event, &dx, &dy)) {
auto dir = GdkScrollDirection{};
@@ -1452,13 +1461,13 @@ Widget::scroll_event_from_gdk(GdkEvent* event) const /* throws */
case GDK_SCROLL_DOWN: dx = 0.; dy = 1.; break;
case GDK_SCROLL_LEFT: dx = -1.; dy = 0.; break;
case GDK_SCROLL_RIGHT: dx = 1.; dy = 0.; break;
- case GDK_SCROLL_SMOOTH: break;
+ case GDK_SCROLL_SMOOTH:
default: __builtin_unreachable();
}
}
- return {read_modifiers_from_gdk(event),
- dx, dy};
+
+ return ScrollEvent{read_modifiers_from_gdk(event), dx, dy};
}
#endif /* VTE_GTK == 3 */
diff --git a/src/widget.hh b/src/widget.hh
index 448ef58d..5e6b1bdc 100644
--- a/src/widget.hh
+++ b/src/widget.hh
@@ -576,7 +576,7 @@ private:
#if VTE_GTK == 3
unsigned read_modifiers_from_gdk(GdkEvent* event) const noexcept;
MouseEvent mouse_event_from_gdk(GdkEvent* event) const /* throws */;
- ScrollEvent scroll_event_from_gdk(GdkEvent* event) const /* throws */;
+ std::optional<ScrollEvent> scroll_event_from_gdk(GdkEvent* event) const;
#elif VTE_GTK == 4
MouseEvent mouse_event_from_gesture_click(EventBase::Type type,
GtkGestureClick* gesture,