fix: backward-compat + bug fixes and man-page build fix for 0.16.0
Post-0.15.0 review of the 0.15.0..HEAD range surfaced regressions and
bugs. This restores backward compatibility for existing configs/CSS,
fixes confirmed defects, and repairs the scdoc man-page build break on
master. Pango-markup tooltips are intentional and were kept.
Backward-compat restorations:
- AModule: honor legacy numeric Gdk::CursorType cursor values (int overload)
- memory: correct GiB divisor (was ~2.3% low); round bare {} placeholders
- wireplumber: scale max-volume into the linear domain so the cap works again
- idle_inhibitor: gate right/middle-click deactivate & scroll on dynamic-timeouts;
accept both dynamic-timeout(s); widen timeout to double (no fractional truncation)
- custom: keep #custom-<name>.<class> CSS selectors working (classes on box_)
- image: don't wordexp-split a single path; fall back to the literal path
- niri/window: restore hide-when-empty (new show-empty opt-in); escape tooltip
- wlr/taskbar: plain-text tooltip when markup is disabled
Bug fixes:
- tray: fix use-after-free in onAdd; guard the watcher retry timeout
- hyprland: clamp max-windows iterator (OOB); drop duplicate language tooltip block
- niri/window: supply {col}/{max_col} args in the empty branch (fmt::format_error)
- mpris: escape {dynamic}/{player} tooltip; fix dangling player; albumArtist source
- mango: fix use-after-free race (dispatch under callback_mutex_)
- mpd: contain throwing checkErrors in noexcept idle paths (no std::terminate/UAF)
- keyboard_state: always render every lock label, with guarded defaults
- bluetooth: bound GATT ReadValue timeout, opt-in + services-resolved gating,
preserve authoritative Battery1 percentage
- wireplumber: fix WpDevice reference leak / NULL handling
- battery, clock, dwl, wayfire, graph, custom_graph, transform, river: assorted
crash/logic fixes
Man page / build:
- niri-workspaces: fix scdoc "indented by an amount greater than 1"
(workspace-taskbar sub-options were mis-indented; breaks man-page build)
- document new show-empty (niri/window); correct network {txBitrate}/{rxBitrate}
Not compiled locally (no gtkmm on this host); C++ build relies on CI.
Man pages validated with scdoc 1.11.4.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -44,7 +44,14 @@ waybar::modules::IdleInhibitor::IdleInhibitor(const std::string& id, const Bar&
|
||||
event_box_.signal_button_press_event().connect(
|
||||
sigc::mem_fun(*this, &IdleInhibitor::handleToggle));
|
||||
|
||||
event_box_.signal_scroll_event().connect(sigc::mem_fun(*this, &IdleInhibitor::handleScroll));
|
||||
// Only connect our own scroll handler when the user hasn't configured on-scroll-*
|
||||
// commands. When on-scroll-* is set, AModule already connects a scroll handler that
|
||||
// (via virtual dispatch) reaches IdleInhibitor::handleScroll; a second connection here
|
||||
// would fire handleScroll twice per scroll event.
|
||||
if (!(config_["on-scroll-up"].isString() || config_["on-scroll-down"].isString() ||
|
||||
config_["on-scroll-left"].isString() || config_["on-scroll-right"].isString())) {
|
||||
event_box_.signal_scroll_event().connect(sigc::mem_fun(*this, &IdleInhibitor::handleScroll));
|
||||
}
|
||||
|
||||
// Add this to the modules list
|
||||
waybar::modules::IdleInhibitor::modules.push_back(this);
|
||||
@@ -157,8 +164,11 @@ void waybar::modules::IdleInhibitor::toggleStatus(int force_status) {
|
||||
}
|
||||
|
||||
bool waybar::modules::IdleInhibitor::handleToggle(GdkEventButton* const& e) {
|
||||
// Accept both the documented "dynamic-timeouts" (plural) and the legacy
|
||||
// "dynamic-timeout" (singular) key spellings.
|
||||
const bool dynamic = config_["dynamic-timeouts"].asBool() || config_["dynamic-timeout"].asBool();
|
||||
if (e->button == 1) {
|
||||
if (config_["dynamic-timeout"].asBool()) {
|
||||
if (dynamic) {
|
||||
toggleStatus(1);
|
||||
} else {
|
||||
toggleStatus();
|
||||
@@ -171,7 +181,7 @@ bool waybar::modules::IdleInhibitor::handleToggle(GdkEventButton* const& e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (e->button == 3) {
|
||||
if (e->button == 3 && dynamic) {
|
||||
toggleStatus(0);
|
||||
|
||||
// Make all other idle inhibitor modules update
|
||||
@@ -181,7 +191,7 @@ bool waybar::modules::IdleInhibitor::handleToggle(GdkEventButton* const& e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (e->button == 2) {
|
||||
if (e->button == 2 && dynamic) {
|
||||
toggleStatus(0);
|
||||
timeout = config_["timeout"].asDouble();
|
||||
}
|
||||
@@ -190,8 +200,11 @@ bool waybar::modules::IdleInhibitor::handleToggle(GdkEventButton* const& e) {
|
||||
}
|
||||
|
||||
bool waybar::modules::IdleInhibitor::handleScroll(GdkEventScroll* e) {
|
||||
if (!config_["dynamic-timeout"].asBool()) {
|
||||
return true;
|
||||
// Accept both the documented "dynamic-timeouts" (plural) and the legacy
|
||||
// "dynamic-timeout" (singular) key spellings.
|
||||
if (!(config_["dynamic-timeouts"].asBool() || config_["dynamic-timeout"].asBool())) {
|
||||
// Delegate to the base handler so any configured on-scroll-* command still runs.
|
||||
return ALabel::handleScroll(e);
|
||||
}
|
||||
auto dir = AModule::getScrollDir(e);
|
||||
if (dir == SCROLL_DIR::NONE) {
|
||||
|
||||
Reference in New Issue
Block a user