Abra la ventana de la aplicación en la misma pantalla donde se inició

8

Estoy usando una configuración de pantalla dual. Ubuntu 14.10 / Unidad. Cada pantalla tiene su propio lanzador / tablero. Las aplicaciones predeterminadas como Firefox, nautilus, terminal y thunderbird aparecen en la pantalla donde he usado el iniciador. Entonces ... cuando uso el iniciador para Firefox en la pantalla derecha, el navegador se abre en la pantalla lateral derecha. Como debería ser.

Me gustaría ese comportamiento con otras aplicaciones como Google Chrome. Parece que no puedo encontrar una solución adecuada.

Digiplace
fuente

Respuestas:

5

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 .desktoparchivo 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).

<imagen>

Cómo utilizar:

  • El script usa ambos wmctrly xautomation:

    sudo apt-get install xautomation
    sudo apt-get install wmctrl
    
  • Cree un directorio ~/binsi 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 .desktoparchivo correspondiente de /usr/share/applicationsa ~/.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):

    1. Para cambiar el comando principal del lanzador:

      • encuentra la línea:

        Exec=/usr/bin/google-chrome-stable %U
        
      • cámbielo a

        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        
    2. 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 .desktoparchivo 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)
Jacob Vlijm
fuente
Gracias, esto funciona. Noto un segundo ícono de Google Chrome en el iniciador cuando estoy abierto.
Digiplace
6

Unity usa Compiz como administrador de composición, y eso tiene todo tipo de complementos para este tipo de cosas. Para simplificar y resumir la historia sin desordenar en la línea de comandos, instale Compiz Config Settings Manager (con sudo apt-get install compizconfig-settings-managero a través del Centro de software) y busque y Place Windowsasegúrese de que esté marcado

ingrese la descripción de la imagen aquí

Bajo ese complemento habrá varias opciones para Multi Output Mode. Lo que queremos es Use output device of focused window. Por lo tanto, colocará una ventana de archivo abierta donde sea que esté su administrador ingrese la descripción de la imagen aquí

Sergiy Kolodyazhnyy
fuente