#!/bin/sh DISPLAY=${DISPLAY%.0} # For information xrandr --current \ | sed -n 's/^\([^ ]\{1,\}\)* connected.* \([0-9]\{1,\}\)x.* \([0-9]\{1,\}\)mm x .*/\1 \2 \3/p' \ | while read output pixels mm; do dpi=$(($pixels * 254 / 10 / $mm)) # For laptop screens, we need to apply a correction factor case $output in eDP-1|eDP1) corrected=$(($dpi * 96/144)) ;; *) corrected=$dpi esac # Authorized factors: 1, 1.5, 2, 3, 4, ... rounded=$(((corrected + 24) / 48 * 48)) [ $rounded -gt 192 ] && rounded=$(((corrected + 48) / 96 * 96)) [ $rounded -lt 96 ] && rounded=96 echo "$output: ${dpi}dpi (corrected to ${corrected}dpi, rounded to ${rounded}dpi)" >&2 done # Don't try to guess DPI. For a laptop, we don't want the same DPI as # for an external screen or for a TV. Just hardcode stuff... case $(hostname),$(autorandr --current) in zoro,default) dpi=144 ;; guybrush,default) dpi=144 ;; neo,*) dpi=192 ;; *,*) dpi=96 ;; esac echo "using ${dpi}dpi" >&2 xrandr --dpi $dpi # Build xsettingsd.local { cat ~/.config/awesome/xsettingsd echo Xft/DPI $(( $dpi*1024 )) echo Xft/RGBA \"$( [ $dpi -gt 144 ] && echo none || echo rgb )\" echo Gdk/WindowScalingFactor $(( $dpi/96 )) echo Gdk/UnscaledDPI $(( $dpi*1024/($dpi/96) )) } > ~/.xsettingsd # Signal xsettingsd systemctl --user reload xsettingsd@$(systemd-escape -- "$DISPLAY").service # Also use xrdb for very old stuff (you know, LibreOffice) echo Xft.dpi: $dpi | xrdb -merge