SmartestHome/hosts/steam-tv-box/configs/sway/display-toggle

30 lines
1.6 KiB
Bash
Executable File

#!/bin/sh
# Turn every output off, or back on. Installed to /usr/local/bin/display-toggle and
# bound to the remote's power/sleep buttons in the Sway config.
#
# WHY THE POWER BUTTON DOES NOT POWER ANYTHING OFF: on a TV, that button turns the
# picture off. Here, `poweroff` would drop whatever game is running — unsaved — and
# take the room's screen away until somebody walks over to the machine. So the remote's
# power button does the thing the person pressing it actually meant.
#
# THE WAKE SIDE IS THE HARD HALF. With outputs powered off, Sway is still running and
# still receiving keys, so pressing power again lands here and turns them back on. That
# is why this is a toggle rather than two bindings: there is no other way back. It also
# means a stuck remote button cannot leave the screen dark — the next press fixes it.
#
# This is the local, no-network path. Home Assistant's "Display" switch goes through
# steamtv_agent/display_power.py instead, which also drives HDMI-CEC so the television
# itself goes to standby rather than just showing "no signal".
set -eu
# `swaymsg -t get_outputs` reports each output's power state in a field still named
# "dpms" (the *command* was renamed to `power`; the JSON key was not). If ANY output is
# still on, the intent of a press is "turn it off"; only when everything is already
# dark does a press mean "wake up". That ordering matters on a multi-output machine,
# where asking per-output would leave the remote toggling one screen at a time.
if swaymsg -t get_outputs | grep -q '"dpms": true'; then
swaymsg 'output * power off'
else
swaymsg 'output * power on'
fi