Как сделать окно фотороботом?

15

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

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

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

Хемант Ядав
источник
2
Вы хотите, чтобы какое-то окно всегда отображалось, но оно также должно позволять взаимодействовать с другими окнами под ними?
Анвар
Да, именно, я не хочу взаимодействовать с этим окном (например, «Копировать диалоговое окно» с «Всегда сверху», включенным ») (даже не фокусироваться на этом окне), когда я перемещаю указатель на это окно. Я просто хочу Взаимодействовать с окном под ним. Главное окно (которое остается сверху) должно действовать как водяной знак (вы понимаете?) или отодвигаться в сторону, когда я перемещаю указатель на него
Хемант Ядав
1
Поскольку это необычная просьба, я не думаю, что кто-то сделал это. Но это определенно возможно, вам нужно написать расширение для используемого вами оконного менеджера (я думаю, compiz) . В качестве альтернативы, вы решили просто сохранить эти окна на отдельном рабочем столе и установить ключи, чтобы с помощью «Super + some_number» можно было переключаться между рабочими столами. Это очень удобно для одновременного открытия нескольких окон.
Привет, Ангел,
1
Расширение Gnome Shell «Workspaces To Dock» имеет опцию, позволяющую доку избегать окон. Это не совсем то, о чем спрашивают, но, возможно, вы могли бы заглянуть туда, чтобы получить представление о том, как этого добиться: github.com/passingthru67/workspaces-to-dock .
Самуил
Посмотрите на аналогичный вопрос на суперпользователя . Кто-то предполагает, что есть особенность плагина compiz «Непрозрачность, Яркость и Насыщенность», которая делает объекты с непрозрачностью менее 50% кликабельными ...
Jan Stavěl

Ответы:

2

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

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

b_laoshi
источник
Забавная часть в порядке; оно работает. К сожалению, это полностью съедает мой процессор (около 60%). Поэтому оно не является реальным пригодным для использования решением.
Джейкоб Влейм
@JacobVlijm, я внес некоторые изменения, чтобы облегчить работу процессора. Попробуйте это.
b_laoshi