Como fazer uma janela ser apontada como fóbica?


15

Quero dizer, a janela deve se mover sempre que tento mover o ponteiro nela. Eu tenho um "screenlet de relógio analógico" e uma "caixa de diálogo de progresso do arquivo", que aprimorei para ficar "Sempre no topo" de outras janelas com o CCSM, mas às vezes elas atrapalham as coisas.

Se isso não for possível, existe algum método para que eles ocultem quando eu movo o ponteiro sobre eles para que eu possa clicar no aplicativo diretamente abaixo?

Além disso, se isso não for possível, podemos fazer com que as janelas se comportem como se não estivessem lá? Quero dizer, vou ver a janela, mas o ponteiro não deve reconhecê-la e deve funcionar normalmente no aplicativo abaixo dela. Vou mudar a transparência dos aplicativos e fazê-lo funcionar, se for possível?


2
Você deseja que alguma janela seja sempre exibida, mas também deve permitir a interação com outras janelas abaixo delas?
Anwar

Sim, exatamente, não quero interagir com a janela (por exemplo, "Copiar caixa de diálogo" com a opção "Sempre no topo" ativada ")" (nem mesmo o foco nessa janela) quando movo o ponteiro da janela. Quero apenas interagir com a janela abaixo da janela principal (aquele que permanece no topo) deve agir como uma marca d'água (essa é a idéia?) ou mover de lado quando eu mover o ponteiro para ele..
Hemant Yadav

11
Como é um pedido incomum, não acho que alguém tenha feito isso. Mas isso é definitivamente possível, você precisaria escrever uma extensão para o Gerenciador de Janelas que você usa (compiz, eu acho) . Como alternativa, você já pensou em manter essas janelas em uma área de trabalho separada e nas teclas de configuração para que, com "Super + some_number", você possa alternar entre as áreas de trabalho. É muito confortável para manter um monte de janelas abertas por vez.
Hi-Angel

11
A extensão do Shell do Gnome, "Espaços de trabalho na doca", tem uma opção para a doca desviar das janelas. Isso não é exatamente o que é solicitado, mas talvez você possa procurar lá para ter uma idéia de como fazer isso: github.com/passingthru67/workspaces-to-dock .
Samuel

Dê uma olhada em uma pergunta semelhante sobre o superusuário . Alguém sugerem que há uma característica do compiz plug-in "opacidade, brilho e saturação" que faz com que objetos com menos de 50% de opacidade clique throughable ...
Jan Stavel

Respostas:


2

Script Bash e xdotool == cursophobia.sh

Visão geral
Acho que tenho uma solução que funcionará para você. É um script bash que permite selecionar uma janela. Depois que uma janela é selecionada, o script pesquisa continuamente as posições da janela e do cursor em intervalos predefinidos. Se o cursor se aproximar demais, a janela se afastará.

Dependência
Este script depende do xdotool. Para instalar, executesudo apt-get install xdotool

O script: cursophobia.sh
Crie um novo script bash com o seguinte conteúdo e torne-o executável.

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

Não se esqueça de editar as quatro variáveis ​​no topo, ao seu gosto. Se esse script estiver encarregando sua CPU, tente aumentar a pollvariável para um valor maior.

cursophobia.sh em ação
Depois de criar seu script e torná-lo executável, execute-o. Ele solicitará que você selecione uma janela. Clique na janela que você deseja ser cursofóbica e aguarde até que a contagem regressiva termine. Quando a contagem regressiva terminar, a janela que você selecionar será cursofóbica. Quando estiver pronto para ajudar a janela a superar o medo de cursores, feche a janela do terminal ou mate o script da janela do terminal com Ctrl+c

Múltiplas exibições
Observe que isso restringe a janela cursofóbica a uma única exibição. Estou aberto a edições que funcionariam em vários monitores.


A parte divertida é boa; funciona. Infelizmente, ele consome totalmente a ocupação do meu processador (cerca de 60%). Portanto, não é uma solução realmente utilizável.
27675 Jacob Vlijm

@JacobVlijm, fiz algumas alterações para facilitar o processador. Experimente.
b_laoshi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.