Tập lệnh Bash và xdotool == cursophobia.sh
Tổng quan
Tôi nghĩ rằng tôi có một giải pháp sẽ làm việc cho bạn. Nó là một tập lệnh bash cho phép bạn chọn một cửa sổ. Khi một cửa sổ được chọn, tập lệnh sẽ liên tục thăm dò các vị trí cửa sổ và con trỏ theo các khoảng thời gian được xác định trước. Nếu con trỏ quá gần, cửa sổ sẽ di chuyển ra khỏi đường.
Phụ thuộc
kịch bản này phụ thuộc vào xdotool
. Để cài đặt, chạysudo apt-get install xdotool
Kịch bản: cursophobia.sh
Tạo một tập lệnh bash mới với các nội dung sau và làm cho nó có thể thực thi được.
#!/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
Đừng quên chỉnh sửa bốn biến ở trên cùng theo ý thích của bạn. Nếu tập lệnh này đang làm nhiệm vụ cho CPU của bạn, hãy thử tăng poll
biến lên giá trị lớn hơn.
cursophobia.sh trong hành động
Một khi bạn đã tạo tập lệnh của mình và làm cho nó có thể thực thi được, hãy chạy nó. Nó sẽ yêu cầu bạn chọn một cửa sổ. Nhấp vào cửa sổ mà bạn muốn bị nguyền rủa và đợi cho đến khi đếm ngược kết thúc. Khi quá trình đếm ngược kết thúc, cửa sổ bạn chọn sẽ bị nhiễu. Khi bạn đã sẵn sàng để giúp cửa sổ vượt qua nỗi sợ con trỏ, hãy đóng cửa sổ đầu cuối hoặc tắt tập lệnh từ cửa sổ đầu cuối bằng Ctrl+c
Nhiều màn hình
Xin lưu ý rằng điều này hạn chế cửa sổ chữ thảo ở một màn hình duy nhất. Tôi mở các chỉnh sửa để làm cho nó hoạt động trên nhiều màn hình.