Como fazer uma janela ter fobia de ponteiro?

Como fazer uma janela ter fobia de ponteiro?

Quero dizer, a janela deve se mover sempre que tento mover o ponteiro sobre ela. Eu tenho uma "tela de relógio analógico" e uma "caixa de diálogo de progresso de arquivo" que ajustei para ficar "sempre visível" de outras janelas com CCSM, mas às vezes elas atrapalham 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 com que as janelas se comportem como se não estivessem lá? Quer dizer, verei a janela, mas o ponteiro não deverá reconhecê-la e deverá funcionar normalmente no aplicativo abaixo dela. Vou mudar a transparência dos aplicativos e farei funcionar se isso for possível?

Responder1

Script Bash e xdotool == cursophobia.sh

Visão geral
Acho que tenho uma solução que funcionará para você. É um script bash que permite selecionar uma janela. Depois que uma janela é selecionada, o script pesquisa continuamente as posições da janela e do cursor em intervalos predefinidos. Se o cursor chegar muito perto, a janela sai do caminho.

Dependência
Este script depende do xdotool. Para instalar, executesudo 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 de acordo com sua preferência. Se este script estiver sobrecarregando sua CPU, tente aumentar a pollvariável para um valor maior.

cursophobia.sh em ação
Depois de criar seu script e torná-lo executável, execute-o. Ele solicitará que você selecione uma janela. Clique na janela que deseja tornar o cursofóbico e espere até que a contagem regressiva termine. Assim que a contagem regressiva terminar, a janela selecionada ficará cursorfóbica. Quando você estiver pronto para ajudar a janela a superar o medo dos cursores, feche a janela do terminal ou elimine o script da janela do terminal com Ctrl+c

Vários monitores
Observe que isso restringe a janela cursofóbica a uma única exibição. Estou aberto a edições que fariam com que funcionasse em vários monitores.

informação relacionada