Как заставить окно быть страдающим фобией указателем?

Я подразумеваю, что окно должно переместиться каждый раз, когда я пытаюсь переместить указатель в него. У меня есть "Аналоговые Часы screenlet" и "диалоговое окно прогресса файла", которое я настроил для пребывания "Поверх остальных окон" других окон с CCSM, но иногда они мешают выполнению вещей.

Если это не возможно, затем там какой-либо метод так, чтобы они скрылись, когда я перемещаю указатель в них так, чтобы я мог нажать на приложение непосредственно ниже?

Далее, если это не возможно, чем мы можем заставить окна вести себя, как будто они не там? Я подразумеваю, что буду видеть окно, но указатель не должен распознавать его и должен обычно работать над приложением ниже его. Я изменю прозрачность приложений и заставлю ее работать, если это будет возможно?

15
задан 9 September 2016 в 05:29

1 ответ

Сценарий Bash и xdotool == обзор
cursophobia.sh

, я думаю, что у меня есть решение, которое будет работать на Вас. Это - сценарий удара, который позволяет Вам выбирать окно. После того как окно выбрано, сценарий <забастовка> непрерывно опрашивает положения окна и позиции курсора в предопределенных интервалах. Если курсор становится слишком близким, перемещения окна из пути.

Зависимость
Этот сценарий зависит от xdotool. Для установки работайте sudo apt-get install xdotool

сценарий: cursophobia.sh
Создает новый сценарий удара со следующим содержанием и делает его исполняемым файлом.

#!/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 в действии
, После того как Вы создали свой сценарий и сделали его исполняемым файлом, выполнили его. Это попросит, чтобы Вы выбрали окно. Нажмите на окно, Вы хотите быть cursophobic и ожидать, пока обратный отсчет не закончен. После того как обратный отсчет закончен, окно, которое Вы выбираете, будет cursophobic. Когда Вы готовы помочь окну по прибывшему его страх перед курсорами, закрыть окно терминала или уничтожить сценарий из окна терминала с Ctrl + c

Несколько дисплеев
Обратите внимание на то, что, это ограничивает cursophobic окно единственным дисплеем. Я открыт для редактирований, которые заставили бы его работать через несколько дисплеев.

2
ответ дан 23 November 2019 в 02:50

Другие вопросы по тегам:

Похожие вопросы: