Commit Graph
1116 Commits
Author SHA1 Message Date
Alex faf6a62bcf fix(network): detect ethernet cable unplug again (carrier/operstate)
PR #4190 (merged as 93d85a0) reworked getNetworkState() so the rfkill
"disabled" state is evaluated whenever the module has no carrier. Because
the module always watches an RFKILL_TYPE_WLAN switch, a wired ethernet
module whose cable is unplugged (carrier lost) would return "disabled"
instead of "disconnected" whenever the system's WLAN radio happened to be
rfkill-blocked. With no format-disabled configured, that state falls back
to plain "format", so the interface kept looking connected after unplug.

rfkill only concerns wireless radios, so only honor it when there is no
interface at all or the current interface is actually wireless (detected
via /sys/class/net/<if>/phy80211 or /wireless). A wired interface that
lost its carrier now correctly reports "disconnected", while wifi rfkill
display from #4190 is preserved.

Fixes #4364.
2026-07-04 13:43:01 +02:00
Alex b0b46ec039 fix(sway/ipc): reconnect on disconnect instead of breaking + CPU-spinning
When sway's event-subscription send buffer overflows during an event
flood, sway closes the client connection. The sway IPC event worker
(SleeperThread running handleEvent -> recv) then threw on every
iteration and the SleeperThread immediately re-invoked it, leaving the
sway modules broken while busy-looping on a dead socket and pegging a
CPU.

Mirror the niri backend's reconnect loop: on a read/EOF/parse error from
the event socket, close the old connection, back off for a couple of
seconds (so we don't busy-spin), re-open the socket and replay the same
subscriptions, then resume. A running_ flag set at the start of teardown
makes the worker bail out cleanly instead of reconnecting to a socket
that is being closed on purpose. The IPC message protocol and event
parsing are unchanged.

Fixes #3166.
2026-07-04 13:43:01 +02:00
Alex 8664d9a963 fix(wireplumber): guard async load callbacks against use-after-free on teardown
The WirePlumber module registers three async callbacks (onDefaultNodesApiLoaded,
onMixerApiLoaded, onPluginActivated) that receive a raw self pointer with a NULL
GCancellable. WirePlumber cannot withdraw an in-flight callback, so if the module
is destroyed before a queued callback fires (e.g. a temporary output/bar is removed
while a component load is still pending, or during an audio route transition), the
callback dereferences the freed self, causing heap corruption / a crash.

Guard each of these callbacks with isModuleAlive(), which checks the existing static
modules registry. The destructor already removes this from the registry before any
teardown, so a missing entry means self is dangling and the callback bails out
without touching it.

A GCancellable cannot fix this cleanly here: every callback dereferences self on its
first line, and wp_core_load_component completes via a WpTransition (not a GTask), so
the cancellable is not recoverable from the GAsyncResult either. The liveness check
must not touch self at all.

Fixes #3974.
2026-07-04 13:04:04 +02:00
Alex 6672e924df fix(niri): reconnect IPC and stop per-event throttling to prevent freeze
The niri IPC worker slept 1ms per event and never reconnected. Under an
event burst the per-event cap back-pressures the socket, niri fills its
send buffer and drops the stream; read_line then returns false, the
detached thread exits and the module freezes permanently.

Remove the per-event sleep so events drain as fast as they arrive, and
wrap the socket setup and read loop in a reconnect loop that backs off
and re-establishes the stream on drop. A running_ flag lets the thread
exit cleanly on teardown.

Fixes #5117.
2026-07-04 03:14:13 +02:00
Alex c0a26104a5 fix(sway/language): apply CSS classes on the main thread to stop SIGSEGV
set_current_layout() mutated label_'s GTK style context (remove_class/
add_class) while being called from the sway IPC worker thread via
onEvent(). Off-main-thread GTK widget mutation caused a SIGSEGV.

Record only the target layout in set_current_layout() and apply the
matching CSS class in update(), which the dispatcher runs on the GTK
main thread. A new applied_class_ member tracks the currently applied
class so update() can swap it. The shared layout_/applied_class_ state
is guarded by the existing mutex_.

