Add single-output-sway helper script
For sway 1.7, this disables all but one output on connect, then restores everything on disconnect. For sway 1.8 and later, creates a virtual HEADLESS output, disables all others, then restores everything on disconnect. Signed-off-by: Jim Ramsay <i.am@jimramsay.com>pull/207/head
parent
2f2f6f410b
commit
72cc04098d
|
@ -0,0 +1,26 @@
|
||||||
|
# Example Scripts
|
||||||
|
|
||||||
|
The scripts here are examples of how you can automate interesting things with the wayvncctl IPC events.
|
||||||
|
|
||||||
|
## event-watcher
|
||||||
|
|
||||||
|
This is a pretty simple example that just demonstrates how to tie the
|
||||||
|
`wayvncctl event-receive` event loop into a bash script. It logs when clients
|
||||||
|
connect and disconnect.
|
||||||
|
|
||||||
|
## single-output-sway
|
||||||
|
|
||||||
|
This is more purposeful, and implements an idea for multi-output wayland
|
||||||
|
servers, collapsing all outputs down to one when the first client connects, and
|
||||||
|
restoring the configuration when the last client exits.
|
||||||
|
|
||||||
|
The mechanism used to collapse the outputs depends on the version of sway installed:
|
||||||
|
|
||||||
|
- For sway-1.7 and earlier, the script just temporarily disables all outputs
|
||||||
|
except the one being captured. This moves all workspaces to the single
|
||||||
|
remaining output.
|
||||||
|
|
||||||
|
- For sway-1.8 and later, the script creates a temporary virtual output called
|
||||||
|
`HEADLESS-[0-9]+' and then disables all physical outputs, which moves all
|
||||||
|
workspaces to the virtual output. On disconnect, all original physical
|
||||||
|
outputs are re-enabled, and the virtual output is destroyed.
|
|
@ -0,0 +1,99 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
WAYVNCCTL=${WAYVNCCTL:-wayvncctl}
|
||||||
|
SWAYMSG=${SWAYMSG:-swaymsg}
|
||||||
|
|
||||||
|
SWAY_HAS_UNPLUG=false
|
||||||
|
IFS=" .-" read -r _ _ SWAYMAJOR SWAYMINOR _ < <($SWAYMSG -v)
|
||||||
|
if [[ $SWAYMAJOR -ge 1 && $SWAYMINOR -ge 8 ]]; then
|
||||||
|
echo "Detected sway version 1.8 or later: Enabling virtual output device mode"
|
||||||
|
SWAY_HAS_UNPLUG=true
|
||||||
|
else
|
||||||
|
echo "Detected sway version 1.7 or earlier: Not enabling virtual output device mode"
|
||||||
|
fi
|
||||||
|
|
||||||
|
find_output_matching() {
|
||||||
|
local pattern=$1
|
||||||
|
$WAYVNCCTL -j get-outputs | jq -r ".[].name | match(\"$pattern\").string"
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_output_matching() {
|
||||||
|
local pattern=$1
|
||||||
|
local output
|
||||||
|
output=$(find_output_matching "$pattern")
|
||||||
|
while [[ -z $output ]]; do
|
||||||
|
sleep 0.5
|
||||||
|
output=$(find_output_matching "$pattern")
|
||||||
|
done
|
||||||
|
echo "$output"
|
||||||
|
}
|
||||||
|
|
||||||
|
OUTPUTS_TO_RECONNECT=()
|
||||||
|
HEADLESS=
|
||||||
|
restore_outputs() {
|
||||||
|
[[ ${#OUTPUTS_TO_RECONNECT[@]} -ge 1 ]] || return
|
||||||
|
echo "Restoring original output state"
|
||||||
|
for output in "${OUTPUTS_TO_RECONNECT[@]}"; do
|
||||||
|
echo "Re-enabling output $output"
|
||||||
|
$SWAYMSG output "$output" enable
|
||||||
|
done
|
||||||
|
if [[ $SWAY_HAS_UNPLUG == true && $HEADLESS ]]; then
|
||||||
|
local firstOutput=${OUTPUTS_TO_RECONNECT[0]}
|
||||||
|
echo "Switching wayvnc back to physical output $firstOutput"
|
||||||
|
wait_for_output_matching "$firstOutput" >/dev/null
|
||||||
|
$WAYVNCCTL set-output --switch-to="$firstOutput"
|
||||||
|
echo "Removing virtual output $HEADLESS"
|
||||||
|
$SWAYMSG output "$HEADLESS" unplug
|
||||||
|
fi
|
||||||
|
OUTPUTS_TO_RECONNECT=()
|
||||||
|
HEADLESS=
|
||||||
|
}
|
||||||
|
trap restore_outputs EXIT
|
||||||
|
|
||||||
|
collapse_outputs() {
|
||||||
|
if [[ $SWAY_HAS_UNPLUG == true ]]; then
|
||||||
|
local preexisting="$(find_output_matching 'HEADLESS-\\d+')"
|
||||||
|
if [[ $preexisting ]]; then
|
||||||
|
echo "Switching to preexisting virtual output $preexisting"
|
||||||
|
$WAYVNCCTL set-output --switch-to="$preexisting"
|
||||||
|
else
|
||||||
|
echo "Creating a virtual display"
|
||||||
|
$SWAYMSG create_output
|
||||||
|
echo "Waiting for virtusl output to be created..."
|
||||||
|
HEADLESS=$(wait_for_output_matching 'HEADLESS-\\d+')
|
||||||
|
echo "Switching to virtual output $HEADLESS"
|
||||||
|
$WAYVNCCTL set-output --switch-to="$HEADLESS"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
for output in $($WAYVNCCTL -j get-outputs | jq -r '.[] | select(.captured==false).name'); do
|
||||||
|
echo "Disabling extra output $output"
|
||||||
|
$SWAYMSG output "$output" disable
|
||||||
|
OUTPUTS_TO_RECONNECT+=("$output")
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
connection_count_now() {
|
||||||
|
local count=$1
|
||||||
|
if [[ $count == 1 ]]; then
|
||||||
|
collapse_outputs
|
||||||
|
elif [[ $count == 0 ]]; then
|
||||||
|
restore_outputs
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
while IFS= read -r EVT; do
|
||||||
|
case "$(jq -r '.method' <<<"$EVT")" in
|
||||||
|
client-*onnected)
|
||||||
|
count=$(jq -r '.params.connection_count' <<<"$EVT")
|
||||||
|
connection_count_now "$count"
|
||||||
|
;;
|
||||||
|
wayvnc-shutdown)
|
||||||
|
echo "wayvncctl is no longer running"
|
||||||
|
connection_count_now 0
|
||||||
|
;;
|
||||||
|
wayvnc-startup)
|
||||||
|
echo "Ready to receive wayvnc events"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done < <("$WAYVNCCTL" --wait --reconnect --json event-receive)
|
||||||
|
|
Loading…
Reference in New Issue