Jak sprawić, by okno było wskaźnikowo-fobiczne?


15

Mam na myśli, że okno powinno się poruszać za każdym razem, gdy próbuję przesunąć na nim wskaźnik. Mam „ekran zegara analogowego” i „okno dialogowe postępu pliku”, które poprawiłem, aby pozostały „Zawsze na wierzchu” innych okien z CCSM, ale czasami przeszkadzają w działaniu.

Jeśli nie jest to możliwe, czy istnieje jakaś metoda, która ukryłaby się, gdy przesunę na nich wskaźnik, aby móc kliknąć aplikację bezpośrednio poniżej?

Co więcej, jeśli nie jest to możliwe, czy możemy sprawić, że okna będą zachowywać się tak, jakby ich nie było? Mam na myśli, że zobaczę okno, ale wskaźnik nie powinien go rozpoznać i powinien normalnie działać w aplikacji poniżej. Zmienię przezroczystość aplikacji i sprawię, że będzie działać, jeśli to możliwe?


2
Chcesz, aby niektóre okna były zawsze wyświetlane, ale powinny również umożliwiać interakcję z innymi oknami pod nimi?
Anwar

Tak, dokładnie, nie chcę wchodzić w interakcje z tym oknem (np. „Okno dialogowe kopiowania” z oknem „Zawsze na wierzchu” włączone)) (nawet nie skupiać się na tym oknie), kiedy poruszam wskaźnikiem w tym oknie. Chcę tylko wejść w interakcję z oknem poniżej. Główne okno (jedno, które pozostaje na górze) powinno działać jak znak wodny (masz pomysł?) lub odsunąć się na bok, gdy przesunę do niego wskaźnik
Hemant Yadav

1
Ponieważ jest to niezwykła prośba, nie sądzę, że ktoś to zrobił. Ale jest to zdecydowanie możliwe, musisz napisać rozszerzenie dla używanego Menedżera okien (wydaje mi się, że to compiz) . Ewentualnie, czy zastanawiałeś się nad tym, aby po prostu zachować te okna na osobnym pulpicie i skonfigurować klucze, aby za pomocą „Super + liczba_numerów” można było przełączać się między pulpitami. Jest to bardzo wygodne, aby jednocześnie otwierać kilka okien.
Cześć Anioł

1
Rozszerzenie Gnome Shell „Workspaces To Dock” ma opcję pozwalającą stacji dokującej na uniknięcie okien. Nie jest to dokładnie to, o co pytamy , ale może możesz poszukać tam, aby dowiedzieć się, jak to osiągnąć: github.com/passingthru67/workspaces-to-dock .
Samuel

Zobacz podobne pytanie na temat administratora . Ktoś sugeruje, że istnieje funkcja wtyczki compiz „Krycie, jasność i nasycenie”, która umożliwia klikanie obiektów o mniej niż 50% krycia ...
Jan Stavěl

Odpowiedzi:


2

Skrypt Bash i xdotool == cursophobia.sh

Przegląd
Myślę, że mam rozwiązanie, które będzie dla ciebie odpowiednie. Jest to skrypt bash, który pozwala wybrać okno. Po wybraniu okna skrypt nieprzerwanie sprawdza pozycje okna i kursora w określonych odstępach czasu. Jeśli kursor zbliży się zbyt blisko, okno odsunie się na bok.

Zależność
Ten skrypt zależy od xdotool. Aby zainstalować, uruchomsudo apt-get install xdotool

Skrypt: cursophobia.sh
Utwórz nowy skrypt bash z następującą zawartością i uczyń go wykonywalnym.

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

Nie zapomnij edytować czterech zmiennych według własnych upodobań. Jeśli skrypt wykonuje zadanie na twoim CPU, spróbuj zwiększyć pollzmienną do większej wartości.

cursophobia.sh w akcji
Po utworzeniu skryptu i uruchomieniu go, uruchom go. Poprosi Cię o wybranie okna. Kliknij okno, w którym chcesz być kursofobiczny i poczekaj, aż odliczanie dobiegnie końca. Po zakończeniu odliczania okno, które wybierzesz, będzie kursofobiczne. Gdy jesteś gotowy, aby pomóc temu okno przestraszyć się kursorami, zamknij okno terminalu lub zabij skrypt z okna terminalu za pomocą Ctrl+c

Wiele ekranów
Należy pamiętać, że ogranicza to okno cursophobic do jednego ekranu. Jestem otwarty na zmiany, które sprawiłyby, że działałby na wielu ekranach.


Zabawna część jest w porządku; to działa. Niestety całkowicie zjada zajęcie mojego procesora (około 60%). Dlatego nie jest to prawdziwe użyteczne rozwiązanie.
Jacob Vlijm,

@JacobVlijm, wprowadziłem kilka zmian, aby ułatwić procesor. Wypróbuj to.
b_laoshi,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.