Redireccionar el comando para ejecutar una aplicación
La mayoría de las aplicaciones abren su ventana en la pantalla desde la que se iniciaron (ya sea desde Dash o desde el iniciador). Sin embargo, algunas aplicaciones no lo hacen, pero pueden verse obligadas a hacerlo, al redirigir el comando para ejecutar la aplicación a través del siguiente script. Para hacer eso, deberá editar el .desktop
archivo correspondiente (lanzador).
La configuración parece un poco complicada, pero si se sigue el procedimiento ("Cómo usar"), no debería ser demasiado difícil.
Cómo funciona
- El script lee la posición del mouse en el momento en que hace clic en el iniciador o elige la aplicación de Dash, y determina en qué pantalla está (izquierda / derecha).
- Posteriormente, espera a que aparezca la nueva ventana, propiedad de la aplicación (pid) que inició.
- Una vez que aparece la ventana, comprueba si la posición de la ventana (pantalla) coincide con la posición inicial del mouse (pantalla).
- Si no, mueve la ventana a la pantalla desde la que inició la aplicación. En la mayoría de los casos, la acción estará en una etapa (muy) temprana de la existencia de la ventana, por lo que ni siquiera lo notará.
Problema / solución
Hay un inconveniente: si reemplaza el comando principal.desktop
del archivo por el comando para llamar a este script, el clic derecho "abrir con" no funcionará correctamente. En el caso de un navegador web como Google Chrome, eso no será un problema demasiado grande. Con otras aplicaciones, una solución simple sería agregar la opción de abrir una nueva ventana en la pantalla actual como acceso directo (ver más abajo).
Cómo utilizar:
El script usa ambos wmctrl
y xautomation
:
sudo apt-get install xautomation
sudo apt-get install wmctrl
Cree un directorio ~/bin
si aún no existe.
Copie el script en un archivo vacío, guárdelo como open_oncurrent
(sin extensión) en~/bin
- Hazlo ejecutable (!)
Copie el .desktop
archivo correspondiente de /usr/share/applications
a ~/.local/share/applications
:
cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
Abra la copia local en ~/.local/share/applications
:
gedit ~/.local/share/applications/google-chrome.desktop
Edite el archivo (dos opciones):
Para cambiar el comando principal del lanzador:
Para agregar la opción como acceso directo (como en la imagen de arriba):
encuentra la línea:
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
reemplazarlo por:
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
Luego agregue la siguiente sección al final del archivo:
[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
Cómo usar con otras aplicaciones:
Del mismo modo, puede aplicar la solución a otras aplicaciones. La sintaxis del comando a usar en el .desktop
archivo es como el ejemplo:
Exec=/bin/bash -c "open_oncurrent <command>"
Una pequeña explicación adicional sobre cómo lidiar con las excepciones está en el script.
La secuencia de comandos
#!/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)