배쉬 스크립트와 xdotool == cursophobia.sh
개요
귀하에게 적합한 솔루션이 있다고 생각합니다. 창을 선택할 수있는 bash 스크립트입니다. 창을 선택하면 스크립트 는 미리 정의 된 간격으로 창과 커서 위치를 계속 폴링합니다. 커서가 너무 가까워지면 창 밖으로 이동합니다.
종속성
이 스크립트는에 따라 다릅니다 xdotool
. 설치하려면sudo apt-get install xdotool
스크립트 : cursophobia.sh
다음 내용으로 새 bash 스크립트를 작성하고 실행 가능하게하십시오.
#!/bin/bash
windowSelectionDelay=5 # How long to wait for user to select a window?
buffer=10 # How close do we need to be to border to get scared?
jump=20 # How far do we jump away from pointer when scared?
poll=.25 # How often in seconds should we poll window and mouse?
# locations. Increasing poll should lighten CPU load.
# ask user which window to make phobic
for s in $(seq 0 $((windowSelectionDelay - 1)))
do
clear
echo "Activate the window that you want to be cursophobic: $((windowSelectionDelay - s))"
sleep 1
done
wID=$(xdotool getactivewindow)
# find some boundary info and adjustments
# determine where the window is now
info=$(xdotool getwindowgeometry $wID)
base=$(grep -oP "[\d]+,[\d]+" <<< "$info")
# move the window to 0 0 and get real location
xdotool windowmove $wID 0 0
info=$(xdotool getwindowgeometry $wID)
realMins=$(grep -oP "[\d]+,[\d]+" <<< "$info")
xMin=$(cut -f1 -d, <<< "$realMins")
yMin=$(cut -f2 -d, <<< "$realMins")
# find offset values for no movement. This is necessary because moving 0,0
# relative to the current position sometimes actually moves the window
xdotool windowmove --relative $wID 0 0
info=$(xdotool getwindowgeometry $wID)
diff=$(grep -oP "[\d]+,[\d]+" <<< "$info")
xOffset=$[xMin - $(cut -f1 -d, <<< "$diff")]
yOffset=$[yMin- $(cut -f2 -d, <<< "$diff")]
# move window back to original location
x=$(cut -f1 -d, <<< "$base")
y=$(cut -f2 -d, <<< "$base")
xdotool windowmove $wID $[x + xOffset] $[y + yOffset]
dispSize=$(xdotool getdisplaygeometry)
xMax=$(cut -f1 -d ' ' <<< "$dispSize")
yMax=$(cut -f2 -d ' ' <<< "$dispSize")
clear
echo "You can minimize this window, but don't close it, or your window will overcome its cursophobia"
# start an infinite loop polling to see if we need to move the window.
while :
do
# get information about where the window is
info=$(xdotool getwindowgeometry $wID)
position=$(grep -oP "[\d]+,[\d]+" <<< "$info")
geometry=$(grep -oP "[\d]+x[\d]+" <<< "$info")
height=$(cut -f2 -dx <<< "$geometry")
width=$(cut -f1 -dx <<< "$geometry")
top=$(cut -f2 -d, <<< "$position")
left=$(cut -f1 -d, <<< "$position")
bottom=$((top + height))
right=$((left + width))
# save mouse coordinates to x & y
eval "$(xdotool getmouselocation | cut -f 1-2 -d ' ' | tr ' :' '\n=')"
# If the mouse is too close to the window, move the window
if [ $x -gt $((left - buffer)) ] && [ $x -lt $((right + buffer)) ] && [ $y -gt $((top - buffer)) ] && [ $y -lt $((bottom + buffer)) ]; then
#figure out what side we're closest to so we know which direction to move the window
t="$((y - top)):0 $((jump + (y - top)))"
l="$((x - left)):$((jump + (x - left))) 0"
b="$((bottom - y)):0 -$((jump + (bottom - y)))"
r="$((right - x)):-$((jump + (right - x))) 0"
coord="$(echo -e "$t\n$l\n$b\n$r" | sort -n | head -n 1 | cut -f2 -d:)"
# set the offset values for x and y
newX=$(cut -f1 -d ' ' <<< "$coord")
newY=$(cut -f2 -d ' ' <<< "$coord")
#check to make sure we're not out of bounds
if [ $((right + newX)) -gt $xMax ]; then
newX=$((-1 * left + xOffset))
elif [ $((left + newX)) -lt $xMin ]; then
newX=$((xMax - width))
fi
if [ $((bottom + newY)) -gt $yMax ]; then
newY=$((-1 * top + yOffset))
elif [ $((top + newY)) -lt $yMin ]; then
newY=$((yMax - height))
fi
# move the window if it has focus
[ $(xdotool getactivewindow) -eq $wID ] && xdotool windowmove --relative $wID $((newX + xOffset)) $((newY + yOffset))
fi
sleep $poll
done
가장 좋아하는 네 가지 변수를 편집하는 것을 잊지 마십시오. 이 스크립트가 CPU를 작업하는 경우 poll
변수를 더 큰 값으로 늘리십시오 .
cursophobia.sh 작동
스크립트를 작성하고 실행 가능하게 만든 후에 실행하십시오. 창을 선택하라는 메시지가 표시됩니다. cursophobic되고 싶은 창을 클릭하고 카운트 다운이 끝날 때까지 기다립니다. 카운트 다운이 끝나면 선택한 창이 cursophobic이됩니다. 커서가 커서 두려워 질 가능성이있는 창을 도울 준비가되면 터미널 창을 닫거나 Ctrl+ 를 사용하여 터미널 창에서 스크립트를 종료하십시오.c
다중 디스플레이
이것은 cursophobic window를 단일 디스플레이로 제한합니다. 여러 디스플레이에서 작동하도록 편집 할 수 있습니다.