Come rendere una finestra essere puntatore-fobico?


15

Voglio dire, la finestra dovrebbe spostarsi ogni volta che provo a spostare il puntatore su di essa. Ho un "Analog Clock screenlet" e "finestra di dialogo di avanzamento dei file" che ho ottimizzato per rimanere "Sempre in primo piano" di altre finestre con CCSM ma a volte si intromettono nel fare le cose.

Se ciò non è possibile, allora c'è qualche metodo in modo che si nascondano quando sposto il puntatore su di loro in modo da poter fare clic sull'applicazione direttamente sotto?

Inoltre, se ciò non è possibile, possiamo far sì che le finestre si comportino come se non ci fossero? Voglio dire, vedrò la finestra ma il puntatore non dovrebbe riconoscerla e dovrebbe funzionare normalmente sull'applicazione sottostante. Cambierò la trasparenza delle applicazioni e la farò funzionare se possibile?


2
Vuoi che venga sempre mostrata una finestra ma dovrebbero anche consentire l'interazione con altre finestre sottostanti?
Anwar,

Sì, esattamente, non voglio interagire con quella finestra (ad es. "Copia finestra di dialogo" con "Sempre in primo piano" abilitato ") (Non mi concentro nemmeno su quella finestra) quando sposto il puntatore su quella finestra. Voglio solo interagire con la finestra sottostante. La finestra principale (quella che rimane in alto) dovrebbe agire come una filigrana (hai capito?) o spostarsi di lato quando sposto il puntatore verso di essa.
Hemant Yadav

1
Poiché è una richiesta insolita, non penso che nessuno l'abbia fatto. Ma questo è sicuramente possibile, dovresti scrivere un'estensione per il Window Manager che usi (compiz, immagino) . In alternativa, hai considerato di mantenere quelle finestre su un desktop separato e di impostare le chiavi in ​​modo che con "Super + some_number" sia possibile passare da un desktop all'altro. È molto comodo per tenere aperte molte finestre alla volta.
Ciao Angelo

1
L'estensione di Gnome Shell "Workspaces To Dock" ha un'opzione per il dock per schivare le finestre. Questo non è esattamente ciò che viene chiesto, ma forse potresti guardare lì per avere un'idea su come raggiungere questo obiettivo: github.com/passingthru67/workspaces-to-dock .
Samuel,

Dai un'occhiata a una domanda simile sul superutente . Qualcuno suggerisce che esiste una funzionalità del plug-in Compiz "Opacità, luminosità e saturazione" che rende gli oggetti con meno del 50% di opacità selezionabili tramite clic ...
Jan Stavěl

Risposte:


2

Bash script e xdotool == cursophobia.sh

Panoramica
Penso di avere una soluzione che funzionerà per te. È uno script bash che ti permette di selezionare una finestra. Una volta selezionata una finestra, lo script esegue il polling continuo della finestra e delle posizioni del cursore a intervalli predefiniti. Se il cursore si avvicina troppo, la finestra si sposta di lato.

Dipendenza
Questo script dipende dal xdotool. Per installare, eseguiresudo apt-get install xdotool

Lo script: cursophobia.sh
Crea un nuovo script bash con i seguenti contenuti e rendilo eseguibile.

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

Non dimenticare di modificare le quattro variabili in alto a tuo piacimento. Se questo script sta assegnando un compito alla tua CPU, prova ad aumentare la pollvariabile a un valore maggiore.

cursophobia.sh in azione
Dopo aver creato il tuo script e averlo reso eseguibile, eseguilo . Ti chiederà di selezionare una finestra. Fare clic sulla finestra che si desidera essere cursofobici e attendere fino al termine del conto alla rovescia. Al termine del conto alla rovescia, la finestra selezionata sarà cursofobica. Quando sei pronto per aiutare la finestra a superare la paura dei cursori, chiudi la finestra del terminale o uccidi lo script dalla finestra del terminale con Ctrl+c

Display multipli
Si noti che ciò limita la finestra cursofobica a un singolo display. Sono aperto alle modifiche che lo farebbero funzionare su più schermi.


La parte divertente va bene; Funziona. Sfortunatamente, mangia totalmente l'occupazione del mio processore (circa il 60%). Pertanto non è una vera soluzione utilizzabile così com'è.
Jacob Vlijm,

@JacobVlijm, ho apportato alcune modifiche per semplificare il processore. Provalo.
b_laoshi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.