如何使窗口成为恐惧指针?


15

我的意思是,每当我尝试在其上移动指针时,窗口都应该移动。我有一个“模拟时钟小屏幕”和“文件进度对话框”,我将它们调整为在CCSM的其他窗口中始终位于“始终位于顶部”,但有时它们会妨碍您的工作。

如果那是不可能的,那么有什么方法可以使它们在我将指针移到它们上时隐藏起来,以便我可以直接在下面单击该应用程序?

进一步说,如果那不可能,那么我们能否使窗口表现得好像它们不在那里一样?我的意思是我将看到该窗口,但指针不应识别该窗口,并且应在其下的应用程序上正常工作。我将更改应用程序的透明度,并在可能的情况下使其正常工作吗?


2
您希望某些窗口始终显示,但它们还应允许与其下面的其他窗口进行交互?
安华

是的,是的,当我在该窗口上移动指针时,我不想与该窗口(例如,“始终位于顶部”的“复制对话框”)不进行交互。与它下面的窗口主窗口(其中一个留在顶部)应像水印(你的想法?),或者当我移动指针朝它走到一边。
与Hemant亚达夫

1
由于这是一个不寻常的请求,我认为没有人这样做。但这绝对有可能,您需要为所使用的窗口管理器编写一个扩展(我猜是compiz)。另外,您是否考虑过仅将这些窗口保留在单独的桌面上,并设置密钥,以便使用“ Super + some_number”可以在桌面之间切换。一次打开一堆窗户非常舒适。
Hi-Angel

1
Gnome Shell扩展“ Workspaces To Dock”为扩展坞提供了一个躲避窗口的选项。这并不是完全要问的问题,但是也许您可以去那里看看如何实现这一点的想法:github.com/passingthru67/workspaces-to-dock
塞缪尔

看一下超级用户上的类似问题。有人建议使用compiz插件“不透明度,亮度和饱和度”的功能,该功能可使不透明度低于50%的对象可通过点击...
JanStavěl17

Answers:


2

Bash脚本和xdotool == cursophobia.sh

概述
我想我有一个适合您的解决方案。它是一个bash脚本,允许您选择一个窗口。一旦选择了窗口,脚本将以预定义的间隔连续轮询窗口和光标位置。如果光标距离太近,则窗口会移开。

相关性
此脚本取决于xdotool。要安装,运行sudo apt-get install xdotool

脚本:cursophobia.sh
使用以下内容创建一个新的bash脚本并使它可执行。

#!/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变量增加到更大的值。

运行中的cursophobia.sh
创建脚本并使其可执行后,运行它。它将要求您选择一个窗口。单击您要防恐的窗口,然后等待倒计时结束。倒数计时结束后,您选择的窗口将是恐惧的。当您准备好帮助窗口消除对光标的恐惧时,请关闭终端窗口或使用Ctrl+ 终止终端窗口中的脚本c

多个显示器
请注意,这将疏憎性窗口限制为单个显示器。我愿意接受可以使其在多个显示器上工作的编辑。


有趣的部分很好;有用。不幸的是,这完全吞噬了我的处理器的工作量(大约60%)。因此,它并不是真正的可用解决方案。
Jacob Vlijm

@JacobVlijm,我进行了一些更改以简化处理器。试试看。
b_laoshi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.