Kann ich Hot Corners einstellen, um benutzerdefinierte Befehle in Unity auszuführen?

12

Ich mag heiße Ecken wirklich. : -)

Ist es irgendwie möglich, einen benutzerdefinierten Befehl an einer heißen Ecke auszuführen, wie unten gezeigt?

    
orschiro 18.02.2017, 17:03
quelle

3 Antworten

10

CCSM

  1. Installieren Sie den CompizConfig Einstellungsmanager (CCSM). Im Terminal laufen:

    sudo apt-get install compizconfig-settings-manager
    
  2. Öffnen Sie CCSM.

  3. Gehen Sie zu "Befehle"
  4. Geben Sie Ihren gewünschten Befehl in einen der Slots ein. ZB:

  5. Gehen Sie zum Tab "Kantenbindungen"

  6. Klicken Sie auf "Keine" und stellen Sie Ihre gewünschte heiße Ecke (oder Kante) ein, die dem Befehl entspricht, den Sie gerade gesetzt haben

  7. Bewegen Sie die Maus in die Ecke

  8. Jetzt wird Ihr Befehl ausgeführt!

Bestätigte Arbeit am 14.04.

    
wjandrea 19.02.2017, 02:27
quelle
5

Benutzerdefinierte Befehle

Wenn Sie Unity und ccsm installiert haben, ist die Antwort von wjandrea natürlich Ihre Antwort. Wenn nicht oder auf anderen Distributionen verwendet wird, kann eine leichtgewichtige Alternative hilfreich sein.

Mit dem unten stehenden Skript können Sie einen beliebigen Befehl festlegen, der für jeden Ihrer Hotcorner spezifisch ist.

Als Beispiel habe ich folgendes Setup gemacht:

  • Oben links Keine Aktion
  • Oben rechts Führe Gedit aus
  • Unten links Keine Aktion
  • Bottom RightRun Gnome-Terminal

Natürlich können Sie mit den Befehlen auch externe Skripts ausführen.

Außerdem können Sie die Größe der heißen Ecke in der Zeile festlegen:

cornersize = 10

Ändern Sie einfach den Wert (Pixel). Das Skript legt (quadratische) Bereiche fest, um Ihre Befehle auszulösen:

Das Skript

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

Einrichtung

  1. Das Skript benötigt xdotool

    sudo apt install xdotool
    
  2. Kopiere das Skript in eine leere Datei und speichere es als hotcorners2.py
  3. Setzen Sie im Kopf des Skripts Ihre Befehle (beachten Sie die Anführungszeichen)

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

    (anschließend oben links / rechts, unten links / rechts)

  4. Test - Führen Sie das Skript aus:

    python3 /path/to/hotcorners2.py
    
  5. Wenn alles funktioniert, fügen Sie zu Startup Applications hinzu: Dash & gt; Startanwendungen & gt; Hinzufügen. Fügen Sie den folgenden Befehl hinzu:

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

Notizen

  • Das Skript läuft derzeit auf dem (ersten) Bildschirm. Es kann leicht bearbeitet werden, um sich um mehrere Bildschirme zu kümmern, sogar verschiedene Dinge in verschiedenen Bildschirmen, bitte erwähnen.
  • Wenn es ein paar Leute mögen, können wir eine GUI und einen PPA für die bequeme Nutzung und einfache Installation hinzufügen.

BEARBEITEN

Wenn wir etwas fortschrittlicheres Computing verwenden, können wir anstelle eines quadratischen Bereichs einen Radius verwenden, um die Befehle auszulösen (dank der guten alten @pythagoras):

Kleiner Unterschied, aber nur zum Spaß:

Das Skript

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

Verwendung

Ist ziemlich genau so. Legen Sie im Kopfbereich des Skripts Ihre Befehle und den auszuwählenden Radius fest.

    
Jacob Vlijm 18.02.2017 18:12
quelle
5

HINWEIS:

wjandreas Antwort ist die beste Antwort für jemanden, der Standard Ubuntu oder Ubuntu Kylin verwendet (oder compiz als Display hat) Manager), so bekommt es meine Aufwertung und Respekt. Die unten angegebene Antwort kann auch für Unity verwendet werden, wäre aber wahrscheinlich etwas überflüssig. In Desktopumgebungen ohne Compiz kann jedoch der unten dargestellte Indikator verwendet werden. Ich habe es kurz in Lubuntu 16.04 VM getestet, also weiß ich, dass es dort funktioniert, und machte es auch kompatibel mit Kylin 14.04. Für GNOME- und MATE-Desktops müssen Sie zunächst die Unterstützung für AppIndicators aktiviert haben, um einen beliebigen Indikator zu verwenden.

Einführung

Ich habe indicator-edger implementiert, was es ermöglicht, benutzerdefinierte Befehle basierend auf der Mausposition irgendwo an den 4 Bildschirmrändern auszulösen. Die Originalversion wurde innerhalb von einem Tag, in ungefähr 7 Stunden, gemacht, also ist es ziemlich minimalistisch, aber macht den Job.

Der Indikator wird über die ~/.edger-commands.json -Datei gesteuert, offensichtlich im json -Format. Sie kann manuell vom Benutzer geschrieben oder über die Option DEFINE COMMANDS des Indikators festgelegt werden. Die Aktivierung / Deaktivierung der Auslöseoption wird gespeichert und automatisch in eine Datei geschrieben, um den Benutzerkomfort zu erhöhen. Beispielkonfigurationsdatei wäre so:

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

Beachten Sie den "left" -Eintrag in der Datei. Diese Kante ist nicht gesetzt, aber wegen json -Syntax benötigt sie eine leere Zeichenkette, d. H. Zitiert "" .

Sobald der Indikator erkennt, dass der Benutzer die Maus entlang einer der Kanten platziert hat (mit einem Rand von ~ 3 Pixeln), sendet der Indikator eine Blasenbenachrichtigung und führt den entsprechenden Befehl aus (falls definiert). Die Aktivierung des Triggers wird nicht wiederholt, es sei denn, der Benutzer bewegt die Maus von der Kante weg.

Wie Sie auf dem obigen Screenshot sehen können, hat der Indikator auch eine Debugging-Ausgabe in der Befehlszeile. Wenn Sie irgendwelche Fehler finden, können Sie sie über das Terminal ausführen, herausfinden, welcher Fehler auftritt, und einen entsprechenden Fehlerbericht über Probleme einreichen Seite des GitHub des Projekts .

Momentan gibt es keine Unterstützung für Ecken (nur Kanten) und es wurde für Ein-Monitor-Setup gebaut (natürlich kann man nicht alle Basen innerhalb von 7 Stunden nach der Erstellung abdecken), aber diese Features könnten irgendwann in der Zukunft verfügbar sein.

Installation und Quellcode

Der Quellcode ist auf der Seite GitHub oder über Launchpad . Die Installation erfolgt über die folgenden Befehle im Terminal:

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
    
Sergiy Kolodyazhnyy 18.02.2017 22:24
quelle

Tags und Links