Bagaimana cara membuat jendela menjadi penunjuk-fobia?

15

Maksud saya jendela harus bergerak setiap kali saya mencoba untuk memindahkan pointer di atasnya. Saya memiliki "Analog Clock clocklet" dan "file progress kotak dialog" yang saya tweak untuk tetap "Selalu di Atas" dari windows lain dengan CCSM tetapi kadang-kadang mereka menghalangi melakukan hal-hal.

Jika itu tidak mungkin, apakah ada metode apa pun sehingga mereka bersembunyi ketika saya memindahkan pointer pada mereka sehingga saya dapat mengklik aplikasi langsung di bawah ini?

Lebih lanjut jika itu tidak mungkin daripada kita dapat membuat windows berperilaku seolah-olah mereka tidak ada? Maksud saya, saya akan melihat jendela tetapi penunjuk tidak boleh mengenalinya dan harus bekerja secara normal pada aplikasi di bawahnya. Saya akan mengubah transparansi aplikasi dan akan membuatnya berfungsi jika memungkinkan?

Hemant Yadav
sumber
2
Anda ingin beberapa jendela selalu ditampilkan tetapi mereka juga harus memungkinkan berinteraksi dengan jendela lain di bawahnya?
Anwar
Ya persis, saya tidak ingin berinteraksi dengan itu (mis. "Salin kotak dialog" dengan "Selalu di atas" diaktifkan ") jendela (Bahkan tidak fokus pada jendela itu) ketika saya memindahkan pointer pada jendela itu. Saya hanya ingin Berinteraksi dengan jendela di bawahnya.Jendela utama (yang tetap di atas) harus bertindak seperti Tanda Air (Anda mendapatkan idenya?) atau bergerak ke samping ketika saya memindahkan pointer ke
arahnya
1
Karena ini permintaan yang tidak biasa, saya tidak berpikir ada orang yang melakukan itu. Tapi ini pasti mungkin, Anda harus menulis ekstensi untuk Window Manager yang Anda gunakan (compiz, kurasa) . Atau, apakah Anda dianggap hanya menyimpan windows itu di desktop yang terpisah, dan mengatur tombol sehingga dengan "Super + some_number" Anda bisa beralih antar desktop. Ini sangat nyaman untuk menjaga banyak jendela terbuka sekaligus.
Hi-Angel
1
Ekstensi Gnome Shell "Workspaces To Dock" memiliki opsi bagi dock untuk menghindari windows. Ini tidak persis seperti yang diminta, tetapi mungkin Anda bisa mencari di sana untuk mendapatkan ide tentang cara mencapai ini: github.com/passingthru67/workspaces-to-dock .
Samuel
Lihat pertanyaan serupa tentang pengguna super . Seseorang menyarankan ada fitur plugin compiz "Opacity, Brightness and Saturation" yang membuat objek dengan kurang dari 50% opacity click-throughable ...
Jan Stavěl

Jawaban:

2

Script Bash dan xdotool == cursophobia.sh

Gambaran Umum
Saya pikir saya punya solusi yang akan bekerja untuk Anda. Ini adalah skrip bash yang memungkinkan Anda memilih jendela. Setelah jendela dipilih, skrip terus-menerus memilih posisi jendela dan kursor pada interval yang telah ditentukan. Jika kursor terlalu dekat, jendela bergerak keluar dari jalan.

Ketergantungan
Skrip ini tergantung pada xdotool. Untuk menginstal, jalankansudo apt-get install xdotool

Script: cursophobia.sh
Buat skrip bash baru dengan konten berikut dan buatlah itu dapat dijalankan.

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

Jangan lupa untuk mengedit empat variabel di bagian paling atas sesuai dengan keinginan Anda. Jika skrip ini menugaskan CPU Anda, coba tingkatkan pollvariabel ke nilai yang lebih besar.

cursophobia.sh beraksi
Setelah Anda membuat skrip dan membuatnya dapat dieksekusi, jalankan. Ini akan meminta Anda untuk memilih jendela. Klik pada jendela yang Anda inginkan menjadi cursophobic dan tunggu sampai hitungan mundur berakhir. Setelah hitungan mundur selesai, jendela yang Anda pilih akan menjadi cursophobic. Saat Anda siap membantu jendela mengatasi rasa takut terhadap kursor, tutup jendela terminal atau bunuh skrip dari jendela terminal dengan Ctrl+c

Beberapa tampilan
Harap dicatat bahwa ini membatasi jendela cursophobic ke satu tampilan. Saya terbuka untuk pengeditan yang akan membuatnya berfungsi di beberapa tampilan.

b_laoshi
sumber
Bagian yang menyenangkan baik-baik saja; berhasil. Sayangnya, itu benar-benar memakan pekerjaan prosesor saya (sekitar 60%). Karena itu, ini bukan solusi yang bisa digunakan.
Jacob Vlijm
@ JacobVlijm, saya membuat beberapa perubahan untuk mempermudah prosesor. Cobalah.
b_laoshi