Fix Home shelf slider interactions

This commit is contained in:
Gabriel Brown
2026-08-17 18:34:48 -04:00
parent 673aac6aba
commit e37df9d838
5 changed files with 206 additions and 15 deletions
+11 -2
View File
@@ -113,12 +113,21 @@ rg -Fq 'signal previewChanged(int value)' "$quicksettings_path/HomeBrightnessSli
|| fail 'brightness slider has no preview contract'
rg -Fq 'signal committed(int value)' "$quicksettings_path/HomeBrightnessSlider.qml" \
|| fail 'brightness slider has no release-commit contract'
rg -Fq 'onReleased:' "$quicksettings_path/HomeBrightnessSlider.qml" \
|| fail 'brightness slider does not commit on pointer release'
rg -Fq 'onReleased: event =>' "$quicksettings_path/HomeBrightnessSlider.qml" \
|| fail 'brightness slider does not route pointer release through its interaction state'
rg -Fq 'root.releasePointerInteraction();' "$quicksettings_path/HomeBrightnessSlider.qml" \
|| fail 'brightness slider release is not wired to one-shot commit semantics'
rg -Fq 'onCanceled: root.cancelPointerInteraction()' "$quicksettings_path/HomeBrightnessSlider.qml" \
|| fail 'brightness slider does not restore its external value when a Flickable steals the pointer'
if rg -Fq 'preventStealing: true' "$quicksettings_path/HomeBrightnessSlider.qml"; then
fail 'brightness slider blocks the expanded shelf from stealing vertical drags'
fi
rg -Fq 'onWheel:' "$quicksettings_path/HomeBrightnessSlider.qml" \
|| fail 'brightness slider has no wheel commit path'
rg -Fq 'onCommitted: value => root.brightnessRequested(value)' "$quicksettings_path/HomeTile.qml" \
|| fail 'Home tile does not forward the slider release commit'
rg -Fq 'accessibleName: root.entity.name + " brightness"' "$quicksettings_path/HomeTile.qml" \
|| fail 'Home tile does not give its dimmer an accessory-specific accessible name'
cp -a "$source_config_path" "$config_path"
: >"$helper_log"
+90
View File
@@ -0,0 +1,90 @@
#!/usr/bin/env bash
set -euo pipefail
repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
harness="$repo_dir/config/dot/quickshell/home-brightness-slider-harness.qml"
state_home="$(mktemp -d /tmp/panama-home-brightness-slider.XXXXXX)"
shell_log="$state_home/quickshell.log"
fail() {
printf 'Home brightness slider contract: %s\n' "$1" >&2
exit 1
}
qs_for_harness() {
QS_DISABLE_CRASH_HANDLER=1 XDG_STATE_HOME="$state_home" \
qs -p "$harness" "$@"
}
cleanup() {
qs_for_harness kill >/dev/null 2>&1 || true
rm -rf "$state_home"
}
trap cleanup EXIT
start_harness() {
qs_for_harness --daemonize >"$shell_log" 2>&1
for _ in $(seq 1 50); do
if qs_for_harness ipc show 2>/dev/null \
| rg -q '^target home-brightness-slider-test$'; then
return
fi
sleep 0.1
done
sed -n '1,160p' "$shell_log" >&2
fail 'isolated slider harness did not start'
}
assert_status() {
local filter="$1"
local message="$2"
local status=""
status="$(qs_for_harness ipc call home-brightness-slider-test status)"
jq -e "$filter" <<<"$status" >/dev/null || {
printf 'Slider status: %s\n' "$status" >&2
fail "$message"
}
}
start_harness
qs_for_harness ipc call home-brightness-slider-test reset 30 >/dev/null
assert_status \
'.accessibleRoleIsSlider == true and .accessibleName == "Desk lamp brightness" and .accessibleDescription == "30 percent, range 0 to 100" and .accessibleFocusable == true' \
'slider accessibility metadata is incomplete or incorrect'
qs_for_harness ipc call home-brightness-slider-test press 140 >/dev/null
assert_status \
'.confirmedValue == 30 and .previewValue == 70 and .interactionActive == true and .commitCount == 0 and .accessibleDescription == "70 percent, range 0 to 100"' \
'pointer press did not remain a local preview'
qs_for_harness ipc call home-brightness-slider-test release >/dev/null
assert_status \
'.previewValue == 70 and .interactionActive == false and .commitCount == 1 and .lastCommit == 70' \
'one pointer release did not emit exactly one commit'
qs_for_harness ipc call home-brightness-slider-test release >/dev/null
assert_status '.commitCount == 1' 'release without an interaction emitted another commit'
qs_for_harness ipc call home-brightness-slider-test reset 30 >/dev/null
qs_for_harness ipc call home-brightness-slider-test wheel 120 >/dev/null
assert_status \
'.previewValue == 35 and .interactionActive == false and .commitCount == 1 and .lastCommit == 35' \
'one wheel event did not emit exactly one five-point commit'
qs_for_harness ipc call home-brightness-slider-test reset 30 >/dev/null
qs_for_harness ipc call home-brightness-slider-test press 160 >/dev/null
assert_status \
'.previewValue == 80 and .interactionActive == true and .commitCount == 0' \
'cancellation setup did not enter local preview state'
qs_for_harness ipc call home-brightness-slider-test external 45 >/dev/null
assert_status \
'.confirmedValue == 45 and .previewValue == 80 and .interactionActive == true and .commitCount == 0' \
'external confirmed or pending state replaced an active local preview'
qs_for_harness ipc call home-brightness-slider-test cancel >/dev/null
assert_status \
'.confirmedValue == 45 and .previewValue == 45 and .interactionActive == false and .commitCount == 0 and .lastCommit == -1' \
'canceled interaction committed or failed to restore the external value'
trap - EXIT
cleanup
printf 'Home brightness slider contract: PASS\n'