#!/bin/bash # Steps: # 1) Make sure bash is available # 2) Create udev rule # - path to new udev rule: /etc/udev/rules.d/50-x-resize.rules # - udev rule content: # ACTION=="change",KERNEL=="card0", SUBSYSTEM=="drm", RUN+="/usr/local/bin/x-resize" # 3) Create /var/log/autores directory # 4) Create script /usr/local/bin/x-resize (this file) and make executable # 5) Reload udev rules with `sudo udevadm control --reload-rules` # 6) Make sure auto-resize is enabled in virt-viewer/spicy # 7) Make sure qemu-guest-agent spice-vdagent xserver-xspice xserver-xorg-video-qxl are installed # 8) Make sure spice-vdagentd is loaded and running fine # Debugging: # - Watch udev events on resize with `udevadm monitor` # - Watch dmesg (may not be super useful) with `dmesg -w` # - Watch autores logs with `tail -f /var/log/autores/autores.log` # Credits: # - Credit for Finding Sessions as Root: https://unix.stackexchange.com/questions/117083/how-to-get-the-list-of-all-active-x-sessions-and-owners-of-them # - Credit for Resizing via udev: https://superuser.com/questions/1183834/no-auto-resize-with-spice-and-virt-manager ## Ensure Log Directory Exists LOG_DIR=/var/log/autores; if [ ! -d $LOG_DIR ]; then mkdir $LOG_DIR; fi LOG_FILE=${LOG_DIR}/autores.log ## Function to find User Sessions & Resize their display function x_resize() { declare -A disps usrs usrs=() disps=() for i in $(users);do [[ $i = root ]] && continue # skip root usrs[$i]=1 done for u in "${!usrs[@]}"; do for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do disps[$i]=$u done done for d in "${!disps[@]}";do session_user="${disps[$d]}" session_display="$d" session_output=$(sudo -u "$session_user" PATH=/usr/bin DISPLAY="$session_display" xrandr | awk '/ connected/{print $1; exit; }') echo "Session User: $session_user" | tee -a $LOG_FILE; echo "Session Display: $session_display" | tee -a $LOG_FILE; echo "Session Output: $session_output" | tee -a $LOG_FILE; sudo -u "$session_user" PATH=/usr/bin DISPLAY="$session_display" xrandr --output "$session_output" --auto | tee -a $LOG_FILE; done } echo "Resize Event: $(date)" | tee -a $LOG_FILE x_resize