Ich mag Hot Corners wirklich. :-)
Ist es irgendwie möglich, einen benutzerdefinierten Befehl an einer Hot-Corner auszuführen, wie unten gezeigt?
Ich mag Hot Corners wirklich. :-)
Ist es irgendwie möglich, einen benutzerdefinierten Befehl an einer Hot-Corner auszuführen, wie unten gezeigt?
Antworten:
Installieren Sie den CompizConfig Settings Manager (CCSM). Im Terminal ausführen:
sudo apt-get install compizconfig-settings-manager
Öffnen Sie CCSM.
Geben Sie Ihren gewünschten Befehl in einen der Steckplätze ein. Z.B:
Gehen Sie zur Registerkarte "Kantenbindungen"
Klicken Sie auf "Keine" und legen Sie die gewünschte heiße Ecke (oder Kante) fest, die dem gerade festgelegten Befehl entspricht
Bewegen Sie die Maus in die Ecke
Jetzt wird dein Befehl ausgeführt!
Bestätigt am 14.04.
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:
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:
#!/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
Das Skript benötigt xdotool
sudo apt install xdotool
hotcorners2.py
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)
Führen Sie das Skript aus:
python3 /path/to/hotcorners2.py
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"
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):
Kleiner Unterschied, aber nur zum Spaß:
#!/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
Ist so ziemlich das Gleiche. Stellen Sie Ihre Befehle und den auszulösenden Radius im Kopfbereich des Skripts ein.
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.
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.
Der Indikator wird über eine ~/.edger-commands.json
Datei gesteuert , offensichtlich im json
Format. Es kann manuell vom Benutzer geschrieben oder über die DEFINE COMMANDS
Option 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, json
erfordert 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.
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.
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