Skip to content

Instantly share code, notes, and snippets.

@ppenguin
Last active December 12, 2020 11:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ppenguin/1ec27ae0db5ebc03da1dd7dde5e29a39 to your computer and use it in GitHub Desktop.
Save ppenguin/1ec27ae0db5ebc03da1dd7dde5e29a39 to your computer and use it in GitHub Desktop.
quick&dirty but generic solution to scale external monitors connected to a (4k) laptop
# /etc/udev/rules.d/90-plugdisplay.rules
# may have to be modified if you e.g. have more than 1 graphics card
KERNEL=="card0", SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/plugdisplay.sh"
#!/bin/bash
# system-wide /usr/local/bin/plugdisplay.sh
# to be triggered by udev rule for display plug event
sesinfo() {
loginctl show-session ${1} | grep 'Name\|Display' | sed -e 's/\([A-z]*\)/\U\1/'
}
for s in $(loginctl | awk '$4 ~ /seat.*/ { print $1 }'); do
unset DISPLAY
eval $(sesinfo ${s})
if [ -n "${DISPLAY}" ]; then
echo "Running display plug event for user ${NAME} on display ${DISPLAY}"
# wait some time for monitor to be recognised by DE
(sleep 8 && su - ${NAME} -c "DISPLAY=${DISPLAY} "'${HOME}/.local/bin/xrandr-scale.sh') &
else
echo "NAME==${NAME} DISPLAY==${DISPLAY}"
fi
done
#!/usr/bin/env bash
# set -x
getdisphres() {
xrandr --current | grep '*' | awk -v line="${1}" 'NR==line{print $1}' | cut -d 'x' -f2
}
getnumdisp() {
xrandr --current | grep -B1 -A0 '*' | grep connected | wc -l
}
getnthdispname() {
xrandr --current | grep -B1 -A0 '*' | grep connected | cut -d ' ' -f1 | sed "${1}q;d"
}
y1=$(getdisphres 1)
for d in $(seq 2 $(getnumdisp)); do
y=$(getdisphres ${d})
n=$(getnthdispname ${d})
f=$(bc -l <<< "scale=2; ${y1} / ${y} / 1.5 * 2.0")
xrandr --output ${n} --scale ${f}x${f}
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment