Posso impostare Hot Corners per eseguire comandi personalizzati in Unity?


13

Mi piacciono molto gli Hot Corners. :-)

È in qualche modo possibile eseguire un comando personalizzato su un angolo caldo come mostrato di seguito?

inserisci qui la descrizione dell'immagine


Non penso che sia possibile con hotcorner specificamente (almeno non con il modo in cui Unity li usa), ma è possibile attivare gli script quando il mouse viene posizionato in un'area specifica dello schermo. Ad esempio, consultare askubuntu.com/a/758307/295286 , sezione Mouse over action. Esaminerò di più gli hotcorner, ma se quelli non funzionano, lo script personalizzato è OK?
Sergiy Kolodyazhnyy,

Multi-monitor o singolo?
Jacob Vlijm,

Ciao Orschiro, pubblicato. Si prega di menzionare se tutto è chiaro (o no).
Jacob Vlijm,

Ehi, vedo che ci sono più hotcorner qui che nella mia risposta. Quanti preferiresti?
Jacob Vlijm,

2
@JacobVlijm, Serg, vedi la mia risposta.
wjandrea,

Risposte:


10

CCSM

  1. Installa CompizConfig Settings Manager (CCSM). Esegui nel terminale:

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

  3. Vai a "Comandi"
  4. Immettere il comando desiderato in uno degli slot. Per esempio:

    Schermata CCSM: comando

  5. Vai alla scheda "Edge Bindings"

  6. Fai clic su "Nessuno" e imposta l'angolo attivo (o il bordo) desiderato, che corrisponde al comando appena impostato

    Schermata CCSM: angoli caldi

  7. Sposta il mouse sull'angolo

  8. Ora il tuo comando è eseguito!

    Schermata CCSM: comando in esecuzione

Confermato il lavoro il 14.04.


La più semplice di tutte le soluzioni proposte. Se il comando desiderato è meglio realizzato attraverso uno script, basta fare in modo che il comando compiz faccia riferimento a quello script o solo lo scriptname se lo script si trova in una cartella bin in $ PATH. L'unico lato negativo possibile è che si sa che unità / compiz 'perdono' in modo casuale i comandi degli utenti, cioè quelli che non sono integrati. Come integrare un comando utente va oltre lo scopo di questa domanda.
Doug

@wjandrea Quindi è implementato dopo tutto. Compiz non coglie per stupirmi. Buona risposta, più adatta a ciò che cerca OP. + 1'ed
Sergiy Kolodyazhnyy,

Sfortunatamente, hai ragione, ahah. Sì, esattamente ciò che l'OP ha richiesto.
Jacob Vlijm,

Mi hai aiutato parecchie volte con le tue modifiche e risposte. Avere un "biscotto" come diceva ole'Serg ... anzi ne ha una mezza dozzina :)
WinEunuuchs2Unix

6

Comandi personalizzati

Se stai usando Unity e hai installato ccsm, ovviamente la risposta di wjandrea è la tua risposta. In caso contrario , o da utilizzare su altre distro, un'alternativa leggera potrebbe essere utile.

Con lo script seguente, puoi impostare qualsiasi comando, specifico per ciascuno dei tuoi hotcorner.

Ad esempio, ho effettuato la seguente configurazione:

  • In alto a sinistra Nessuna azione
  • Gedit in alto a destra
  • In basso a sinistra Nessuna azione
  • Terminale Gnome inferiore destro

Ovviamente puoi anche fare in modo che i comandi eseguano script esterni.

Inoltre, puoi impostare la dimensione dell'angolo caldo nella linea:

cornersize = 10

Basta cambiare il valore (pixel). Lo script imposta le aree (quadrate) per attivare i tuoi comandi:

inserisci qui la descrizione dell'immagine

Il copione

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

