Skip to content

Instantly share code, notes, and snippets.

@IngoMeyer441
Forked from manuuurino/x-resize
Last active March 5, 2024 16:22
Show Gist options
  • Save IngoMeyer441/84cf1e40fa756a9c3e6c8d9e38ee9b6f to your computer and use it in GitHub Desktop.
Save IngoMeyer441/84cf1e40fa756a9c3e6c8d9e38ee9b6f to your computer and use it in GitHub Desktop.
Manual Implementation of Auto Resizing For Non-Gnome Environments (like XFCE) running under Spice/Libvirt
#!/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=="card[0-9]*", 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
## Only run as root user
if [ "${EUID}" -ne 0 ]; then
>&2 echo "Please run as root."
exit 1
fi
## 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 $(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=$(su - "$session_user" -c "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;
su - "$session_user" -c "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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment