Commit Graph

32 Commits

Author SHA1 Message Date
3f77c07875 fix(image): don't block the main loop with exec in the multiple-image path
MultipleImageStrategy::update() and handleClick() ran util::command::exec
(a blocking fork+exec+read) on the GTK main thread, so the whole bar froze
for the script's duration on every interval and on every click.

Move the exec into a new IStrategy::fetch() hook that the SleeperThread
worker runs before dp.emit(); update() now only parses the cached output
and draws on the main thread (mirroring how custom.cpp separates exec from
formatting). handleClick() uses forkExec() so clicks fire-and-forget instead
of blocking on the command's output. The entries and single-image paths are
unchanged.
2026-07-05 10:20:41 +02:00
0729823c13 fix(image): don't crash at startup when the widget isn't realized yet
The HiDPI code path builds a cairo surface from the pixbuf via
Gdk::Cairo::create_surface_from_pixbuf(pixbuf, scale, image_.get_window()),
which requires a realized Gtk::Image. During startup an image module can
run its first update() before the widget is realized, so get_window()
returns a null Gdk::Window and that path aborts before anything is
logged. The more image modules are configured, the more likely at least
one updates before realization, which is why >2 images reliably kills
startup.

Guard on get_window(): only take the surface path when a window is
available, otherwise fall back to image_.set(pixbuf) (the pre-HiDPI
behavior). This keeps HiDPI crispness once realized and never crashes at
startup.

Fixes #5051.
2026-07-05 09:47:47 +02:00
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
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
ffd5a2eb48 Merge remote-tracking branch 'origin/master' into feat-image-path
# Conflicts:
#	src/modules/image.cpp
2026-07-03 22:38:51 +02:00
729dbbb82e Fix build for systems without SIGRTMIN/SIGRTMAX 2026-04-17 19:33:27 +02:00
c9a7cbbdb3 fix(image): treat missing interval as once
PR #4390 enabled millisecond intervals but changed image interval parsing so a missing interval could resolve to 1ms. That creates a hot update loop and can spike CPU and destabilize rendering in drawer/group setups (issue #4835).

Use explicit semantics: missing, null, non-numeric, or <=0 interval is treated as "once" (max sleep), while positive numeric values still support ms precision with a 1ms floor. This keeps the intended feature (sub-second polling when requested) without defaulting to busy looping.

Also align waybar-image(5) docs with runtime behavior.

Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
2026-02-09 15:27:35 -06:00
0a8b7b096a Simplify fix: only add isInt() check in refresh methods
Changed approach per maintainer feedback - instead of caching signal values,
just add isInt() check before accessing config_["signal"].asInt() in refresh()
methods. This is simpler and more minimal.

Co-authored-by: Alexays <13947260+Alexays@users.noreply.github.com>
2026-02-04 08:57:08 +00:00
c34b1b6a19 Fix unhandled JSON exception in signal handlers
Cache signal value during module construction to avoid accessing JSON config
in signal handler context. This prevents crashes when signal field is missing
or not an integer type.

- Custom module: Cache signal_ value in constructor
- Image module: Cache signal_ value in constructor
- Both modules: Use cached value in refresh() method

Co-authored-by: Alexays <13947260+Alexays@users.noreply.github.com>
2026-02-04 08:53:47 +00:00
d61bc859ae perf(image): set image from path only once 2025-10-29 17:10:15 -06:00
16d7c9d849 feat(image): expand ~ & $HOME in path 2025-10-28 13:36:54 -06:00
151cf54532 fix: lint 2025-10-05 09:58:34 +02:00
2b81782fa9 more changes 2025-08-16 16:01:41 -07:00
2b552f7fb6 compat 2025-08-16 15:34:43 -07:00
a4d31ab10d fix: sni item fmt 2024-09-13 09:40:35 +02:00
0ee519753c feat: hidpi support for image module 2024-08-27 15:43:19 +02:00
c7f499e372 image module reworked and added multiple image rendering capability 2024-07-21 21:34:29 +04:00
d590d508ca feat: add module class to the root elements of the modules
Previously, the only way to select all the module labels was with the
following kind of selector:
```css
.modules-left > widget > label,
.modules-center > widget > label,
.modules-right > widget > label {
    /* ... */
}
```
(and a matching block for the `box` containers).

Now, this can be expressed as
```css
label.module, box.module {
    /* ... */
}
```
2024-02-14 22:41:13 -08:00
002ff002fe Move .empty CSS class from Img to Box in the Image module
Since the GTK Image is hidden, the CSS class wasn't used for every cases.
2024-01-24 11:10:16 +01:00
0af8f5c691 Add "empty" class for Image module when path/exec is returning an empty value. 2024-01-23 18:15:47 +01:00
0ea5143493 Pass WAYBAR_OUTPUT_NAME environment variable to custom exec scripts
Signed-off-by: Jo De Boeck <deboeck.jo@gmail.com>
2023-12-19 22:54:12 +02:00
6a17139423 feat: tooltip for image module 2023-04-21 16:38:21 +08:00
ea38eec2af fix: lint 2023-02-09 13:25:39 +01:00
286a3c70f4 Merge pull request #1978 from kpanuragh/master 2023-02-09 13:25:15 +01:00
7b3a6fbaa7 created local variable for _output 2023-01-30 18:35:06 +05:30
7554d7f071 Fixing build issue in image module 2023-01-29 19:13:01 +05:30
012baadaca added exec condition check on image module 2023-01-29 10:41:24 +05:30
9068b7548f for image module get path from executable file 2023-01-25 22:29:33 +05:30
1495b957f1 for image module get path from executable file 2023-01-25 22:28:07 +05:30
c1ceb7ac42 fix linting issues 2023-01-24 14:53:49 -05:00
e128c48573 image module CSS fix 2023-01-24 14:34:02 -05:00
a650c7d90c feat: image module
Module which renders an image onto the bar.
2022-01-16 23:55:13 +00:00