diff --git a/bin/secondscreenctl b/bin/secondscreenctl new file mode 100755 index 0000000..db0d256 --- /dev/null +++ b/bin/secondscreenctl @@ -0,0 +1,121 @@ +#!/bin/bash + +colored_star_message() { + local color="$1" + shift + printf '\033[1;'"${color}"'m*\033[0m \033[1m%s\033[0m\n' "$*" +} + +ko() { + >&2 colored_star_message 31 "$*" +} + +ok() { + colored_star_message 32 "$*" +} + +get_vscreen_name() { + hyprctl monitors | awk '($1 == "Monitor") { print $2 }' | grep '^HEADLESS-[0-9]*$' +} + +vscreen_exists() { + [ -n "$(get_vscreen_name)" ] +} + +vnc_running() { + wayvncctl output-list > /dev/null 2>&1 +} + +get_mainmon_refrate() { + hyprctl monitors | grep -A 1 '^Monitor .* (ID 0):$' | sed 1d | xargs | sed 's/^.*@//g' | cut -d ' ' -f 1 +} + +create() { + # si il n'y a pas déjà d'écran + # créer un écran virtuel + # configurer l'écran + # donner le nom de l'écran + # si il n'y a pas de serveur VNC + # screener un serveur VNC + + local \ + vscreen_name \ + resolution=1920x1080 \ + position=0x0 \ + listen_address=0.0.0.0 + + set -e + + if ! vscreen_exists; then + hyprctl output create headless + vscreen_name="$(get_vscreen_name)" + printf '%s \033[1m%s\033[0m\n' "New virtual screen:" "$vscreen_name" & + hyprctl keyword monitor \ + "${vscreen_name}," \ + "${resolution}@$(get_mainmon_refrate)," \ + "${position}," \ + 1 + fi + + if ! vnc_running; then + screen -d -m wayvnc -o "$vscreen_name" 0.0.0.0 + fi +} + +destroy() { + # si il y a un serveur VNC + # tuer le serveur VNC + # si il y a un écran virtuel + # supprimer l'écran virtuel + + if vnc_running; then + wayvncctl wayvnc-exit + fi + + if vscreen_exists; then + hyprctl output remove "$(get_vscreen_name)" + fi +} + +status() { + # si il y a un serveur VNC + # afficher que le serveur VNC est en cours + # si il y a un écran virtuel + # afficher le nom de l'écran virtuel + local exit_status=0 + + if vnc_running; then + ok "The VNC server is running." + else + ko "The VNC server is not running." + exit_status="$(("$exit_status" + 1))" + fi + + if vscreen_exists; then + ok "Monitor name: $(get_vscreen_name)" + else + ko "The virtual monitor does not exist!" + exit_status="$(("$exit_status" + 1))" + fi + + exit "$exit_status" +} + +if [ -n "$1" ]; then + verb="$1" + shift +fi + +case "$verb" in + create|destroy|status) + "$verb" + ;; + "") + status + ;; + *) + ko "skill issue" + exit 3 + ;; +esac +