diff --git a/include/ALabel.hpp b/include/ALabel.hpp index 33903787..5e664d66 100644 --- a/include/ALabel.hpp +++ b/include/ALabel.hpp @@ -36,6 +36,7 @@ class ALabel : public IModule { private: std::vector pid_; + gdouble distance_scrolled_; }; } // namespace waybar 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/ALabel.cpp b/src/ALabel.cpp index 41ccd298..792e7955 100644 --- a/src/ALabel.cpp +++ b/src/ALabel.cpp @@ -97,12 +97,24 @@ bool waybar::ALabel::handleScroll(GdkEventScroll* e) { } if (e->direction == GDK_SCROLL_SMOOTH) { gdouble delta_x, delta_y; - gdk_event_get_scroll_deltas(reinterpret_cast(e), &delta_x, &delta_y); - if (delta_y < 0) { + gdk_event_get_scroll_deltas(reinterpret_cast(e), &delta_x, &delta_y); + distance_scrolled_ += delta_y; + gdouble threshold = 0; + if (config_["smooth-scrolling-threshold"].isNumeric()) { + threshold = config_["smooth-scrolling-threshold"].asDouble(); + } + + if (distance_scrolled_ < -threshold) { direction_up = true; - } else if (delta_y > 0) { + } else if (distance_scrolled_ > threshold) { direction_up = false; } + if(abs(distance_scrolled_) > threshold) { + distance_scrolled_ = 0; + } else { + // Don't execute the action if we haven't met the threshold! + return false; + } } if (direction_up && config_["on-scroll-up"].isString()) { pid_.push_back(util::command::forkExec(config_["on-scroll-up"].asString())); diff --git a/src/modules/sway/workspaces.cpp b/src/modules/sway/workspaces.cpp index d58a7ce6..afca4785 100644 --- a/src/modules/sway/workspaces.cpp +++ b/src/modules/sway/workspaces.cpp @@ -240,24 +240,42 @@ 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) { + + if (abs(delta_x) > abs(delta_y)) { + distance_scrolled_ += delta_x; + } else { + 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;