¿Puedo configurar Hot Corners para ejecutar comandos personalizados en Unity?

13

Me gusta mucho Hot Corners. :-)

¿De alguna manera es posible ejecutar un comando personalizado en una esquina activa como se muestra a continuación?

ingrese la descripción de la imagen aquí

orschiro
fuente
No creo que sea posible con hotcorners específicamente (al menos no con la forma en que Unity los usa), pero es posible activar scripts cuando el mouse se coloca en un área específica de la pantalla. Por ejemplo, consulte askubuntu.com/a/758307/295286 , mouse sobre la sección de acción. Buscaré más en hotcorners, pero si eso no funciona, ¿está bien el script personalizado?
Sergiy Kolodyazhnyy
Multi-monitor o solo?
Jacob Vlijm
Hola orschiro, publicado. Mencione si todo está claro (o no).
Jacob Vlijm
Oye, veo que hay más hotcorners aquí que en mi respuesta. ¿Cuántos preferirías?
Jacob Vlijm
2
@JacobVlijm, Serg, mira mi respuesta.
wjandrea

Respuestas:

10

CCSM

  1. Instale CompizConfig Settings Manager (CCSM). Ejecutar en terminal:

    sudo apt-get install compizconfig-settings-manager
  2. Abrir CCSM.

  3. Ir a "Comandos"
  4. Ingrese su comando deseado en una de las ranuras. P.ej:

    Captura de pantalla de CCSM: comando

  5. Vaya a la pestaña "Vinculaciones de bordes"

  6. Haga clic en "Ninguno" y configure la esquina activa (o borde) deseada, que corresponde al comando que acaba de configurar

    Captura de pantalla de CCSM - rincones calientes

  7. Mueve el mouse hacia la esquina

  8. Ahora su comando se ejecuta!

    Captura de pantalla de CCSM: comando en ejecución

Confirmado trabajando el 14.04.

wjandrea
fuente
La más fácil de todas las soluciones propuestas. Si se desea un comando mejor realizado a través de un script que simplemente hacer que el comando compiz apunte a ese script o simplemente scriptname si el script está en una carpeta bin en $ PATH. El único inconveniente posible es la unidad / compiz que se sabe que 'pierde' aleatoriamente los comandos establecidos por el usuario, es decir, aquellos que no están integrados. Cómo integrar un comando de usuario está más allá del alcance de esta pregunta.
doug
@wjandrea Entonces se implementa después de todo. Compiz no aprovecha para sorprenderme. Buena respuesta, más adecuada para lo que busca OP. + 1'ed
Sergiy Kolodyazhnyy
Lamentablemente, tienes razón, jaja. Sí, exactamente lo que OP solicitó.
Jacob Vlijm
Me has ayudado varias veces con tus ediciones y respuestas. Tenga una "cookie" como solía decir ole'Serg ... de hecho, tenga media docena :)
WinEunuuchs2Unix
6

Comandos personalizados

Si está utilizando Unity y tiene instalado ccsm, la respuesta de wjandrea es su respuesta, por supuesto. Si no , o para usar en otras distribuciones, una alternativa ligera podría ser útil.

Con el siguiente script, puede configurar cualquier comando, específico para cada uno de sus hotcorners.

Como ejemplo, hice la siguiente configuración:

  • Arriba a la izquierda Sin acción
  • Ejecución superior derecha Gedit
  • Abajo a la izquierda Sin acción
  • Abajo a la derecha Ejecutar gnomo-terminal

Por supuesto, también puede hacer que los comandos ejecuten scripts externos.

Además, puede establecer el tamaño de la esquina activa en la línea:

cornersize = 10

Simplemente cambie el valor (píxeles). El script establece áreas (cuadradas) para activar sus comandos:

ingrese la descripción de la imagen aquí

La secuencia de comandos

#!/usr/bin/env python3
import subprocess
import time

cornersize = 20

commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
    ]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def get_pos():
    return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]

scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]

match1 = None

while True:
    time.sleep(1)
    xy = get_pos()
    x = xy[0]; y = xy[1]
    test = [
        [x < cornersize, y < cornersize],
        [x > res[0]-cornersize, y < cornersize],
        [x < cornersize, y > res[1]-cornersize],
        [x > res[0]-cornersize, y > res[1]-cornersize],
        ]
    match2 = [i for i, p in enumerate(test) if all(p)]
    if match2 != match1:
        if match2:
            cmd = commands[match2[0]]
            if cmd:
                subprocess.Popen(["/bin/bash", "-c", cmd])
    match1 = match2

Preparar

  1. El guión necesita xdotool

    sudo apt install xdotool
  2. Copie el script en un archivo vacío, guárdelo como hotcorners2.py
  3. En la cabeza del guión, configure sus comandos (tenga en cuenta las comillas)

    commands = [
        None,
        "gedit",
        None,
        "gnome-terminal",
    ]

    (posteriormente arriba a la izquierda / derecha, abajo a la izquierda / derecha)

  4. Prueba: ejecuta el script:

    python3 /path/to/hotcorners2.py
  5. Si todo funciona bien, agréguelo a Aplicaciones de inicio: Tablero> Aplicaciones de inicio> Agregar. Agrega el comando:

    /bin/bash -c "sleep 5 && python3 /path/to/hotcorners2.py"

