Wie kann man ein Fenster zeigerphobisch machen?

Wie kann man ein Fenster zeigerphobisch machen?

Ich meine, das Fenster sollte sich bewegen, wenn ich versuche, den Zeiger darauf zu bewegen. Ich habe ein „Analoguhr-Screenlet“ und ein „Dateifortschrittsdialogfeld“, die ich so optimiert habe, dass sie mit CCSM „immer im Vordergrund“ anderer Fenster bleiben, aber manchmal behindern sie die Arbeit.

Wenn das nicht möglich ist, gibt es dann eine Methode, sie auszublenden, wenn ich den Zeiger darüber bewege, sodass ich direkt darunter auf die Anwendung klicken kann?

Und wenn das nicht möglich ist, können wir dann dafür sorgen, dass sich die Fenster so verhalten, als wären sie nicht da? Ich meine, ich werde das Fenster sehen, aber der Zeiger sollte es nicht erkennen und bei der darunterliegenden Anwendung normal funktionieren. Ich werde die Transparenz der Anwendungen ändern und dafür sorgen, dass es funktioniert, wenn das möglich ist?

Antwort1

Bash-Skript und xdotool == cursophobia.sh

Überblick
Ich glaube, ich habe eine Lösung, die für Sie funktioniert. Es handelt sich um ein Bash-Skript, mit dem Sie ein Fenster auswählen können. Sobald ein Fenster ausgewählt ist, fragt das Skript in vordefinierten Intervallen kontinuierlich Fenster- und Cursorpositionen ab. Wenn der Cursor zu nahe kommt, wird das Fenster aus dem Weg geräumt.

Abhängigkeit
Dieses Skript ist abhängig von xdotool. Zur Installation führen Siesudo apt-get install xdotool

Das Skript: cursophobia.sh
Erstellen Sie ein neues Bash-Skript mit folgendem Inhalt und machen Sie es ausführbar.

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

Vergessen Sie nicht, die vier Variablen ganz oben nach Ihren Wünschen zu bearbeiten. Wenn dieses Skript Ihre CPU überlastet, versuchen Sie, die pollVariable auf einen höheren Wert zu erhöhen.

cursophobia.sh in Aktion
Sobald Sie Ihr Skript erstellt und ausführbar gemacht haben, führen Sie es aus. Sie werden aufgefordert, ein Fenster auszuwählen. Klicken Sie auf das Fenster, das Sie kursorphob machen möchten, und warten Sie, bis der Countdown abgelaufen ist. Sobald der Countdown abgelaufen ist, wird das von Ihnen ausgewählte Fenster kursorphob. Wenn Sie bereit sind, dem Fenster dabei zu helfen, seine Angst vor Cursorn zu überwinden, schließen Sie das Terminalfenster oder beenden Sie das Skript aus dem Terminalfenster mit Ctrl+c

Mehrere Anzeigen
Bitte beachten Sie, dass das Cursor-Phobie-Fenster dadurch auf eine einzige Anzeige beschränkt wird. Ich bin offen für Änderungen, die es auf mehreren Anzeigen funktionieren lassen.

verwandte Informationen