Posso impostare Hot Corners per eseguire comandi personalizzati in Unity?

12

Mi piacciono molto gli Hot Corners. : -)

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

    
posta orschiro 18.02.2017 - 17:03
fonte

3 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. Inserisci il comando desiderato in uno degli slot. Per esempio:

  5. Vai alla scheda "Edge Bindings"

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

  7. Sposta il mouse all'angolo

  8. Ora il tuo comando è eseguito!

Confermato lavorando il 14.04.

    
risposta data wjandrea 19.02.2017 - 02:27
fonte
5

Comandi personalizzati

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

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

Ad esempio, ho eseguito la seguente configurazione:

  • In alto a sinistra Nessuna azione
  • In alto a destra Esegui Gedit
  • In basso a sinistra Nessuna azione
  • Bottom RightRun Terminale Gnome

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

Inoltre, puoi impostare size dell'angolo attivo nella riga:

cornersize = 10

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

Lo script

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

Imposta
  1. Lo script ha bisogno di xdotool

    sudo apt install xdotool
    
  2. Copia lo script in un file vuoto, salva i come 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 / righ, in basso a sinistra / a destra)

  4. Prova: esegui lo script:

    python3 /path/to/hotcorners2.py
    
  5. Se tutto funziona correttamente, aggiungi a Startup Applications: Dash & gt; Applicazioni di avvio & gt; Inserisci. Aggiungi il comando:

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

Note

  • Lo script attualmente funziona sulla (prima) schermata. Può essere facilmente modificato per occuparsi di più schermi, anche fare cose diverse su schermi diversi, per favore citare.
  • Se a poche persone piace, possiamo aggiungere un gui e un ppa per un utilizzo comodo e una facile installazione.

Modifica

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

Piccola differenza, ma solo per divertimento:

Lo script

#!/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 la stessa cosa. Imposta i comandi e il raggio da attivare, nella sezione principale dello script.

    
risposta data Jacob Vlijm 18.02.2017 - 18:12
fonte
5

NOTA:

La risposta di wjandrea è la risposta più adatta per chi usa Ubuntu o Ubuntu Kylin di default (o compiz come display manager), quindi ottiene il mio upvote e il mio 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 testato brevemente su Lubuntu 16.04 VM, quindi so che funziona lì e lo ha reso compatibile anche con Kylin 14.04. Per i desktop GNOME e MATE, è necessario disporre del supporto per gli AppIndicator abilitati per poter utilizzare qualsiasi indicatore.

Introduzione

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

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

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

Notare la voce "left" nel file. Quel bordo non è impostato, ma a causa della sintassi json richiede che ci sia una stringa vuota, vale a dire "" .

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 bolla di notifica ed eseguirà il comando appropriato (se definito). L'attivazione del trigger non si ripeterà a meno che l'utente non sposti il ​​mouse dal bordo.

Come puoi vedere dallo screenshot qui sopra, l'indicatore ha anche il debug dell'output nella riga di comando. Se trovi qualche bug, sentiti libero di eseguirlo dal terminale, scopri quale errore si verifica e invia il rapporto bug appropriato su problemi pagina del GitHub del progetto .

Attualmente non c'è supporto per gli angoli (solo i bordi) ed è stato creato per l'installazione di un monitor (ovviamente, non è possibile coprire tutte le basi entro 7 ore dalla creazione), ma queste funzionalità potrebbero essere disponibili in futuro.

Installazione e codice sorgente

Il codice sorgente è disponibile nella pagina dei progetti GitHub 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
    
risposta data Sergiy Kolodyazhnyy 18.02.2017 - 22:24
fonte

Leggi altre domande sui tag