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
+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%$zoom || $XHEIGHT%$zoom )) in
+case $(( $XWIDTH%$div || $XHEIGHT%$div )) in
0) ;;
- *) echo >&2 "$0: zoom multiplier doesn't divide screen size"; exit 2 ;;
+ *) echo >&2 "$0: zoom divisor doesn't divide screen size"; exit 2 ;;
esac
{ read _
case $found in nil) echo >&2 "$0: pointer not on any screen?"; exit 2 ;; esac
-case $zoom in
+case $(( $mul == $div )) in
1) pan= ;;
*) pan="--panning ${XWIDTH}x${XHEIGHT}" ;;
esac
xrandr --fb ${XWIDTH}x${XHEIGHT} \
--output $name \
- --mode $(( $XWIDTH/$zoom ))x$(( $XHEIGHT/$zoom )) \
+ --mode $(( $mul*$XWIDTH/$div ))x$(( $mul*$XHEIGHT/$div )) \
$pan
KeyDown 5 Left area move -1 0
KeyDown 5 Right area move 1 0
KeyDown C5 1 exec xzoomscr 1
-KeyDown C5 2 exec xzoomscr 2
-KeyDown C5 3 exec xzoomscr 3
+KeyDown C5 2 exec xzoomscr 2/3
+KeyDown C5 3 exec xzoomscr 2
+KeyDown C5 4 exec xzoomscr 3
KeyDown C5 4 exec xzoomscr 4
KeyDown C5 a desk arrange
KeyDown C5 c cm start