#!/bin/bash set -euo pipefail repo_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)" qs_dir="$repo_dir/config/dot/quickshell" osd="$qs_dir/modules/osd/Osd.qml" state="$qs_dir/services/OsdState.qml" shell_file="$qs_dir/shell.qml" keybinds="$repo_dir/config/dot/hypr/keybinds.lua" fail() { printf 'osd ui contract: %s\n' "$1" >&2 exit 1 } [[ -f "$osd" ]] || fail 'Prism OSD surface is missing' [[ -f "$state" ]] || fail 'OSD presentation state is missing' [[ -f "$qs_dir/modules/osd/qmldir" ]] || fail 'OSD module manifest is missing' rg -q '^import Quickshell$' "$state" \ || fail 'OSD singleton does not import the Quickshell Singleton type' rg -Fq 'import qs.modules.osd' "$shell_file" || fail 'shell does not import the OSD module' [[ "$(rg -c '^[[:space:]]*Osd \{\}' "$shell_file")" -eq 1 ]] \ || fail 'shell does not create exactly one OSD per screen' rg -Fq 'target: "osd"' "$shell_file" || fail 'OSD IPC target is missing' rg -Fq 'OsdState.progress(kind, value, maximum, label)' "$shell_file" \ || fail 'progress IPC is not wired to OSD state' rg -Fq 'OsdState.message(kind, label)' "$shell_file" \ || fail 'message IPC is not wired to OSD state' rg -Fq 'WlrLayershell.namespace: "qs-popover-osd"' "$osd" \ || fail 'OSD does not use the existing Prism blur namespace' rg -Fq 'WlrLayershell.keyboardFocus: WlrKeyboardFocus.None' "$osd" \ || fail 'OSD may steal keyboard focus' # The OSD used to take no pointer input at all. It now takes some, because a # secondary click on a visible OSD opens its settings and dismisses it -- and a # Wayland input region cannot be told to admit one button and not another, so # the feature is not available without a region. # # What still has to hold is that the region is BOUNDED to the OSD's own surface # rather than the screen. The OSD floats over whatever is underneath for a # couple of seconds; a region larger than the card would swallow clicks meant # for a window nobody could see was being covered. rg -Fq 'mask: Region {' "$osd" || fail 'OSD declares no input region at all' rg -Fq 'item: inputMask' "$osd" \ || fail 'the OSD input region is not bound to an item, so it may cover more than the OSD itself' rg -Fq 'anchors.fill: parent' "$osd" \ || fail 'the OSD input mask does not track the surface it belongs to' rg -Fq 'PrismEdge {' "$osd" || fail 'OSD is missing the Prism signature edge' rg -Fq 'font.features: Theme.tabularFigures' "$osd" \ || fail 'changing percentages do not use tabular figures' rg -Fq '$HOME/.config/quickshell/scripts/panama-osd' "$keybinds" \ || fail 'keybinds do not use the deployed Panama OSD helper' for action in \ 'volume up 6' \ 'volume down 6' \ 'volume toggle' \ 'microphone toggle' \ 'volume up 1' \ 'volume down 1' \ 'media play-pause' \ 'media next' \ 'media previous' \ 'media stop' \ 'brightness up 5' \ 'brightness down 5'; do rg -Fq "osd(\"$action\")" "$keybinds" \ || fail "keybind is not routed through panama-osd $action" done printf 'osd ui contract: PASS\n'