Como fazer com que uma janela tenha fobia de ponteiro?

15

Quero dizer, a janela deve se mover sempre que eu tento mover o ponteiro sobre ela. Eu tenho um "Analog Clock screenlet" e "arquivo progresso caixa de diálogo" que eu tweaked para ficar "Sempre em cima" de outras janelas com CCSM, mas às vezes eles ficam no caminho de fazer as coisas.

Se isso não for possível, existe algum método para que eles se escondam quando eu movo o ponteiro sobre eles para que eu possa clicar no aplicativo diretamente abaixo?

Além disso, se isso não for possível, podemos fazer as janelas se comportarem como se não estivessem lá? Quer dizer, eu vou ver a janela, mas o ponteiro não deve reconhecê-lo e deve funcionar normalmente no aplicativo abaixo dele. Eu mudarei a transparência dos aplicativos e farei isso funcionar se isso for possível?

    
por Hemant Yadav 09.09.2016 / 13:55

1 resposta

2

Script bash e xdotool == cursophobia.sh

Visão geral
Eu acho que tenho uma solução que funcionará para você. É um script bash que permite selecionar uma janela. Quando uma janela é selecionada, o script continuamente pesquisa as posições da janela e do cursor em intervalos predefinidos. Se o cursor se aproximar demais, a janela sai do caminho.

Dependência
Este script depende do xdotool . Para instalar, execute sudo apt-get install xdotool

O script: cursophobia.sh
Crie um novo script bash com o seguinte conteúdo e torne-o executável.

#!/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

Não se esqueça de editar as quatro variáveis no topo ao seu gosto. Se esse script estiver sobrecarregando sua CPU, tente aumentar a variável poll para um valor maior.

cursophobia.sh em ação
Depois de criar seu script e torná-lo executável, execute-o. Ele pedirá para você selecionar uma janela. Clique na janela que você quer que seja cursofóbica e espere até que a contagem regressiva termine. Quando a contagem regressiva terminar, a janela selecionada será cursiva. Quando estiver pronto para ajudar a janela a superar o medo de cursores, feche a janela do terminal ou mate o script da janela do terminal com Ctrl + c

Vários monitores
Por favor, note que isto restringe a janela cursofóbica a um único display. Estou aberto a edições que funcionariam em vários monitores.

    
por b_laoshi 16.06.2017 / 08:59