Kann ich Hot Corners so einstellen, dass benutzerdefinierte Befehle in Unity ausgeführt werden?

13

Ich mag Hot Corners wirklich. :-)

Ist es irgendwie möglich, einen benutzerdefinierten Befehl an einer Hot-Corner auszuführen, wie unten gezeigt?

Bildbeschreibung hier eingeben

orschiro
quelle
Ich denke nicht, dass es mit Hotcornern möglich ist (zumindest nicht mit der Art und Weise, wie Unity sie verwendet), aber es ist möglich, Skripte auszulösen, wenn die Maus in einem bestimmten Bereich des Bildschirms platziert wird. Siehe zum Beispiel askubuntu.com/a/758307/295286 , Abschnitt Maus über Aktion. Ich werde mehr über Hotcorners nachdenken, aber wenn diese nicht funktionieren, ist das benutzerdefinierte Skript in Ordnung?
Sergiy Kolodyazhnyy
Multi-Monitor oder Single?
Jacob Vlijm
Hallo Orschiro, gepostet. Bitte erwähnen Sie, ob alles klar ist (oder nicht).
Jacob Vlijm
Hey, ich sehe, dass es hier mehr heiße Corners gibt als in meiner Antwort. Wie viele würden Sie bevorzugen?
Jacob Vlijm
2
@JacobVlijm, Serg, Siehe meine Antwort.
wjandrea

Antworten:

10

CCSM

  1. Installieren Sie den CompizConfig Settings Manager (CCSM). Im Terminal ausführen:

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

  3. Gehe zu "Befehle"
  4. Geben Sie Ihren gewünschten Befehl in einen der Steckplätze ein. Z.B:

    CCSM Screenshot - Befehl

  5. Gehen Sie zur Registerkarte "Kantenbindungen"

  6. Klicken Sie auf "Keine" und legen Sie die gewünschte heiße Ecke (oder Kante) fest, die dem gerade festgelegten Befehl entspricht

    CCSM-Screenshot - heiße Ecken

  7. Bewegen Sie die Maus in die Ecke

  8. Jetzt wird dein Befehl ausgeführt!

    CCSM-Screenshot - Befehl wird ausgeführt

Bestätigt am 14.04.

wjandrea
quelle
Einfachste aller vorgeschlagenen Lösungen. Wenn der gewünschte Befehl durch ein Skript besser verwirklicht werden kann, als den compiz-Befehl auf dieses Skript zu verweisen, oder wenn sich das Skript in einem bin-Ordner in $ PATH befindet. Der einzige mögliche Nachteil ist, dass Unity / Compiz bekanntermaßen zufällig vom Benutzer festgelegte Befehle "verliert", dh diejenigen, die nicht integriert sind. Die Integration eines Benutzerbefehls würde den Rahmen dieser Frage sprengen.
Doug
@wjandrea Also es wird doch umgesetzt. Compiz ergreift nicht, um mich zu überraschen. Gute Antwort, am besten passend für das, was OP sucht. + 1'ed
Sergiy Kolodyazhnyy
Leider hast du recht, haha. Ja genau das, wonach OP gefragt hat.
Jacob Vlijm
Sie haben mir einige Male mit Ihren Bearbeitungen und Antworten geholfen. Haben Sie einen "Keks", wie ole'Serg sagte ... in der Tat haben ein halbes Dutzend :)
WinEunuuchs2Unix
6

Benutzerdefinierte Befehle

Wenn Sie Unity verwenden und ccsm installiert haben, ist die Antwort von wjandrea natürlich Ihre Antwort. Wenn nicht , oder die Verwendung auf anderen Distributionen, könnte eine leichte Alternative nützlich sein.

Mit dem folgenden Skript können Sie jeden Befehl festlegen , der für jeden Ihrer Hotcorners spezifisch ist.

Als Beispiel habe ich folgendes Setup gemacht:

  • Oben links Keine Aktion
  • Führen Sie Gedit oben rechts aus
  • Unten links Keine Aktion
  • Unten RightRun Gnome-Terminal

Natürlich können Sie die Befehle auch externe Skripte ausführen lassen.

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:

Bildbeschreibung hier eingeben

Das Drehbuch

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