Notas

  • El script actualmente se ejecuta en (la primera) pantalla. Se puede editar fácilmente para ocuparse de múltiples pantallas, incluso hacer cosas diferentes en diferentes pantallas, por favor mencione.
  • Si a algunas personas les gusta, podemos agregar una interfaz gráfica de usuario y un ppa para un uso conveniente y una instalación fácil.

EDITAR

Si usamos una informática un poco más avanzada, podemos usar un radio en lugar de un área cuadrada para activar los comandos (gracias a la buena @pythagoras):

ingrese la descripción de la imagen aquí

Pequeña diferencia, pero solo por diversión:

La secuencia de comandos

#!/usr/bin/env python3
import subprocess
import math
import time

# set distance (hotcorner sensitivity)
radius = 20

# top-left, top-right, bottom-left, bottom-right
commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
    ]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def get_pos():
    return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]

# get the resolution
scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
# list the corners, could be more elegant no doubt
corners = [[0, 0], [res[0], 0], [0, res[1]], [res[0], res[1]]]

match1 = None

while True:
    time.sleep(1)
    pos = get_pos()
    # get the current difference from the mousepointer to each of the corner (radius)
    diff = [int(math.sqrt(sum([(c[i]-pos[i])**2 for i, n in enumerate(res)])))\
            for c in corners]
    # see if any of the corners is "approached" within the radius
    match2 = [diff.index(n) for n in diff if n < radius]
    # if so, and the corresponding command is not set to None, run it.
    if all([match2 != match1, match2]):
        cmd = commands[match2[0]]
        if cmd:
            subprocess.Popen(["/bin/bash", "-c", cmd])
    match1 = match2

Uso

Es más o menos lo mismo. Establezca sus comandos, y el radio para disparar, en la sección principal del script.

Jacob Vlijm
fuente
5

NOTA:

La respuesta de wjandrea es la respuesta más adecuada para alguien que usa Ubuntu o Ubuntu Kylin predeterminados (o tiene compiz como su administrador de pantalla), por lo que recibe mi voto positivo y respeto. La respuesta proporcionada a continuación, también se puede usar en Unity, pero probablemente sería un poco redundante. Sin embargo, en entornos de escritorio que no tienen compiz, uno puede usar el indicador presentado a continuación. Lo probé brevemente en Lubuntu 16.04 VM, así que sé que funciona allí, y también lo hice compatible con Kylin 14.04. Para los escritorios GNOME y MATE, primero deberá tener soporte para AppIndicators habilitado para poder usar cualquier indicador.

Introducción

He implementado lo indicator-edgerque permite activar comandos definidos por el usuario basados ​​en la posición del mouse en cualquier lugar a lo largo de los 4 bordes de la pantalla. La versión original se realizó dentro de un día, en aproximadamente 7 horas, por lo tanto, es bastante minimalista pero hace el trabajo.

ingrese la descripción de la imagen aquí

El indicador se controla mediante un ~/.edger-commands.jsonarchivo, obviamente en jsonformato. El usuario puede escribirlo manualmente o configurarlo mediante la DEFINE COMMANDSopción del indicador . La opción de activación / desactivación de activación se recuerda y se escribe automáticamente en el archivo para comodidad del usuario. El archivo de configuración de muestra sería así:

{
    "right": "gnome-terminal",
    "top": "firefox",
    "left": "",
    "bottom": "gnome-screenshot",
    "enabled": true
}

Anote la "left"entrada en el archivo. Ese borde no está definido, pero debido a la jsonsintaxis requiere tener una cadena vacía allí, es decir, comillas "".

Una vez que el indicador detecta que el usuario ha colocado el mouse a lo largo de cualquiera de los bordes (con un margen de ~ 3 píxeles), el indicador enviará una notificación de burbuja y ejecutará el comando apropiado (si está definido). La activación del disparador no se repetirá a menos que el usuario aleje el mouse del borde.

ingrese la descripción de la imagen aquí

Como puede ver en la captura de pantalla anterior, el indicador también tiene salida de depuración en la línea de comandos. Si encuentra algún error, siéntase libre de ejecutarlo desde la terminal, averiguar qué error ocurre y enviar el informe de error apropiado en la página de problemas del GitHub del proyecto .

Actualmente no hay soporte para esquinas (solo bordes) y se creó para la configuración de un monitor (obviamente, no se pueden cubrir todas las bases dentro de las 7 horas posteriores a la creación), pero esas características podrían estar disponibles eventualmente en el futuro.

Instalación y código fuente

El código fuente está disponible en la página de proyectos de GitHub o mediante Launchpad . La instalación se realiza mediante los siguientes comandos en la terminal:

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
Sergiy Kolodyazhnyy
fuente