2023-07-09 03:32:03 -06:00
|
|
|
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
|
|
|
|
# based on https://github.com/carrot69/keep-presence/
|
|
|
|
|
2023-07-09 09:30:11 -06:00
|
|
|
test -n "$XJIGGLER_DELAY_ACTION" \
|
|
|
|
|| XJIGGLER_DELAY_ACTION=300 # seconds
|
|
|
|
test -n "$XJIGGLER_DELAY_DETECTION" \
|
|
|
|
|| XJIGGLER_DELAY_DETECTION=60 # seconds
|
2023-07-09 09:39:37 -06:00
|
|
|
test -n "$XJIGGLER_KEYBOARD_ENABLED" \
|
|
|
|
|| XJIGGLER_KEYBOARD_ENABLED='' # zero-len nonzero-len
|
2023-07-09 09:30:11 -06:00
|
|
|
test -n "$XJIGGLER_MOUSE_DIRECTION" \
|
2023-07-10 06:08:06 -06:00
|
|
|
|| XJIGGER_MOUSE_DIRECTION=DIAGONAL # "CIRCULAR" "DIAGONAL"
|
2023-07-09 03:32:03 -06:00
|
|
|
test -n "$XJIGGLER_MOUSE_DISTANCE" \
|
|
|
|
|| XJIGGLER_MOUSE_DISTANCE=1 # pixels
|
2023-07-09 09:39:37 -06:00
|
|
|
test -n "$XJIGGLER_MOUSE_ENABLED" \
|
|
|
|
|| XJIGGLER_MOUSE_ENABLED=yes # zero-len nonzero-len
|
2023-07-09 03:32:03 -06:00
|
|
|
|
|
|
|
# eval is scary but this use was mentioned in the man page
|
|
|
|
getmouselocation(){
|
|
|
|
eval $(xdotool getmouselocation --shell | sed 's/^/XJIGGLER_/g')
|
|
|
|
XJIGGLER_T="$(date '+%s')"
|
|
|
|
}
|
|
|
|
|
|
|
|
jiggle(){
|
2023-07-10 06:08:06 -06:00
|
|
|
test -z "$XJIGGLER_MOUSE_ENABLED" \
|
|
|
|
|| xdotool mousemove_relative "$XJIGGLER_MOUSE_dX" \
|
|
|
|
"$XJIGGLER_MOUSE_dY"
|
2023-07-09 03:32:03 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
pushmouselocation(){
|
|
|
|
XJIGGLER_lastT="$XJIGGLER_T"
|
|
|
|
XJIGGLER_lastX="$XJIGGLER_X"
|
|
|
|
XJIGGLER_lastY="$XJIGGLER_Y"
|
|
|
|
}
|
|
|
|
|
|
|
|
printdebug(){
|
|
|
|
printf "XJIGGLER_T=%s\n" "$XJIGGLER_T" # seconds since epoch
|
|
|
|
printf "XJIGGLER_X=%s\n" "$XJIGGLER_X" # pixels
|
|
|
|
printf "XJIGGLER_Y=%s\n" "$XJIGGLER_Y" # pixels
|
|
|
|
printf "XJIGGLER_lastT=%s\n" "$XJIGGLER_lastT"
|
|
|
|
printf "XJIGGLER_lastX=%s\n" "$XJIGGLER_lastX"
|
|
|
|
printf "XJIGGLER_lastY=%s\n" "$XJIGGLER_lastY"
|
|
|
|
}
|
|
|
|
|
|
|
|
rotatemousedirection(){
|
2023-07-09 09:30:11 -06:00
|
|
|
case "$XJIGGLER_MOUSE_DIRECTION" in
|
2023-07-10 06:08:06 -06:00
|
|
|
up) XJIGGLER_MOUSE_DIRECTION=right
|
|
|
|
XJIGGLER_MOUSE_dX="$XJIGGLER_MOUSE_DISTANCE"
|
|
|
|
XJIGGLER_MOUSE_dY=0
|
|
|
|
return; ;;
|
|
|
|
right) XJIGGLER_MOUSE_DIRECTION=down
|
|
|
|
XJIGGLER_MOUSE_dX=0
|
|
|
|
XJIGGLER_MOUSE_dY="$XJIGGLER_MOUSE_DISTANCE"
|
|
|
|
return; ;;
|
|
|
|
down) XJIGGLER_MOUSE_DIRECTION=left
|
|
|
|
XJIGGLER_MOUSE_dX=-"$XJIGGLER_MOUSE_DISTANCE"
|
|
|
|
XJIGGLER_MOUSE_dY=0
|
|
|
|
return; ;;
|
|
|
|
CIRCULAR | left)
|
|
|
|
XJIGGLER_MOUSE_DIRECTION=up
|
|
|
|
XJIGGLER_MOUSE_dX=0
|
|
|
|
XJIGGLER_MOUSE_dY=-"$XJIGGLER_MOUSE_DISTANCE"
|
|
|
|
DIAGONAL | *)
|
|
|
|
XJIGGLER_MOUSE_dX="$XJIGGLER_MOUSE_DISTANCE"
|
|
|
|
XJIGGLER_MOUSE_dY="$XJIGGLER_MOUSE_DISTANCE"
|
|
|
|
return; ;;
|
|
|
|
return; ;;
|
2023-07-09 03:32:03 -06:00
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2023-07-09 09:30:11 -06:00
|
|
|
usage(){
|
2023-07-10 06:08:06 -06:00
|
|
|
printf 'Usage: %s (-chm) (-d [distance]) %s\n' \
|
|
|
|
"$0" '(-s [action delay seconds])'>&2
|
2023-07-09 09:30:11 -06:00
|
|
|
exit 64 # sysexits(3) EX_USAGE
|
|
|
|
}
|
|
|
|
|
2023-07-10 06:08:06 -06:00
|
|
|
while getopts :cd:hms: OPTION
|
2023-07-09 09:30:11 -06:00
|
|
|
do
|
|
|
|
case "$OPTION" in
|
2023-07-10 06:08:06 -06:00
|
|
|
c) XJIGGLER_MOUSE_DIRECTION=DIAGONAL ;;
|
|
|
|
d) XJIGGLER_MOUSE_DISTANCE="$OPTARG)" ;;
|
2023-07-09 09:39:37 -06:00
|
|
|
m) XJIGGLER_MOUSE_ENABLED='' ;;
|
2023-07-09 09:34:39 -06:00
|
|
|
s) XJIGGLER_DELAY_ACTION="$(OPTARG)" ;;
|
|
|
|
*) usage ;;
|
2023-07-09 09:30:11 -06:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
2023-07-09 03:32:03 -06:00
|
|
|
getmouselocation; pushmouselocation
|
|
|
|
|
|
|
|
while true
|
|
|
|
do
|
|
|
|
|
2023-07-09 09:30:11 -06:00
|
|
|
sleep "$XJIGGLER_DELAY_DETECTION"
|
2023-07-09 03:32:03 -06:00
|
|
|
getmouselocation
|
|
|
|
if test "$XJIGGLER_lastX" = "$XJIGGLER_X" \
|
|
|
|
&& test "$XJIGGLER_lastY" = "$XJIGGLER_Y"
|
|
|
|
then # no movement
|
2023-07-10 06:08:06 -06:00
|
|
|
command -v xprintidle \
|
|
|
|
&& test "$(xprintidle \
|
|
|
|
| sed -e 's/^/0/' -e 's/...$//')" \
|
|
|
|
-gt "$XJIGGLER_DELAY_ACTION" \
|
|
|
|
|| test "$(printf '%s\n%s\n-\np\n' "$XJIGGLER_T" \
|
2023-07-09 08:48:49 -06:00
|
|
|
"$XJIGGLER_lastT" \
|
2023-07-09 09:30:11 -06:00
|
|
|
| dc)" -gt "$XJIGGLER_DELAY_ACTION" \
|
2023-07-09 03:32:03 -06:00
|
|
|
|| continue # hasn't been long enough
|
|
|
|
rotatemousedirection; jiggle
|
|
|
|
printf '%s: Jiggled:\n' "$0"
|
|
|
|
printdebug | sed 's/^/\t/g'
|
2023-07-10 06:08:06 -06:00
|
|
|
getmouselocation
|
2023-07-09 03:32:03 -06:00
|
|
|
else # movement
|
|
|
|
printf '%s: Movement detected:\n' "$0"
|
|
|
|
printdebug | sed 's/^/\t/g'
|
|
|
|
fi
|
2023-07-10 06:08:06 -06:00
|
|
|
pushmouselocation
|
2023-07-09 03:32:03 -06:00
|
|
|
done >&2
|