Umleiten des Befehls zum Ausführen einer Anwendung
Die meisten Anwendungen öffnen ihr Fenster auf dem Bildschirm, von dem aus sie initiiert wurden (entweder von Dash oder vom Launcher). Einige Anwendungen tun dies jedoch nicht, können jedoch dazu gezwungen werden, indem der Befehl zum Ausführen der Anwendung über das folgende Skript umgeleitet wird. Dazu müssen Sie die entsprechende .desktop
Datei (Launcher) bearbeiten .
Das Setup scheint etwas kompliziert zu sein, aber wenn das Verfahren befolgt wird ("How to use"), sollte es überhaupt nicht zu schwierig sein.
Wie es funktioniert
- Das Skript liest die Mausposition in dem Moment, in dem Sie auf den Starter klicken oder die Anwendung aus Dash auswählen, und bestimmt, auf welchem Bildschirm sich das befindet (links / rechts).
- Anschließend wird darauf gewartet, dass das neue Fenster angezeigt wird, das der von Ihnen gestarteten Anwendung (pid) gehört.
- Sobald das Fenster angezeigt wird, wird überprüft, ob die Position des Fensters (Bildschirm) mit der Ausgangsposition der Maus (Bildschirm) übereinstimmt.
- Wenn nicht, wird das Fenster auf den Bildschirm verschoben, von dem aus Sie die Anwendung gestartet haben. In den meisten Fällen befindet sich die Aktion in einem (sehr) frühen Stadium der Existenz des Fensters, sodass Sie sie nicht einmal bemerken.
Problem / Lösung
Es gibt einen Nachteil: Wenn Sie den Hauptbefehl der .desktop
Datei durch den Befehl zum Aufrufen dieses Skripts ersetzen, funktioniert der Rechtsklick auf "Öffnen mit" nicht ordnungsgemäß. Bei einem Webbrowser wie Google Chrome ist das kein allzu großes Problem. Bei anderen Anwendungen besteht eine einfache Lösung darin, die Option zum Öffnen eines neuen Fensters auf dem aktuellen Bildschirm als Verknüpfung hinzuzufügen (siehe weiter unten).
Wie benutzt man:
Das Skript verwendet beide wmctrl
und xautomation
:
sudo apt-get install xautomation
sudo apt-get install wmctrl
Erstellen Sie ein Verzeichnis, ~/bin
falls es noch nicht vorhanden ist.
Kopieren Sie das Skript in eine leere Datei und speichern Sie es als open_oncurrent
(keine Erweiterung) in~/bin
- Mach es ausführbar (!)
Kopieren Sie die entsprechende .desktop
Datei von /usr/share/applications
nach ~/.local/share/applications
:
cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
Öffnen Sie die lokale Kopie in ~/.local/share/applications
:
gedit ~/.local/share/applications/google-chrome.desktop
Bearbeiten Sie die Datei (zwei Optionen):
So ändern Sie den Hauptbefehl des Launchers:
So fügen Sie die Option als Verknüpfung hinzu (wie im obigen Bild):
finde die Zeile:
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
Ersetzen Sie es durch:
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
Fügen Sie dann den folgenden Abschnitt ganz am Ende der Datei hinzu:
[New window on this screen Shortcut Group]
Name=New window on this screen
Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
TargetEnvironment=Unity
Verwendung mit anderen Anwendungen:
Ebenso können Sie die Lösung auf andere Anwendungen anwenden. Die Syntax des in der .desktop
Datei zu verwendenden Befehls lautet wie im Beispiel:
Exec=/bin/bash -c "open_oncurrent <command>"
Eine kleine zusätzliche Erklärung zum Umgang mit Ausnahmen finden Sie im Skript.
Das Skript
#!/usr/bin/env python3
import subprocess
import sys
import time
import getpass
t = 0; user = getpass.getuser(); application = sys.argv[1]
"""
In most cases, the command to run an application is the same as the process
name. There are however exceptions, to be listed below, if you use these appli-
cations i.c.w. this script. Just add an item to the list in the format:
["<command>", "<process_name>"],
"""
exceptions = [
["/usr/bin/google-chrome-stable", "chrome"],
]
try:
procname = [app[1] for app in exceptions if app[0] == application][0]
except IndexError:
procname = application
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
# initial position of the mouse (click position)
start_pos = int(get("xmousepos").strip().split()[0])
# x- position of right side of the screen
x_res = [int(s.split("x")[0]) for s in get("xrandr").split() if s.endswith("+0+0")][0]
# current windows
start_windows = get("wmctrl -l")
# open application
subprocess.call(["/bin/bash", "-c", application+"&"])
while t < 30:
procs = get("ps -u "+user).splitlines()
new = [w for w in get("wmctrl -lpG").splitlines() if not w.split()[0] in start_windows]
match = sum([[line for line in procs if w.split()[2] in line and procname[:15] in line] for w in new], [])
if len(match) == 1:
data = new[0].split(); curr_pos = int(data[3]); compare = (start_pos > x_res, curr_pos > x_res)
if compare[0] == compare[1]:
pass
else:
if compare[0] == True:
data[3] = str(int(data[3])+x_res)
else:
data[3] = str(int(data[3])-x_res)
cmd1 = "wmctrl -r "+data[0]+" -b remove,maximized_vert,maximized_horz"
cmd2 = "wmctrl -ir "+data[0]+" -e 0,"+(",").join(data[3:7])
for cmd in [cmd1, cmd2]:
subprocess.Popen(["/bin/bash", "-c", cmd])
break
t = t + 1
time.sleep(0.5)