diff options
| author | Danilo M. <danix@danix.xyz> | 2026-10-03 09:53:10 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-10-03 09:53:10 +0200 |
| commit | 8af37014d58918da714c741954de92881dcb2554 (patch) | |
| tree | 1fb46faca6db00c1b6034303864b21da07c14e82 /desktop/modules/status/test-statusctl.sh | |
| parent | b5aa795969dcb4115dbdc7b304fdc5dad9a3de59 (diff) | |
| download | quickshell-8af37014d58918da714c741954de92881dcb2554.tar.gz quickshell-8af37014d58918da714c741954de92881dcb2554.zip | |
Qt's atomic write builds the file as an unnamed O_TMPFILE. When the
target does not exist yet it links that straight into place, and the
only event naming the file is IN_CREATE: no close_write, no moved_to.
statusctl watch did not listen for create, so the first write of each
mode in a session went unseen. On a fresh session that is the write
that matters: a Teams call started an hour in left the waybar pill
reading off until some later rename happened to redraw it.
The test reproduces the event with a hard link, which is what the
linkat from Qt's temp file looks like to inotify.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'desktop/modules/status/test-statusctl.sh')
| -rwxr-xr-x | desktop/modules/status/test-statusctl.sh | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/desktop/modules/status/test-statusctl.sh b/desktop/modules/status/test-statusctl.sh index 38da27c..afe56d4 100755 --- a/desktop/modules/status/test-statusctl.sh +++ b/desktop/modules/status/test-statusctl.sh @@ -133,5 +133,21 @@ kill "$watcher4" 2>/dev/null wait "$watcher4" 2>/dev/null check "game ending redraws" "1" "$(grep -c '"class": *"deactivated"' "$out4")" +# The first write of a session creates the file, and Qt's atomic write does +# that by linking an unnamed temp file into place: the only event naming the +# mode file is IN_CREATE, no close_write and no moved_to. A hard link from +# another name reproduces exactly that event. +rm -f "$tmp/status.gaming" "$tmp/status.presentation" +out5="$tmp/watch5.out" +"$ctl" presentation watch > "$out5" 2>/dev/null & +watcher5=$! +sleep 0.3 +printf '1\n' > "$tmp/unnamed" +ln "$tmp/unnamed" "$tmp/status.gaming" +sleep 0.5 +kill "$watcher5" 2>/dev/null +wait "$watcher5" 2>/dev/null +check "first write, created by link, redraws" "1" "$(grep -c '"class": *"gaming"' "$out5")" + printf '\n%d passed, %d failed\n' "$pass" "$fail" [[ "$fail" -eq 0 ]] |
