¿Cómo hacer que una ventana sea fóbica?

15

Quiero decir que la ventana debe moverse cuando intento mover el puntero sobre ella. Tengo un "cuadro de diálogo Reloj analógico" y un "cuadro de diálogo de progreso del archivo" que modifiqué para que permanezca "Siempre en la cima" de otras ventanas con CCSM, pero a veces se interponen en el camino de hacer las cosas.

Si eso no es posible, ¿hay algún método para que se oculten cuando muevo el puntero sobre ellos para que pueda hacer clic en la aplicación directamente debajo?

Además, si eso no es posible, ¿podemos hacer que las ventanas se comporten como si no estuvieran allí? Quiero decir que veré la ventana, pero el puntero no debería reconocerla y debería funcionar normalmente en la aplicación debajo de ella. ¿Cambiaré la transparencia de las aplicaciones y haré que funcione si es posible?

Hemant Yadav
fuente
2
¿Desea que siempre se muestre alguna ventana pero también deberían permitir interactuar con otras ventanas debajo de ellas?
Anwar
Sí exactamente, no quiero interactuar con esa ventana (por ejemplo, "Copiar cuadro de diálogo" con la ventana "Siempre en la parte superior" habilitada) (Ni siquiera enfocarme en esa ventana) cuando muevo el puntero en esa ventana. Solo quiero interactuar con la ventana debajo. La ventana principal (una que permanece en la parte superior) debe actuar como una marca de agua (¿entiendes la idea?) o apartarse cuando muevo el puntero hacia ella.
Hemant Yadav
1
Como es una solicitud inusual, no creo que nadie haya hecho eso. Pero esto es definitivamente posible, necesitaría escribir una extensión para el Administrador de ventanas que usa (compiz, supongo) . Alternativamente, ¿ha considerado mantener esas ventanas en un escritorio separado y configurar las teclas para que con "Super + algún_número" pueda cambiar entre escritorios. Es muy cómodo para mantener abiertas muchas ventanas a la vez.
Hola Ángel
1
La extensión "Workspaces To Dock" de Gnome Shell tiene una opción para que el dock esquive ventanas. Esto no es exactamente lo que se pide, pero tal vez podría mirar allí para tener una idea de cómo lograr esto: github.com/passingthru67/workspaces-to-dock .
Samuel
Echa un vistazo a una pregunta similar sobre el superusuario . Alguien sugiere que hay una característica del complemento de compiz "Opacidad, brillo y saturación" que hace que los objetos con menos del 50% de opacidad sean cliqueables ...
Jan Stavěl

Respuestas:

2

Bash script y xdotool == cursophobia.sh

Descripción general
Creo que tengo una solución que funcionará para usted. Es un script bash que le permite seleccionar una ventana. Una vez que se selecciona una ventana, el script sondea continuamente las posiciones de la ventana y el cursor a intervalos predefinidos. Si el cursor se acerca demasiado, la ventana se mueve fuera del camino.

Dependencia
Este script depende de xdotool. Para instalar, ejecutesudo apt-get install xdotool

El script: cursophobia.sh
Cree un nuevo script de bash con los siguientes contenidos y hágalo ejecutable.

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

No olvide editar las cuatro variables en la parte superior a su gusto. Si este script está asignando tareas a su CPU, intente aumentar la pollvariable a un valor mayor.

cursophobia.sh en acción
Una vez que haya creado su script y hecho ejecutable, ejecútelo. Le pedirá que seleccione una ventana. Haga clic en la ventana en la que desea ser cursofóbico y espere hasta que termine la cuenta regresiva. Una vez que finalice la cuenta regresiva, la ventana que seleccione será cursofóbica. Cuando esté listo para ayudar a que la ventana supere su miedo a los cursores, cierre la ventana de terminal o elimine el script de la ventana de terminal con Ctrl+c

Múltiples pantallas
Tenga en cuenta que esto restringe la ventana cursofóbica a una sola pantalla. Estoy abierto a ediciones que lo harían funcionar en múltiples pantallas.

b_laoshi
fuente
La parte divertida está bien; funciona. Desafortunadamente, se come totalmente la ocupación de mi procesador (alrededor del 60%). Por lo tanto, no es una solución utilizable real como es.
Jacob Vlijm
@JacobVlijm, hice algunos cambios para facilitar el procesador. Pruébalo.
b_laoshi