diff options
Diffstat (limited to '.local/bin/fix-dpi')
-rwxr-xr-x | .local/bin/fix-dpi | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/.local/bin/fix-dpi b/.local/bin/fix-dpi new file mode 100755 index 0000000..90019c2 --- /dev/null +++ b/.local/bin/fix-dpi @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +# Copyright 2019 Luke Shumaker + +# env-var: MAX_DPI: integer +# env-var: DRY_RUN: empty/non-empty + +( # Phase 1: Probe outputs + export LC_ALL=C + xrandr | sed -rn -e 's@(.*) connected( .*)? ([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+)( .*)? ([0-9]+)mm x ([0-9]+)mm( .*)?@\1 \3 \4 \8 \9@p' -e 's@^ ([0-9]+)x([0-9]+)i? .*\*.*@ \1 \2@p' | sed '/^\S/{ N; s/\n//; }' + # 1 2 3 4 5 6 7 8 9 10 1 2 + # `-outputName | `-fb_xpx `-fb_ypx `-fb_xoff `-fb_yoff `- hw_xmm `- hw_ymm | `-hw_xpx `-hw_ypx + # `-discard `- discard `- discard +) | ( # Phase 2: Translate that to a set of actions to perform + max_xdpi=${MAX_DPI:-96} + max_ydpi=${MAX_DPI:-96} + + dpi=$(xrdb -query|sed -n 's/^Xft\.dpi:\s*//p') + xdpi=${dpi%%x*} + ydpi=${dpi#*x} + if (( xdpi > max_xdpi )); then + max_xdpi=$xdpi + fi + if (( ydpi > max_ydpi )); then + max_ydpi=$ydpi + fi + + declare -A outputs + while read -r output fb_xpx fb_ypx hw_xmm hw_ymm hw_xpx hw_ypx; do + xdpi=$(bc <<<"($hw_xpx*25.4)/$hw_xmm") + ydpi=$(bc <<<"($hw_ypx*25.4)/$hw_ymm") + if (( xdpi > max_xdpi )); then + max_xdpi=$xdpi + fi + if (( ydpi > max_ydpi )); then + max_ydpi=$ydpi + fi + outputs["$output"]="$xdpi $ydpi" + done + echo 'xrandr \' + printf ' --dpi %q \\\n' "${max_xdpi}x${max_ydpi}" + for output in "${!outputs[@]}"; do + read -r xdpi ydpi <<<"${outputs[$output]}" + printf ' --output %q --scale %q \\\n' "$output" "$(bc <<<"scale=5; $max_xdpi/$xdpi")x$(bc <<<"scale=5; $max_ydpi/$ydpi")" + done + echo + printf "xrdb -merge <<<'Xft.dpi: %s'\n" "${max_xdpi}x${max_ydpi}" +) | ( # Phase 3: Apply those actions + if [[ -z "$DRY_RUN" ]]; then + bash -v + else + cat + fi +) |