diff options
Diffstat (limited to '.local/bin/get-dpi')
-rwxr-xr-x | .local/bin/get-dpi | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/.local/bin/get-dpi b/.local/bin/get-dpi index 3c9252a..3fba920 100755 --- a/.local/bin/get-dpi +++ b/.local/bin/get-dpi @@ -2,13 +2,76 @@ # Copyright 2019 Luke Shumaker sanitize() { + [[ $? == 0 ]] || return $? printf '%g\n' "$@" } calc() { + [[ $? == 0 ]] || return $? sanitize "$(bc <<<"scale=6; $1")" } +errusage() { + if (( $# > 0 )); then + printf '%s: %s\n' "${0##*/}" "$(printf "$@")" >&2 + fi + printf "Try '%s --help' for more information.\n" "${0##*/}" >&2 + exit 2 +} + +usage() { + printf 'Usage: %s [OPTIONS]\n' "${0##*/}" + printf "Report DPI settings\n" + echo + printf 'OPTIONS:\n': + printf ' -h, --help Show this message\n' + printf ' --device-geometry=OUTPUT=<X>x<Y>[x<Z>]\n' + printf ' Override the hardware-reported physical\n' + printf ' dimensions for the X11 output OUTPUT; X, Y,\n' + printf ' and Z must either have a suffix of "in" or\n' + printf ' "mm", or be "auto"; providing Z causes the\n' + printf ' the dimensions to be scaled to a reference\n' + printf ' viewing distance of 28in (as described in\n' + printf ' [CSS3-values])\n' + echo + printf '[CSS3-values]: https://www.w3.org/TR/css3-values/#reference-pixel\n' +} + +set -euE -o pipefail +args=$(getopt -n "${0##*/}" -o 'hn' -l 'help,device-geometry:' -- "$@") || errusage +eval "set -- $args" + +declare -A arg_device_geometry +while (( $# > 0 )); do + case "$1" in + -h|--help) + usage + exit 0 + ;; + --device-geometry) + if [[ "$2" != *=* ]]; then + errusage 'Invalid --device-geometry=%q' "$2" + fi + device=${2%=*} + geometry=${2##*=} + re_dim='([0-9]+(.[0-9]+)?(in|mm)|auto)' + re_geo="^${re_dim}x${re_dim}(x${re_dim})?\$" + if ! [[ "$geometry" =~ $re_geo ]]; then + errusage 'Invalid --device-geometry=%q' "$2" + fi + arg_device_geometry["$device"]=$geometry + shift 2 + ;; + --) + shift + break + ;; + esac +done +if (( $# > 0 )); then + errusage +fi + # Xft dpi=$(xrdb -query|sed -n 's/^Xft\.dpi:\s*//p') [[ -n "$dpi" ]] || dpi=96x96 @@ -33,6 +96,33 @@ echo environment+X11-resources GDK-text ${dpi}x${dpi} # `-outputName | `-fb_xpx `-fb_ypx `-fb_xoff `-fb_yoff `- hw_xmm `- hw_ymm | `-hw_xpx `-hw_ypx # `-discard `- discard `- discard ) | while read -r output fb_xpx fb_ypx hw_xmm hw_ymm hw_xpx hw_ypx; do + if [[ -n "${arg_device_geometry["$output"]:-}" ]]; then + IFS=x read override_x override_y override_z <<<"${arg_device_geometry["$output"]}" + case "$override_x" in + *mm) override_xmm="$(sanitize "${override_x%mm}")";; + *in) override_xmm="$(calc "$(sanitize "${override_x%in}")*25.4")";; + auto) override_xmm="$hw_xmm";; + esac + case "$override_y" in + *mm) override_ymm="$(sanitize "${override_y%mm}")";; + *in) override_ymm="$(calc "$(sanitize "${override_y%in}")*25.4")";; + auto) override_ymm="$hw_ymm";; + esac + if [[ "$override_z" == '' || "$override_z" == 'auto' ]]; then + hw_xmm=$override_xmm + hw_ymm=$override_ymm + else + # algorithm from https://www.w3.org/TR/css3-values/#reference-pixel + ref_zmm=711.2 # 28in + case "$override_z" in + *mm) override_zmm="$(sanitize "${override_z%mm}")";; + *in) override_zmm="$(calc "$(sanitize "${override_z%in}")*25.4")";; + esac + hw_xmm=$(calc "(${override_xmm}*${ref_zmm})/${override_zmm}") + hw_ymm=$(calc "(${override_ymm}*${ref_zmm})/${override_zmm}") + fi + fi + hw_xdpi=$(calc "($hw_xpx*25.4)/$hw_xmm") hw_ydpi=$(calc "($hw_ypx*25.4)/$hw_ymm") |