Comment rendre une fenêtre phobique?

15

Je veux dire que la fenêtre doit se déplacer chaque fois que j'essaie de déplacer le pointeur dessus. J'ai un "screenlet d'horloge analogique" et une "boîte de dialogue de progression de fichier" que j'ai peaufiné pour rester "toujours au top" des autres fenêtres avec CCSM mais parfois elles gênent les choses.

Si ce n'est pas possible, existe-t-il une méthode pour qu'ils se cachent lorsque je déplace le pointeur dessus afin que je puisse cliquer sur l'application directement en dessous?

De plus, si cela n'est pas possible, pouvons-nous faire en sorte que les fenêtres se comportent comme si elles n'étaient pas là? Je veux dire que je verrai la fenêtre mais le pointeur ne devrait pas le reconnaître et devrait fonctionner normalement sur l'application en dessous. Je vais changer la transparence des applications et la faire fonctionner si c'est possible?

Hemant Yadav
la source
2
Vous voulez que certaines fenêtres soient toujours affichées, mais elles devraient également permettre d'interagir avec d'autres fenêtres en dessous?
Anwar
Oui exactement, je ne veux pas interagir avec cette fenêtre (par exemple, "Copier la boîte de dialogue" avec "Toujours en haut" activé ") (même pas se concentrer sur cette fenêtre) lorsque je déplace le pointeur sur cette fenêtre. Je veux juste interagir avec la fenêtre en dessous. La fenêtre principale (celle qui reste en haut) devrait se comporter comme un filigrane (vous avez l'idée?) ou s'écarter lorsque je déplace le pointeur vers elle.
Hemant Yadav
1
Comme il s'agit d'une demande inhabituelle, je ne pense pas que quiconque l'ait fait. Mais c'est certainement possible, vous devez écrire une extension pour le gestionnaire de fenêtres que vous utilisez (compiz, je suppose) . Sinon, avez-vous envisagé de simplement conserver ces fenêtres sur un bureau séparé et de configurer les clés afin qu'avec "Super + some_number" vous puissiez basculer entre les bureaux. Il est très confortable pour garder un tas de fenêtres ouvertes à la fois.
Hi-Angel
1
L'extension Gnome Shell "Workspaces To Dock" a une option permettant au dock d'esquiver les fenêtres. Ce n'est pas exactement ce qui est demandé, mais peut-être pourriez-vous y regarder pour avoir une idée sur la façon d'y parvenir: github.com/passingthru67/workspaces-to-dock .
Samuel
Jetez un œil à une question similaire sur le superutilisateur . Quelqu'un suggère qu'il existe une fonctionnalité du plugin compiz "Opacity, Brightness and Saturation" qui rend les objets avec moins de 50% d'opacité cliquables ...
Jan Stavěl

Réponses:

2

Script Bash et xdotool == cursophobia.sh

Aperçu
Je pense avoir une solution qui fonctionnera pour vous. Il s'agit d'un script bash qui vous permet de sélectionner une fenêtre. Une fois qu'une fenêtre est sélectionnée, le script interroge en continu les positions des fenêtres et des curseurs à des intervalles prédéfinis. Si le curseur se rapproche trop, la fenêtre s'éloigne.

Dépendance
Ce script dépend de la xdotool. Pour installer, exécutezsudo apt-get install xdotool

Le script: cursophobia.sh
Créez un nouveau script bash avec le contenu suivant et rendez-le exécutable.

#!/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'oubliez pas de modifier les quatre variables tout en haut à votre convenance. Si ce script charge votre CPU, essayez d'augmenter la pollvariable à une valeur plus élevée.

cursophobia.sh en action
Une fois que vous avez créé votre script et l'avez rendu exécutable, exécutez-le. Il vous demandera de sélectionner une fenêtre. Cliquez sur la fenêtre que vous voulez être cursophobe et attendez la fin du compte à rebours. Une fois le compte à rebours terminé, la fenêtre que vous sélectionnez sera cursophobe. Lorsque vous êtes prêt à aider la fenêtre à surmonter sa peur des curseurs, fermez la fenêtre du terminal ou tuez le script de la fenêtre du terminal avec Ctrl+c

Affichages multiples
Veuillez noter que cela limite la fenêtre cursophobe à un seul affichage. Je suis ouvert aux modifications qui pourraient le faire fonctionner sur plusieurs écrans.

b_laoshi
la source
La partie amusante est très bien; Ça marche. Malheureusement, il mange totalement l'occupation de mon processeur (environ 60%). Ce n'est donc pas une vraie solution utilisable telle quelle.
Jacob Vlijm
@JacobVlijm, j'ai apporté quelques modifications pour alléger le processeur. Essaye le.
b_laoshi