Fixes #3702.
2026-07-04 03:14:13 +02:00
AlexandClaude Opus 4.8 f72f84e011 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>
2026-07-04 02:14:13 +02:00
Piotr Wegrzyn 810a8c0f94 feat(net): add {linkSpeed} format replacement
Adds an ethernet link speed ({linkSpeed}) read from
/sys/class/net/<iface>/speed, plus a skip-decimal option on pow_format
to drop a trailing .0. Rebased onto master's store-based network
formatting; existing compact bandwidth args updated for the new
pow_format signature.
2026-07-04 01:54:30 +02:00
Alexis Rouillard 237d6c7c7b Merge pull request #4997 from sewaustav/feat/niri-workspaces-taskbar
feat(niri): add workspace-taskbar support
2026-07-04 01:50:29 +02:00
Alexis Rouillard 7887cdacda Merge pull request #4504 from ErikReider/geoclue-privacy
Add GeoClue2 location privacy item
2026-07-04 01:50:22 +02:00
sewaustav 9cd09c2569 feat(niri): add workspace-taskbar support
Adds a per-workspace app-icon taskbar (Workspace class) to the
niri/workspaces module. Rebased onto master: integrated with the
existing window-rewrite feature so the {windows} and {total} format
replacements continue to work alongside the new taskbar.
2026-07-04 01:50:16 +02:00
Alexis Rouillard 16c79c8dc1 Merge pull request #4557 from adryzz/wwan-module
WWAN module (ModemManager)
2026-07-04 01:48:42 +02:00
Alexis Rouillard bff291889d Merge pull request #4536 from Esensats/master
feat: sway/workspaces: add custom workspace sorting functionality
2026-07-04 01:44:23 +02:00
Alexis Rouillard 8eb7ee46cb Merge pull request #4850 from yangyingchao/master
(sni) be able to control oder of tray items, and clean up sni module based on clang-tidy
2026-07-04 01:43:31 +02:00
Alexis Rouillard 0bb207d56f Merge pull request #5115 from jaschiu/jaschiu-patch-1
fix(tray): segfault due to use-after-free from iterating children
2026-07-04 01:42:36 +02:00
Erik Reider eeb7bc702e Added GeoClue2 privacy item
Rebased onto current master and fixed the privacy module build:
- privacy_item.hpp no longer includes privacy.hpp (it does not use the
  Privacy class); this broke the circular include that left PrivacyItem
  undeclared when privacy.hpp was reached first from privacy_item.cpp.
- privacy_item.cpp now includes gtkmm/label.h explicitly, since Gtk::Label
  was previously only pulled in transitively via privacy.hpp.
