Reindirizzamento del comando per eseguire un'applicazione
La maggior parte delle applicazioni apre la finestra sullo schermo da cui sono state avviate (da Dash o dal programma di avvio). Alcune applicazioni tuttavia non lo fanno, ma possono essere forzate, reindirizzando il comando per eseguire l'applicazione tramite lo script seguente. Per fare ciò, dovrai modificare il .desktop
file corrispondente (launcher).
L'installazione sembra un po 'complicata, ma se si segue la procedura ("Come usare"), non dovrebbe essere affatto troppo difficile.
Come funziona
- Lo script legge la posizione del mouse nel momento in cui fai clic sul pulsante di avvio o scegli l'applicazione da Dash e determina su quale schermo si trova (sinistra / destra).
- Successivamente, attende che appaia la nuova finestra, di proprietà dell'applicazione (pid) avviata.
- Una volta visualizzata la finestra, controlla se la posizione della finestra (schermo) corrisponde alla posizione iniziale del mouse (schermo).
- In caso contrario, sposta la finestra sullo schermo da cui è stata avviata l'applicazione. Nella maggior parte dei casi, l'azione sarà in una fase (molto) precoce dell'esistenza della finestra, quindi non la noterai nemmeno.
Problema / soluzione
C'è un aspetto negativo: se si sostituisce il comando principale.desktop
del file con il comando per chiamare questo script, il clic destro "apri con" non funzionerà correttamente. Nel caso di un browser web come Google Chrome, questo non sarà un grosso problema. Con altre applicazioni, una soluzione semplice sarebbe quella di aggiungere un'opzione per aprire una nuova finestra nella schermata corrente come collegamento (vedere più avanti).
Come usare:
Lo script utilizza sia wmctrl
e xautomation
:
sudo apt-get install xautomation
sudo apt-get install wmctrl
Crea una directory ~/bin
se non esiste ancora.
Copia lo script in un file vuoto, salvalo come open_oncurrent
(nessuna estensione) in~/bin
- Renderlo eseguibile (!)
Copia il .desktop
file corrispondente da /usr/share/applications
a ~/.local/share/applications
:
cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
Apri la copia locale in ~/.local/share/applications
:
gedit ~/.local/share/applications/google-chrome.desktop
Modifica il file (due opzioni):
Per modificare il comando principale del programma di avvio:
Per aggiungere l'opzione come scorciatoia (come nell'immagine sopra):
trova la linea:
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
sostituirlo con:
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
Quindi aggiungi la seguente sezione alla fine del file:
[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
Come usare con altre applicazioni:
Allo stesso modo, è possibile applicare la soluzione ad altre applicazioni. La sintassi del comando da utilizzare nel .desktop
file è come nell'esempio:
Exec=/bin/bash -c "open_oncurrent <command>"
Una piccola spiegazione aggiuntiva su come gestire le eccezioni è nello script.
Il copione
#!/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)