chiark / gitweb /
bin/xzoomscr: New script and bindings to control XRANDR zoomy panny stuff.
[profile] / bin / xzoomscr
1 #! /bin/sh -e
2
3 case $# in 1) ;; *) echo >&2 "usage: $1 ZOOM"; exit 2 ;; esac
4 zoom=$1
5
6 ok=nil
7 case ${DISPLAY-nil} in
8   *:*[!0-9.]*) ;;
9   *:*.*.*) ;;
10   *:*.*) ok=t dpybase=${DISPLAY%.*} ;;
11   *:*) ok=t dpybase=$DISPLAY ;;
12 esac
13 case ok in nil) echo >&2 "$0: bad DISPLAY"; exit 2 ;; esac
14
15 set -- $(xqueryptr); scr=$1 x=$2 y=$3
16 DISPLAY=$dpybase.$scr; export DISPLAY
17
18 eval $(xscsize -b)
19
20 case $(( $XWIDTH % $zoom || XHEIGHT % $zoom )) in
21   0) ;;
22   *) echo >&2 "$0: zoom multiplier doesn't divide screen size"; exit 2 ;;
23 esac
24
25 { read _
26   found=nil
27   while read _ _ respos name; do
28     res=${respos%%+*} pos=${respos#*+}
29     ww=${res%x*} hh=${res#*x}
30     w=${ww%/*} h=${hh%/*}
31     x0=${pos%+*} y0=${pos#*+}
32     x1=$(( $x0 + $w )) y1=$(( $y0 + $h ))
33     case $(( $x0 <= $x && $x < $x1 && $y0 <= $y && $y < $y1 )) in
34       1) found=t; break ;;
35     esac
36   done
37 } <<EOF
38 $(xrandr --listmonitors)
39 EOF
40
41 case $found in nil) echo >&2 "$0: pointer not on any screen?"; exit 2 ;; esac
42
43 case $zoom in
44   1) pan= ;;
45   *) pan="--panning ${XWIDTH}x${XHEIGHT}" ;;
46 esac
47
48 xrandr --fb ${XWIDTH}x${XHEIGHT} \
49         --output $name \
50         --mode $(( $XWIDTH/$zoom ))x$(( $XHEIGHT/$zoom )) \
51         $pan