bin/xzoomscr, dot/e16-bindings: Allow fractional zooming.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 18 Mar 2023 14:12:11 +0000 (14:12 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 18 Mar 2023 14:12:11 +0000 (14:12 +0000)
This works and is useful.  Add a fractional zoom setting to the hotkeys
and shift the others along.

bin/xzoomscr
dot/e16-bindings

index b9551d8..eaf6254 100755 (executable)
@@ -4,22 +4,32 @@ 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 _
@@ -40,12 +50,12 @@ EOF
 
 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
index 593c35c..6280c30 100644 (file)
@@ -42,8 +42,9 @@ KeyDown   5      Down area move 0 1
 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