Wie macht man ein Fenster zeigerphobisch?


15

Ich meine, das Fenster sollte sich bewegen, wenn ich versuche, den Zeiger darauf zu bewegen. Ich habe ein "Analog Clock Screenlet" und ein "File Progress Dialogfeld", das ich optimiert habe, um "Always on Top" über andere Fenster mit CCSM zu bleiben, aber manchmal behindern sie die Arbeit.

Wenn dies nicht möglich ist, gibt es dann eine Methode, mit der sie ausgeblendet werden, wenn ich den Zeiger darauf setze, damit ich auf die Anwendung direkt darunter klicken kann?

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


2
Sie möchten, dass einige Fenster immer angezeigt werden, sie sollten jedoch auch die Interaktion mit anderen Fenstern unter ihnen ermöglichen?
Anwar

Ja, genau, ich möchte nicht mit diesem Fenster (z. B. "Dialogfeld kopieren" mit aktiviertem "Immer im Vordergrund") interagieren (nicht einmal auf dieses Fenster fokussieren), wenn ich den Mauszeiger in diesem Fenster bewege. Ich möchte nur interagieren Das Hauptfenster (eines, das oben bleibt) sollte sich wie ein Wasserzeichen verhalten (Sie haben die Idee?) oder sich zur Seite bewegen, wenn ich den Zeiger dorthin bewege.
Hemant Yadav

1
Da es eine ungewöhnliche Bitte ist, glaube ich nicht, dass das jemand getan hat. Aber dies ist definitiv möglich. Sie müssen eine Erweiterung für den von Ihnen verwendeten Fenstermanager schreiben (compiz, denke ich) . Alternativ haben Sie überlegt, diese Fenster nur auf einem separaten Desktop zu belassen und die Schlüssel so einzurichten, dass Sie mit "Super + some_number" zwischen den Desktops wechseln können. Es ist sehr bequem, um mehrere Fenster gleichzeitig geöffnet zu halten.
Hi-Angel

1
Die Gnome-Shell-Erweiterung "Workspaces To Dock" bietet eine Option, mit der das Dock Fenstern ausweichen kann. Dies ist nicht genau das, was gefragt wird, aber vielleicht können Sie sich dort eine Vorstellung davon verschaffen, wie dies erreicht werden kann: github.com/passingthru67/workspaces-to-dock .
Samuel

Schauen Sie sich eine ähnliche Frage zum Superuser an . Jemand schlägt vor, dass es eine Funktion des Compiz-Plugins "Opazität, Helligkeit und Sättigung" gibt, die Objekte mit weniger als 50% Opazität durchklickbar macht ...
Jan Stavěl

Antworten:


2

Bash-Skript und xdotool == cursophobia.sh

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

Abhängigkeit
Dieses Skript ist abhängig von der xdotool. Führen Sie zum Installieren Folgendes aussudo 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 pollin einen Task versetzt, erhöhen Sie die Variable auf einen größeren Wert.

cursophobia.sh in Aktion
Wenn 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, in dem Sie Cursophobic betreiben möchten, und warten Sie, bis der Countdown abgelaufen ist. Sobald der Countdown abgelaufen ist, ist das ausgewählte Fenster kursophob. Wenn Sie dem Fenster helfen möchten, die Angst vor Cursorn zu überwinden, schließen Sie das Terminalfenster oder beenden Sie das Skript im Terminalfenster mit Ctrl+c

Mehrere Anzeigen
Bitte beachten Sie, dass dies das kursophobe Fenster auf eine einzelne Anzeige beschränkt. Ich bin offen für Änderungen, die es über mehrere Bildschirme hinweg ermöglichen würden.


Der lustige Teil ist in Ordnung; Es klappt. Leider verschlingt es die Arbeit meines Prozessors (ungefähr 60%). Es ist daher keine wirklich brauchbare Lösung.
Jacob Vlijm

@JacobVlijm, ich habe einige Änderungen vorgenommen, um den Prozessor zu schonen. Versuch es.
b_laoshi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.