Installieren

  1. Das Skript benötigt xdotool

    sudo apt install xdotool
  2. Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter hotcorners2.py
  3. Stellen Sie im Kopf des Skripts Ihre Befehle ein (beachten Sie die Anführungszeichen)

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

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

  4. Führen Sie das Skript aus:

    python3 /path/to/hotcorners2.py
  5. Wenn alles funktioniert, fügen Sie zu Startup Applications Folgendes hinzu: Dash> Startup Applications> Add. Fügen Sie den Befehl hinzu:

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

Anmerkungen

  • Das Skript wird derzeit auf dem (ersten) Bildschirm ausgeführt. Es kann leicht bearbeitet werden, um sich um mehrere Bildschirme zu kümmern.
  • Wenn ein paar Leute es mögen, können wir eine GUI und eine PPA für die bequeme Nutzung und einfache Installation hinzufügen.

BEARBEITEN

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

Bildbeschreibung hier eingeben

Kleiner Unterschied, aber nur zum Spaß:

Das Drehbuch

#!/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 so ziemlich das Gleiche. Stellen Sie Ihre Befehle und den auszulösenden Radius im Kopfbereich des Skripts ein.

Jacob Vlijm
quelle
5

HINWEIS:

Die Antwort von wjandrea ist die am besten geeignete Antwort für jemanden, der Ubuntu oder Ubuntu Kylin verwendet (oder compiz als Display-Manager hat). Die unten angegebene Antwort kann auch für Unity verwendet werden, ist jedoch wahrscheinlich etwas redundant. In Desktop-Umgebungen ohne compiz kann jedoch der unten dargestellte Indikator verwendet werden. Ich habe es kurz in Lubuntu 16.04 VM getestet, damit ich weiß, dass es dort funktioniert, und habe es auch mit Kylin 14.04 kompatibel gemacht. Für GNOME- und MATE-Desktops muss zuerst die Unterstützung für AppIndicators aktiviert werden, damit Indikatoren verwendet werden können.

Einführung

Ich habe eine Funktion implementiert indicator-edger, mit der benutzerdefinierte Befehle basierend auf der Mausposition an einer beliebigen Stelle entlang der vier Bildschirmränder ausgelöst werden können. Die ursprüngliche Version wurde innerhalb eines Tages, in ungefähr 7 Stunden, fertiggestellt, daher ist sie ziemlich minimalistisch, erledigt aber die Arbeit.

Bildbeschreibung hier eingeben

Der Indikator wird über eine ~/.edger-commands.jsonDatei gesteuert , offensichtlich im jsonFormat. Es kann manuell vom Benutzer geschrieben oder über die DEFINE COMMANDSOption des Indikators eingestellt werden . Die Aktivierungs- / Deaktivierungs-Auslöseoption wird gespeichert und automatisch in die Datei geschrieben, um dem Benutzer den Zugriff zu erleichtern. Die Beispielkonfigurationsdatei sieht folgendermaßen aus:

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

Beachten Sie den "left"Eintrag in der Datei. Diese Kante ist nicht gesetzt, jsonerfordert jedoch aufgrund der Syntax eine leere Zeichenfolge, dh Anführungszeichen "".

Sobald der Indikator feststellt, dass der Benutzer die Maus an einer der Kanten platziert hat (mit einem Rand von ~ 3 Pixel), sendet der Indikator eine Blasenbenachrichtigung und führt den entsprechenden Befehl aus (falls definiert). Die Aktivierung des Auslösers wird erst wiederholt, wenn der Benutzer die Maus vom Rand wegbewegt.

Bildbeschreibung hier eingeben

Wie Sie dem obigen Screenshot entnehmen können, enthält der Indikator auch Debugging-Ausgaben in der Befehlszeile. Wenn Sie Fehler finden, können Sie diese auf dem Terminal ausführen, herausfinden, welcher Fehler auftritt, und den entsprechenden Fehlerbericht auf der Seite mit den Problemen des GitHub-Projekts einreichen .

Gegenwärtig gibt es keine Unterstützung für Ecken (nur Kanten) und es wurde für die Einrichtung mit einem Monitor entwickelt (offensichtlich kann man nicht alle Basen innerhalb von 7 Stunden nach der Erstellung abdecken), aber diese Funktionen könnten später verfügbar sein.

Installations- und Quellcode

Der Quellcode ist auf der GitHub- Seite des Projekts oder über Launchpad verfügbar . 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
quelle