Impostare

  1. La sceneggiatura ha bisogno xdotool

    sudo apt install xdotool
  2. Copia lo script in un file vuoto, salva i as hotcorners2.py
  3. Nella testa dello script, imposta i tuoi comandi (attenzione alle virgolette)

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

    (successivamente in alto a sinistra / a destra, in basso a sinistra / a destra)

  4. Prova- esegui lo script:

    python3 /path/to/hotcorners2.py
  5. Se tutto funziona correttamente, aggiungi ad Applicazioni di avvio: Dash> Applicazioni di avvio> Aggiungi. Aggiungi il comando:

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

Appunti

  • Lo script attualmente viene eseguito sulla (prima) schermata. Può essere facilmente modificato per occuparsi di più schermate, anche fare cose diverse in schermate diverse, per favore, menzionate.
  • Se ad alcune persone piace, possiamo aggiungere una gui e una ppa per un comodo utilizzo e una facile installazione.

MODIFICARE

Se utilizziamo un calcolo un po 'più avanzato, possiamo usare un raggio anziché un'area quadrata per attivare i comandi (grazie al buon vecchio @pythagoras):

inserisci qui la descrizione dell'immagine

Piccola differenza, ma solo per divertimento:

Il copione

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

È praticamente lo stesso. Imposta i comandi e il raggio da attivare nella sezione head dello script.


5

NOTA:

La risposta di wjandrea è la risposta più adatta a chi usa Ubuntu o Ubuntu Kylin predefiniti (o ha compiz come display manager), quindi ottiene il mio voto e rispetto. La risposta fornita di seguito può essere utilizzata anche su Unity, ma probabilmente sarebbe leggermente ridondante. Tuttavia, negli ambienti desktop che non dispongono di compiz, è possibile utilizzare l'indicatore presentato di seguito. L'ho provato brevemente in Lubuntu 16.04 VM, quindi so che funziona lì e l'ho reso compatibile anche con Kylin 14.04. Per i desktop GNOME e MATE, è necessario innanzitutto avere il supporto per AppIndicator abilitato per poter utilizzare qualsiasi indicatore.

introduzione

Ho implementato indicator-edgerche consente di attivare comandi definiti dall'utente in base alla posizione del mouse in qualsiasi punto lungo i 4 bordi dello schermo. La versione originale è stata realizzata in un giorno, in circa 7 ore, quindi è abbastanza minimalista ma fa il suo lavoro.

inserisci qui la descrizione dell'immagine

L'indicatore è controllato tramite ~/.edger-commands.jsonfile, ovviamente in jsonformato. Può essere scritto manualmente dall'utente o impostato tramite l' DEFINE COMMANDSopzione dell'indicatore . L'opzione di attivazione / disattivazione del trigger viene memorizzata e scritta automaticamente nel file per comodità dell'utente. Il file di configurazione di esempio sarebbe così:

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

Nota la "left"voce nel file. Quel bordo non è impostato, ma a causa della jsonsintassi richiede una stringa vuota lì, cioè virgolette "".

Una volta che l'indicatore rileva che l'utente ha posizionato il mouse lungo uno dei bordi (con un margine di ~ 3 pixel), l'indicatore invierà una notifica a bolle ed eseguirà il comando appropriato (se definito). L'attivazione del grilletto non si ripeterà se l'utente non sposta il mouse dal bordo.

inserisci qui la descrizione dell'immagine

Come puoi vedere dallo screenshot sopra, l'indicatore ha anche un output di debug nella riga di comando. Se trovi qualche bug, sentiti libero di eseguirlo dal terminale, scopri quale errore si verifica e invia la segnalazione di bug appropriata nella pagina dei problemi di GitHub del progetto .

Attualmente non esiste supporto per gli angoli (solo bordi) ed è stato creato per la configurazione di un monitor (ovviamente, non è possibile coprire tutte le basi entro 7 ore dalla creazione), ma tali funzionalità potrebbero essere disponibili alla fine in futuro.

Installazione e codice sorgente

Il codice sorgente è disponibile nella pagina GitHub dei progetti o tramite Launchpad . L'installazione viene eseguita tramite i seguenti comandi nel terminale:

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.