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;