From ed4521d1138cc3d9a660d8e7fac840fd2867cd53 Mon Sep 17 00:00:00 2001 From: Patrick Hilhorst Date: Tue, 11 Jun 2019 16:19:11 +0200 Subject: [PATCH] Workspaces: fix twitchy scrolling on touchpads Previously, any and all scroll events were interpreted as reason to switch workspaces. This resulted in twitchy behaviour, where the scrolling was practically unusable. Now, we pool all scroll values, and only scroll if the value is larger than the new config option "smooth-scrolling-threshold". If this option is not set, the behaviour is unchanged. --- include/modules/sway/workspaces.hpp | 1 + src/modules/sway/workspaces.cpp | 25 +++++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/include/modules/sway/workspaces.hpp b/include/modules/sway/workspaces.hpp index b7632de1..33789df4 100644 --- a/include/modules/sway/workspaces.hpp +++ b/include/modules/sway/workspaces.hpp @@ -41,6 +41,7 @@ class Workspaces : public IModule, public sigc::trackable { util::JsonParser parser_; bool scrolling_; std::unordered_map buttons_; + gdouble distance_scrolled_; util::SleeperThread thread_; Ipc ipc_; diff --git a/src/modules/sway/workspaces.cpp b/src/modules/sway/workspaces.cpp index 94a5e03e..3da550e8 100644 --- a/src/modules/sway/workspaces.cpp +++ b/src/modules/sway/workspaces.cpp @@ -234,24 +234,37 @@ bool Workspaces::handleScroll(GdkEventScroll *e) { } switch (e->direction) { case GDK_SCROLL_DOWN: - case GDK_SCROLL_RIGHT: + case GDK_SCROLL_RIGHT: { name = getCycleWorkspace(it, false); break; + } case GDK_SCROLL_UP: - case GDK_SCROLL_LEFT: + case GDK_SCROLL_LEFT: { name = getCycleWorkspace(it, true); break; - case GDK_SCROLL_SMOOTH: + } + case GDK_SCROLL_SMOOTH: { gdouble delta_x, delta_y; gdk_event_get_scroll_deltas(reinterpret_cast(e), &delta_x, &delta_y); - if (delta_y < 0) { + distance_scrolled_ += delta_y; + gdouble threshold = 0; + if (config_["smooth-scrolling-threshold"].isNumeric()) { + threshold = config_["smooth-scrolling-threshold"].asDouble(); + } + + if (distance_scrolled_ < -threshold) { name = getCycleWorkspace(it, true); - } else if (delta_y > 0) { + } else if (distance_scrolled_ > threshold) { name = getCycleWorkspace(it, false); } + if(abs(distance_scrolled_) > threshold) { + distance_scrolled_ = 0; + } break; - default: + } + default: { break; + } } if (name.empty() || name == (*it)["name"].asString()) { scrolling_ = false;