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