#! /bin/sh -e case $# in 1) ;; *) echo >&2 "usage: $1 ZOOM"; exit 2 ;; esac zoom=$1 ok=nil case $zoom in */*/*) ;; *[!0-9/]*) ;; */*) ok=t mul=${zoom%/*} div=${zoom#*/} ;; *) ok=t mul=1 div=$zoom ;; esac case $ok in nil) echo >&2 "$0: bad zoom $zoom"; exit 2 ;; esac case $(( $mul > $div )) in 1) echo >&2 "$0: zoom too high"; exit 2 ;; esac ok=nil case ${DISPLAY-nil} in *:*[!0-9.]*) ;; *:*.*.*) ;; *:*.*) ok=t dpybase=${DISPLAY%.*} ;; *:*) ok=t dpybase=$DISPLAY ;; esac case $ok in nil) echo >&2 "$0: bad DISPLAY"; exit 2 ;; esac set -- $(xqueryptr); scr=$1 x=$2 y=$3 DISPLAY=$dpybase.$scr; export DISPLAY eval $(xscsize -b) case $(( $XWIDTH%$div || $XHEIGHT%$div )) in 0) ;; *) echo >&2 "$0: zoom divisor doesn't divide screen size"; exit 2 ;; esac { read _ found=nil while read _ _ respos name; do res=${respos%%+*} pos=${respos#*+} ww=${res%x*} hh=${res#*x} w=${ww%/*} h=${hh%/*} x0=${pos%+*} y0=${pos#*+} x1=$(( $x0 + $w )) y1=$(( $y0 + $h )) case $(( $x0 <= $x && $x < $x1 && $y0 <= $y && $y < $y1 )) in 1) found=t; break ;; esac done } <&2 "$0: pointer not on any screen?"; exit 2 ;; esac case $(( $mul == $div )) in 1) pan= ;; *) pan="--panning ${XWIDTH}x${XHEIGHT}" ;; esac xrandr --fb ${XWIDTH}x${XHEIGHT} \ --output $name \ --mode $(( $mul*$XWIDTH/$div ))x$(( $mul*$XHEIGHT/$div )) \ $pan