Как сделать так, чтобы окно не боялось указателя?

Как сделать так, чтобы окно не боялось указателя?

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

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

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

решение1

Скрипт 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

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

Связанный контент