summaryrefslogtreecommitdiff
path: root/.local/bin/fix-dpi
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin/fix-dpi')
-rwxr-xr-x.local/bin/fix-dpi53
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
+)