Bir pencere işaretçi fobik nasıl yapılır?


15

İşaretçiyi hareket ettirmeye çalıştığımda pencere hareket etmeli. CCSM ile diğer pencerelerin "Her zaman Üstte" kalmak için tweaked bir "Analog Clock screenlet" ve "dosya ilerleme iletişim kutusu" var ama bazen bir şeyler yapmak engel olur.

Eğer bu mümkün değilse, o zaman doğrudan aşağıdaki uygulamaya tıklayabilmem için imleci hareket ettirdiğimde gizlenecekleri herhangi bir yöntem var mı?

Dahası bu mümkün değilse pencerelerin orada değilmiş gibi davranmasını sağlayabilir miyiz? Yani pencereyi göreceğim ama işaretçi onu tanımamalı ve altındaki uygulamada normal çalışmalıdır. Başvuruların şeffaflığını değiştireceğim ve mümkünse çalıştıracağım?


2
Bazı pencerelerin her zaman gösterilmesini istersiniz, ancak altlarındaki diğer pencerelerle etkileşime de izin vermelidir?
Anwar

Evet, tam olarak, işaretçiyi o pencereye hareket ettirdiğimde (örneğin "Her zaman üstte" etkin ") pencereyle (örneğin" Kopyala iletişim kutusu ") etkileşimde bulunmak istemiyorum. Ana pencere (üstte kalan pencere) bir Filigran gibi davranmalı (fikri anladınız mı?) veya işaretçiyi ona doğru hareket ettirdiğimde kenara çekilmelidir
Hemant Yadav

1
Bu alışılmadık bir istek olduğundan, kimsenin bunu yaptığını sanmıyorum. Ancak bu kesinlikle mümkündür, kullandığınız Pencere Yöneticisi için bir uzantı yazmanız gerekir (compiz, sanırım) . Alternatif olarak, bu pencereleri ayrı bir masaüstünde tutmayı ve "Super + some_number" ile masaüstleri arasında geçiş yapabilmeniz için kurulum tuşlarını kullanmayı düşündünüz. Bir seferde bir grup pencereyi açık tutmak için çok rahat.
Hi-Angel

1
Gnome Shell uzantısı "Workspaces To Dock", dock'un pencereleri atlatmak için bir seçeneğine sahiptir. Bu tam olarak sorulan şey değildir, ancak bunu nasıl başaracağınız hakkında bir fikir edinmek için oraya bakabilirsiniz: github.com/passingthru67/workspaces-to-dock .
Samuel

Süper kullanıcıda benzer soruya bir göz atın . Birisi,% 50'den daha az opaklığa sahip nesneleri
tıkanabilir

Yanıtlar:


2

Bash betiği ve xdotool == cursophobia.sh

Genel Bakış
Size uygun bir çözüm bulduğumu düşünüyorum. Bir pencere seçmenize izin veren bir bash betiğidir. Bir pencere seçildikten sonra, komut dosyası sürekli olarak pencereyi ve imleç konumlarını önceden tanımlanmış aralıklarla yoklar. İmleç çok yaklaşırsa, pencere yoldan çekilir.

Bağımlılık
Bu komut dosyası xdotool. Yüklemek için çalıştırınsudo apt-get install xdotool

Komut dosyası: cursophobia.sh
Aşağıdaki içeriklerle yeni bir bash betiği oluşturun ve çalıştırılabilir yapın.

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

En üstteki dört değişkeni beğeninize göre düzenlemeyi unutmayın. Bu komut dosyası CPU'nuzu görevlendiriyorsa, polldeğişkeni daha büyük bir değere yükseltmeyi deneyin .

cursophobia.sh çalışırken Betiğinizi
oluşturup çalıştırılabilir hale getirdikten sonra çalıştırın. Bir pencere seçmenizi isteyecektir. Cursophobic olmak istediğiniz pencereye tıklayın ve geri sayım bitene kadar bekleyin. Geri sayım sona erdiğinde, seçtiğiniz pencere cursophobic olacaktır. Pencerenin imleç korkusundan gelmesine yardımcı olmaya hazır olduğunuzda, terminal penceresini kapatın veya komut dosyasını terminal penceresinden Ctrl+c

Birden fazla ekran
Lütfen bunun cursophobic penceresini tek bir ekranla sınırladığını unutmayın. Birden fazla ekranda çalışmasını sağlayacak düzenlemelere açıkım.


Eğlenceli kısmı iyi; işe yarıyor. Ne yazık ki, işlemcimin işini tamamen yiyor (yaklaşık% 60). Bu nedenle olduğu gibi gerçek bir kullanışlı çözüm değildir.
Jacob Vlijm

@JacobVlijm, işlemciyi kolaylaştırmak için bazı değişiklikler yaptım. Denemek.
b_laoshi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.