feat(tray): handle scroll events
This commit is contained in:
parent
1418f96e46
commit
245f7f4b11
|
@ -70,6 +70,12 @@ class Item : public sigc::trackable {
|
||||||
static void onMenuDestroyed(Item* self, GObject* old_menu_pointer);
|
static void onMenuDestroyed(Item* self, GObject* old_menu_pointer);
|
||||||
void makeMenu();
|
void makeMenu();
|
||||||
bool handleClick(GdkEventButton* const& /*ev*/);
|
bool handleClick(GdkEventButton* const& /*ev*/);
|
||||||
|
bool handleScroll(GdkEventScroll* const&);
|
||||||
|
|
||||||
|
// smooth scrolling threshold
|
||||||
|
gdouble scroll_threshold_ = 0;
|
||||||
|
gdouble distance_scrolled_x_ = 0;
|
||||||
|
gdouble distance_scrolled_y_ = 0;
|
||||||
|
|
||||||
Glib::RefPtr<Gio::DBus::Proxy> proxy_;
|
Glib::RefPtr<Gio::DBus::Proxy> proxy_;
|
||||||
Glib::RefPtr<Gio::Cancellable> cancellable_;
|
Glib::RefPtr<Gio::Cancellable> cancellable_;
|
||||||
|
|
|
@ -16,6 +16,10 @@ Addressed by *tray*
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
Defines the size of the tray icons.
|
Defines the size of the tray icons.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
*spacing*: ++
|
*spacing*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
Defines the spacing between the tray icons.
|
Defines the spacing between the tray icons.
|
||||||
|
|
|
@ -48,9 +48,13 @@ Item::Item(const std::string& bn, const std::string& op, const Json::Value& conf
|
||||||
if (config["icon-size"].isUInt()) {
|
if (config["icon-size"].isUInt()) {
|
||||||
icon_size = config["icon-size"].asUInt();
|
icon_size = config["icon-size"].asUInt();
|
||||||
}
|
}
|
||||||
|
if (config["smooth-scrolling-threshold"].isNumeric()) {
|
||||||
|
scroll_threshold_ = config["smooth-scrolling-threshold"].asDouble();
|
||||||
|
}
|
||||||
event_box.add(image);
|
event_box.add(image);
|
||||||
event_box.add_events(Gdk::BUTTON_PRESS_MASK);
|
event_box.add_events(Gdk::BUTTON_PRESS_MASK | Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
||||||
event_box.signal_button_press_event().connect(sigc::mem_fun(*this, &Item::handleClick));
|
event_box.signal_button_press_event().connect(sigc::mem_fun(*this, &Item::handleClick));
|
||||||
|
event_box.signal_scroll_event().connect(sigc::mem_fun(*this, &Item::handleScroll));
|
||||||
|
|
||||||
cancellable_ = Gio::Cancellable::create();
|
cancellable_ = Gio::Cancellable::create();
|
||||||
|
|
||||||
|
@ -403,4 +407,52 @@ bool Item::handleClick(GdkEventButton* const& ev) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Item::handleScroll(GdkEventScroll* const& ev) {
|
||||||
|
int dx = 0, dy = 0;
|
||||||
|
switch (ev->direction) {
|
||||||
|
case GDK_SCROLL_UP:
|
||||||
|
dy = -1;
|
||||||
|
break;
|
||||||
|
case GDK_SCROLL_DOWN:
|
||||||
|
dy = 1;
|
||||||
|
break;
|
||||||
|
case GDK_SCROLL_LEFT:
|
||||||
|
dx = -1;
|
||||||
|
break;
|
||||||
|
case GDK_SCROLL_RIGHT:
|
||||||
|
dx = 1;
|
||||||
|
break;
|
||||||
|
case GDK_SCROLL_SMOOTH:
|
||||||
|
distance_scrolled_x_ += ev->delta_x;
|
||||||
|
distance_scrolled_y_ += ev->delta_y;
|
||||||
|
// check against the configured threshold and ensure that the absolute value >= 1
|
||||||
|
if (distance_scrolled_x_ > scroll_threshold_) {
|
||||||
|
dx = (int)lround(std::max(distance_scrolled_x_, 1.0));
|
||||||
|
distance_scrolled_x_ = 0;
|
||||||
|
} else if (distance_scrolled_x_ < -scroll_threshold_) {
|
||||||
|
dx = (int)lround(std::min(distance_scrolled_x_, -1.0));
|
||||||
|
distance_scrolled_x_ = 0;
|
||||||
|
}
|
||||||
|
if (distance_scrolled_y_ > scroll_threshold_) {
|
||||||
|
dy = (int)lround(std::max(distance_scrolled_y_, 1.0));
|
||||||
|
distance_scrolled_y_ = 0;
|
||||||
|
} else if (distance_scrolled_y_ < -scroll_threshold_) {
|
||||||
|
dy = (int)lround(std::min(distance_scrolled_y_, -1.0));
|
||||||
|
distance_scrolled_y_ = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (dx != 0) {
|
||||||
|
auto parameters = Glib::VariantContainerBase::create_tuple(
|
||||||
|
{Glib::Variant<int>::create(dx), Glib::Variant<Glib::ustring>::create("horizontal")});
|
||||||
|
proxy_->call("Scroll", parameters);
|
||||||
|
}
|
||||||
|
if (dy != 0) {
|
||||||
|
auto parameters = Glib::VariantContainerBase::create_tuple(
|
||||||
|
{Glib::Variant<int>::create(dy), Glib::Variant<Glib::ustring>::create("vertical")});
|
||||||
|
proxy_->call("Scroll", parameters);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace waybar::modules::SNI
|
} // namespace waybar::modules::SNI
|
||||||
|
|
Loading…
Reference in New Issue