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>
48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#include <fmt/format.h>
|
|
|
|
#include "ALabel.hpp"
|
|
#include "bar.hpp"
|
|
#include "client.hpp"
|
|
|
|
struct ext_idle_notification_v1;
|
|
|
|
namespace waybar::modules {
|
|
|
|
class IdleInhibitor : public ALabel {
|
|
sigc::connection timeout_;
|
|
ext_idle_notification_v1* idle_notification_;
|
|
uint32_t idle_timeout_ms_;
|
|
|
|
public:
|
|
IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
|
|
virtual ~IdleInhibitor();
|
|
auto update() -> void override;
|
|
auto refresh(int) -> void override;
|
|
static std::list<waybar::AModule*> modules;
|
|
static bool status;
|
|
static long deactivationTime;
|
|
|
|
private:
|
|
bool handleToggle(GdkEventButton* const& e) override;
|
|
bool handleScroll(GdkEventScroll* e) override;
|
|
|
|
void toggleStatus(int force_status = -1);
|
|
void setupIdleNotification();
|
|
void teardownIdleNotification();
|
|
static void handleIdled(void* data, ext_idle_notification_v1* notification);
|
|
static void handleResumed(void* data, ext_idle_notification_v1* notification);
|
|
|
|
const Bar& bar_;
|
|
struct zwp_idle_inhibitor_v1* idle_inhibitor_;
|
|
int pid_;
|
|
|
|
bool dynamicTimeout = false;
|
|
double timeout;
|
|
double timeout_step;
|
|
bool wait_for_activity_;
|
|
};
|
|
|
|
} // namespace waybar::modules
|