Скрипт Bash и 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
Не забудьте отредактировать четыре переменные в самом верху по своему вкусу. Если этот скрипт выполняет задачи вашего процессора, попробуйте увеличить poll
переменную до большего значения.
cursophobia.sh в действии
После того, как вы создали сценарий и сделали его исполняемым, запустите его. Он попросит вас выбрать окно. Нажмите на окно, которое вы хотите быть русофобским и подождите, пока обратный отсчет не закончится. Как только обратный отсчет закончится, выбранное вами окно станет русофобским. Когда вы будете готовы помочь окну преодолеть страх перед курсорами, закройте окно терминала или убейте скрипт из окна терминала с помощью Ctrl+c
Несколько дисплеев
Пожалуйста, обратите внимание, что это ограничивает окрасофобное окно одним дисплеем. Я открыт для правок, которые заставили бы его работать на нескольких дисплеях.