2026-07-04 01:42:35 +02:00
Abhijeet 9e10a9aec9 feat(niri/workspaces): add window icons via window-rewrite
Adds format-window-separator, window-rewrite and window-rewrite-default
options plus the {windows} format replacement to the niri/workspaces
module (rebased onto master; coexists with ignore-workspaces).
2026-07-04 01:42:23 +02:00
Alex 41d86d92a8 fix(wwan): null-initialize pointer members to avoid UB in destructor 2026-07-04 01:36:46 +02:00
Lena 11fdbe8ae3 clang-format 2026-07-04 01:36:24 +02:00
Lena cd73e6cdfb clang complained 2026-07-04 01:36:24 +02:00
Lena 90a0f46e37 almost done 2026-07-04 01:36:23 +02:00
Lena 949da4e829 create partial wwan module 2026-07-04 01:36:23 +02:00
yangyingchao c07f8ed0a4 (sni) Be able to control order for system tray items. 2026-07-04 01:35:50 +02:00
Esensats 41926e873f feat: add custom workspace sorting functionality 2026-07-04 01:35:05 +02:00
Jason Chiu 87a337ecdf Update tray.hpp 2026-07-04 01:31:39 +02:00
Alexis Rouillard 37dbd59dac Merge pull request #3017 from 0x000C0A71/master
[hyprland/workspaces] Add tooltips to hyprland/workspaces
2026-07-04 01:12:10 +02:00
Alexis Rouillard 78b9a38532 Merge pull request #4320 from LoricAndre/master
feat(hyprland/workspaces): add uniqueIcons option
2026-07-04 01:12:05 +02:00
Alexis Rouillard 285e68c098 Merge pull request #3151 from VPavliashvili/module-images
feat: add new module 'images' to render multiple images under one gtk container
2026-07-04 01:10:43 +02:00
Alexis Rouillard a560e6a6d3 Merge pull request #4265 from g-goessel/master
feat: Add wifi network link bitrate value
2026-07-04 01:09:20 +02:00
Alexis Rouillard d42e0503e2 Merge pull request #3740 from NoakPalander/feature/squash-list
Added a taskbar squash option
2026-07-04 01:07:25 +02:00
Alexis Rouillard 39fdf7b9fb Merge pull request #3370 from torgiren/idle_inhibitor
allow dynamic timeout setting for idle inhibitor
2026-07-04 01:02:30 +02:00
Alexis Rouillard 01d1b5a47e Merge pull request #4940 from beyertom/clock/configurable-week-numbering
clock: add weeks-numbering option for configurable CW calculation
2026-07-04 00:56:29 +02:00
Alex 8276f6a629 Merge remote-tracking branch 'origin/master' into pr-3017
# Conflicts:
#	include/modules/hyprland/workspaces.hpp
#	man/waybar-hyprland-workspaces.5.scd
#	src/modules/hyprland/workspaces.cpp
2026-07-04 00:55:38 +02:00
Alexis Rouillard 24dba2bb24 Merge pull request #4694 from whymusticode/max-icons
feat(hyprland/workspaces): add deduplication and max-icons option to workspace-taskbar
2026-07-04 00:55:34 +02:00
Alexis Rouillard 2e9e0ba706 Merge pull request #4714 from PickNicko13/master
Implemented "only-physical" parameter in the wireplumber module.
2026-07-04 00:55:27 +02:00
Alex f7ff8eab58 Merge remote-tracking branch 'origin/master' into pr-3370
# Conflicts:
#	include/modules/idle_inhibitor.hpp
#	man/waybar-idle-inhibitor.5.scd
#	src/modules/idle_inhibitor.cpp
2026-07-04 00:54:41 +02:00
Alexis Rouillard 10add89802 Merge pull request #4624 from andresilva/tray-hide-icons
Support hiding tray icons
2026-07-04 00:53:31 +02:00
Alex a45328359d Merge remote-tracking branch 'origin/master' into pr-4265
# Conflicts:
#	src/modules/network.cpp
2026-07-04 00:52:34 +02:00
Alexis Rouillard 40042f42ac Merge pull request #4537 from thomascrha/niri-workspace-ignore-workspaces
feat(niri/worspaces): add ignore-workspaces configuration option
2026-07-04 00:52:19 +02:00
Alex 90883da500 Merge remote-tracking branch 'origin/master' into pr-3151
# Conflicts:
#	include/modules/image.hpp
#	src/modules/image.cpp
2026-07-04 00:51:52 +02:00
Alex 05f32172df Merge remote-tracking branch 'origin/master' into pr-4320
# Conflicts:
#	include/modules/hyprland/workspaces.hpp
#	man/waybar-hyprland-workspaces.5.scd
#	src/modules/hyprland/workspace.cpp
#	src/modules/hyprland/workspaces.cpp
2026-07-04 00:51:21 +02:00
Alex 3df1a13b7d Merge remote-tracking branch 'origin/master' into pr-3740
# Conflicts:
#	include/modules/wlr/taskbar.hpp
#	src/modules/wlr/taskbar.cpp
2026-07-04 00:50:23 +02:00
Alexis Rouillard 3cd93d849f Merge pull request #5032 from yyyumeniku/master
hyprland/workspaces: add debounce timer to prevent workspace button f…
2026-07-04 00:42:04 +02:00
Alex 08e457e3cd Merge remote-tracking branch 'origin/master' into pr-4694
# Conflicts:
#	src/modules/hyprland/workspace.cpp
2026-07-04 00:41:50 +02:00
Alex 9f3e5c09a3 Merge remote-tracking branch 'origin/master' into pr-4537
# Conflicts:
#	include/modules/niri/workspaces.hpp
#	src/modules/niri/workspaces.cpp
2026-07-04 00:40:14 +02:00
Alex df0edaf162 Merge remote-tracking branch 'origin/master' into pr-4624
# Conflicts:
#	include/modules/sni/item.hpp
#	src/modules/sni/item.cpp
#	src/modules/sni/tray.cpp
2026-07-04 00:39:23 +02:00
Alex b509e254da Merge remote-tracking branch 'origin/master' into pr-4714
# Conflicts:
#	include/modules/wireplumber.hpp
#	src/modules/wireplumber.cpp
2026-07-04 00:38:51 +02:00
Alex b851e1c8f9 Merge remote-tracking branch 'origin/master' into pr-4940
# Conflicts:
#	man/waybar-clock.5.scd
2026-07-04 00:37:39 +02:00
Alexis Rouillard a3101a1ca0 Merge branch 'master' into feat-hyprland-submap-icon-handling 2026-07-04 00:32:12 +02:00
Alexis Rouillard 423ca224f5 Merge branch 'master' into master 2026-07-04 00:32:08 +02:00
Alexis Rouillard 9a6009b0b4 Merge pull request #5068 from c4rlo/sway-ipc-fixes
Sway IPC client: robustness improvements & code cleanups
2026-07-04 00:30:22 +02:00