Làm thế nào để làm cho một cửa sổ được con trỏ-phobic?


15

Tôi có nghĩa là cửa sổ nên di chuyển xung quanh bất cứ khi nào tôi cố gắng di chuyển con trỏ trên nó. Tôi có một hộp thoại "Đồng hồ màn hình tương tự" và "hộp thoại tiến trình tập tin" mà tôi đã điều chỉnh để luôn "Luôn ở trên cùng" của các cửa sổ khác với CCSM nhưng đôi khi chúng gây cản trở.

Nếu điều đó là không thể thì có phương pháp nào để chúng ẩn đi khi tôi di chuyển con trỏ lên chúng để tôi có thể nhấp vào ứng dụng ngay bên dưới không?

Hơn nữa nếu điều đó là không thể hơn chúng ta có thể làm cho các cửa sổ hoạt động như thể chúng không có ở đó không? Ý tôi là tôi sẽ thấy cửa sổ nhưng con trỏ không nên nhận ra nó và sẽ hoạt động bình thường trên ứng dụng bên dưới nó. Tôi sẽ thay đổi tính minh bạch của các ứng dụng và sẽ làm cho nó hoạt động nếu điều đó có thể?


2
Bạn muốn một số cửa sổ luôn được hiển thị nhưng chúng cũng nên cho phép tương tác với các cửa sổ khác bên dưới chúng?
Anwar

Có chính xác, tôi không muốn tương tác với cửa sổ đó (ví dụ: "Sao chép hộp thoại" với cửa sổ "Luôn bật trên cùng") (Không tập trung vào cửa sổ đó) khi tôi di chuyển con trỏ trên cửa sổ đó. Tôi chỉ muốn Tương tác với cửa sổ bên dưới nó. Cửa sổ chính (cửa sổ vẫn ở trên cùng) sẽ hoạt động như một Watermark (bạn hiểu ý tưởng không?) hoặc di chuyển sang một bên khi tôi di chuyển con trỏ về phía nó.
Hemant Yadav

1
Vì đó là một yêu cầu bất thường, tôi không nghĩ rằng có ai đã làm điều đó. Nhưng điều này là hoàn toàn có thể, bạn cần phải viết một phần mở rộng cho Trình quản lý cửa sổ mà bạn sử dụng (compiz, tôi đoán vậy) . Ngoài ra, bạn có cân nhắc chỉ giữ các cửa sổ đó trên một màn hình riêng biệt và các phím thiết lập để với "Super + some_number" bạn có thể chuyển đổi giữa các máy tính để bàn. Nó rất thoải mái để giữ một loạt các cửa sổ mở tại một thời điểm.
Hi-Angel

1
Tiện ích mở rộng Gnome Shell "Workspaces To Dock" có một tùy chọn cho dock để tránh các cửa sổ. Đây không phải là chính xác những gì được yêu cầu, nhưng có lẽ bạn có thể nhìn vào đó để có ý tưởng về cách đạt được điều này: github.com/passingthru67/workspaces-to-dock .
Samuel

Có một cái nhìn vào câu hỏi tương tự trên superuser . Ai đó đề xuất rằng có một tính năng của plugin compiz "Độ mờ, Độ sáng và Độ bão hòa" làm cho các đối tượng có độ mờ dưới 50% có thể nhấp qua ...
Jan Stavěl

Câu trả lời:


2

Tập lệnh Bash và xdotool == cursophobia.sh

Tổng quan
Tôi nghĩ rằng tôi có một giải pháp sẽ làm việc cho bạn. Nó là một tập lệnh bash cho phép bạn chọn một cửa sổ. Khi một cửa sổ được chọn, tập lệnh sẽ liên tục thăm dò các vị trí cửa sổ và con trỏ theo các khoảng thời gian được xác định trước. Nếu con trỏ quá gần, cửa sổ sẽ di chuyển ra khỏi đường.

Phụ thuộc
kịch bản này phụ thuộc vào xdotool. Để cài đặt, chạysudo apt-get install xdotool

Kịch bản: cursophobia.sh
Tạo một tập lệnh bash mới với các nội dung sau và làm cho nó có thể thực thi được.

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

Đừng quên chỉnh sửa bốn biến ở trên cùng theo ý thích của bạn. Nếu tập lệnh này đang làm nhiệm vụ cho CPU của bạn, hãy thử tăng pollbiến lên giá trị lớn hơn.

cursophobia.sh trong hành động
Một khi bạn đã tạo tập lệnh của mình và làm cho nó có thể thực thi được, hãy chạy nó. Nó sẽ yêu cầu bạn chọn một cửa sổ. Nhấp vào cửa sổ mà bạn muốn bị nguyền rủa và đợi cho đến khi đếm ngược kết thúc. Khi quá trình đếm ngược kết thúc, cửa sổ bạn chọn sẽ bị nhiễu. Khi bạn đã sẵn sàng để giúp cửa sổ vượt qua nỗi sợ con trỏ, hãy đóng cửa sổ đầu cuối hoặc tắt tập lệnh từ cửa sổ đầu cuối bằng Ctrl+c

Nhiều màn hình
Xin lưu ý rằng điều này hạn chế cửa sổ chữ thảo ở một màn hình duy nhất. Tôi mở các chỉnh sửa để làm cho nó hoạt động trên nhiều màn hình.


Phần vui vẻ là tốt; nó hoạt động Thật không may, nó hoàn toàn ăn nghề của bộ xử lý của tôi (khoảng 60%). Do đó, nó không phải là một giải pháp có thể sử dụng thực sự.
Jacob Vlijm

@JacobVlijm, tôi đã thực hiện một số thay đổi để giảm bớt bộ xử lý. Hãy thử nó.
b_laoshi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.