วิธีทำให้หน้าต่างเป็นตัวชี้แบบ phobic


15

ฉันหมายถึงหน้าต่างควรเลื่อนไปมาทุกครั้งที่ฉันพยายามย้ายตัวชี้ไป ฉันมี "นาฬิกาอะนาล็อกนาฬิกาหน้าจอ" และ "กล่องโต้ตอบความคืบหน้าของไฟล์" ซึ่งฉันปรับแต่งเพื่อให้ "อยู่ด้านบนเสมอ" ของหน้าต่างอื่น ๆ ด้วย CCSM แต่บางครั้งพวกเขาก็สามารถทำสิ่งต่าง ๆ ได้

หากไม่สามารถทำได้มีวิธีใดบ้างที่จะซ่อนเมื่อฉันย้ายตัวชี้ไปที่พวกเขาเพื่อให้ฉันสามารถคลิกที่แอปพลิเคชันด้านล่างได้โดยตรง

ยิ่งกว่านั้นถ้าเป็นไปไม่ได้ที่เราจะทำให้หน้าต่างทำงานเหมือนกับว่าพวกเขาไม่ได้อยู่ที่นั่น? ฉันหมายถึงฉันจะเห็นหน้าต่าง แต่ตัวชี้ไม่ควรรู้จักและควรทำงานตามปกติในแอปพลิเคชันด้านล่าง ฉันจะเปลี่ยนความโปร่งใสของแอปพลิเคชันและจะทำให้มันใช้งานได้ถ้าเป็นไปได้?


2
คุณต้องการให้หน้าต่างบางหน้าต่างปรากฏตลอดเวลา แต่พวกเขาควรอนุญาตให้มีการโต้ตอบกับหน้าต่างอื่น ๆ ที่อยู่ด้านล่างได้หรือไม่
อันวาร์

ใช่แน่นอนฉันไม่ต้องการโต้ตอบกับที่ (เช่น "คัดลอกกล่องโต้ตอบ" กับหน้าต่าง "เปิดใช้งานเสมอ" ด้านบน ") (ไม่ได้มุ่งเน้นไปที่หน้าต่างนั้น) เมื่อฉันย้ายตัวชี้ไปที่หน้าต่างนั้นฉันแค่ต้องการโต้ตอบ กับหน้าต่างด้านล่างหน้าต่างหลัก (ที่ยังคงอยู่ด้านบน) ควรทำตัวเหมือนลายน้ำ (คุณจะได้ความคิดหรือไม่) หรือเลื่อนไปข้างหน้าเมื่อฉันเลื่อนตัวชี้ไปทางนั้น
Hemant Yadav

1
มันเป็นคำขอที่ผิดปกติฉันไม่คิดว่ามีใครทำอย่างนั้น แต่นี้เป็นไปได้แน่นอนคุณจะต้องเขียนส่วนขยายสำหรับจัดการหน้าต่างคุณใช้(Compiz ฉันเดา) หรือคุณเคยพิจารณาที่จะเก็บ windows เหล่านั้นไว้บนเดสก์ท็อปแยกต่างหากและตั้งค่าคีย์เพื่อให้มี "Super + some_number" คุณสามารถสลับระหว่างเดสก์ท็อป มันสะดวกสบายมากในการเปิดหน้าต่างหลายบานไว้พร้อมกัน
สวัสดีแองเจิล

1
ส่วนขยายของ Gnome Shell "Workspaces To Dock" มีตัวเลือกสำหรับ Dock เพื่อหลบหน้าต่าง นี้ไม่ได้เป็นสิ่งที่ถาม แต่บางทีคุณอาจจะดูมีความคิดที่จะได้รับในการบรรลุนี้: github.com/passingthru67/workspaces-to-dock
ซามูเอล

ได้ดูที่คำถามที่คล้ายกันในการใช้ super มีคนแนะนำว่ามีคุณลักษณะของปลั๊กอินคอมโพสิต "ความทึบแสงและความอิ่มตัว" ที่ทำให้วัตถุที่มีความทึบแสงน้อยกว่า 50% คลิกผ่านได้ ...
Jan Stavěl

คำตอบ:


2

Bash script และ xdotool == cursophobia.sh

ภาพรวม
ฉันคิดว่าฉันมีวิธีแก้ปัญหาที่เหมาะกับคุณ มันเป็นสคริปต์ทุบตีที่ช่วยให้คุณสามารถเลือกหน้าต่าง เมื่อเลือกหน้าต่างแล้วสคริปต์จะสำรวจตำแหน่งหน้าต่างและเคอร์เซอร์อย่างต่อเนื่องตามช่วงเวลาที่กำหนดไว้ล่วงหน้า หากเคอร์เซอร์เข้าใกล้เกินไปหน้าต่างจะเลื่อนออกไป

พึ่งพาสคริปต์นี้จะขึ้นอยู่กับ
xdotoolหากต้องการติดตั้งให้เรียกใช้sudo apt-get install xdotool

สคริปต์: cursophobia.sh
สร้างสคริปต์ทุบตีใหม่ที่มีเนื้อหาต่อไปนี้และทำให้สามารถเรียกใช้งานได้

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

อย่าลืมแก้ไขตัวแปรสี่ตัวที่ด้านบนสุดตามที่คุณต้องการ หากสคริปต์นี้มอบหมายงาน CPU ให้ลองเพิ่มpollตัวแปรให้มีค่ามากขึ้น

ปฏิบัติ
เมื่อคุณสร้างสคริปต์ของคุณและทำให้มันทำงานให้รัน มันจะขอให้คุณเลือกหน้าต่าง คลิกที่หน้าต่างที่คุณต้องการเคอร์เซอร์และรอจนกว่าการนับถอยหลังจะจบ เมื่อการนับถอยหลังสิ้นสุดลงหน้าต่างที่คุณเลือกจะเป็นเคอร์เซอร์ เมื่อคุณพร้อมที่จะช่วยให้หน้าต่างกลัวเคอร์เซอร์ให้ปิดหน้าต่างเทอร์มินัลหรือฆ่าสคริปต์จากหน้าต่างเทอร์มินัลด้วยCtrl+c

การแสดงผลหลายรายการ
โปรดทราบว่านี่เป็นการ จำกัด หน้าต่าง cursophobic ไปที่การแสดงผลเดียว ฉันเปิดให้แก้ไขที่จะทำให้มันทำงานในหลายจอแสดงผล


ส่วนที่สนุกดี มันได้ผล. น่าเสียดายที่มันใช้งานโปรเซสเซอร์ของฉันทั้งหมด (ประมาณ 60%) ดังนั้นจึงไม่ใช่โซลูชันที่ใช้งานได้จริงอย่างที่เป็นอยู่
Jacob Vlijm

@JacobVlijm ฉันได้ทำการเปลี่ยนแปลงบางอย่างเพื่อความสะดวกในการประมวลผล ลองดู
b_laoshi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.