¿Cómo abrir un archivo en la misma pantalla en la que estoy trabajando?

¿Cómo abrir un archivo en la misma pantalla en la que estoy trabajando?

He conectado una pantalla LCD a mi computadora portátil. Cuando intento abrir un archivo en Nautilus, la aplicación de destino se abre en la pantalla de mi computadora portátil, en lugar de en la segunda pantalla (en la que está abierta la ventana de Nautilus).

No quiero cambiar la visualización predeterminada. Quiero abrir ventanas en la pantalla en la que estoy trabajando. Si mi administrador de archivos está en la pantalla de la computadora portátil, quiero que las aplicaciones se abran en la pantalla de la computadora portátil. Si mi administrador de archivos está en una pantalla externa, espero abrir archivos allí.

La salida dexrandr

Screen 0: minimum 320 x 200, current 3286 x 1080, maximum 32767 x 32767
eDP1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 256mm x 144mm
   1366x768       60.1*+
   1360x768       59.8     60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected primary 1920x1080+1366+0 (normal left inverted right x axis y axis) 527mm x 296mm
   1920x1080      60.0*    50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1280x800       59.9  
   1152x864       75.0  
   1280x720       60.0     50.0     59.9  
   1440x576i      50.1  
   1024x768       75.1     70.1     60.0  
   1440x480i      60.1     60.1  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   720x576        50.0  
   720x480        60.0     59.9  
   640x480        75.0     72.8     66.7     60.0     59.9  
   720x400        70.1  
DP1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Respuesta1

El comportamiento que describe (abrir la ventana en la pantalla actual)deberíaserá el comportamiento predeterminado. En mi 14.04 es así.

Debido a incompatibilidades menores con algunas combinaciones de controlador de gráficos/GPU, en algunos casos pueden ocurrir "peculiaridades". Si no hay una opción "limpiar" disponible (corregir), puede utilizar la siguiente solución.
Existe un script en segundo plano, que busca que aparezcan nuevas ventanas. En caso de que exista una nueva ventana, el script compara la posición de la ventana con la posición actual del mouse. Si tanto el mouse como la nueva ventana no están en la misma pantalla, la ventana se mueve usando el xdotoolcomando windowmove`.

¿Es un guión de fondo una mala idea?

Si no necesita un script en segundo plano, no lo use.
Al mismo tiempo: si añade funcionalidad importante y/o le ahorra tiempo, sería una tontería no hacerlo.siel guión está bien organizado y por lo tanto "tiene poco combustible".

Como referencia: tanto en mi laptop como en mi Desktop, ejecuto constantementeal menos5 scripts en segundo plano + ocasionalmente algunos adicionales para fines de prueba, sincualquieraviso.

Qué se hace para ahorrar combustible:

  1. El script tiene un ciclo de bucle variable.
    Una vez cada 10 segundos, el script comprueba si la segunda pantalla está conectada. De lo contrario, el script omite todo el procedimiento de verificación de la ventana y vuelve a verificar después de 10 segundos. Esto significa que el guiónsoloactúa si se adjunta una segunda pantalla. Una vez conectada una segunda pantalla, en 10 segundos, el bucle cambia a un período de 2 segundos.
  2. Todas las (siguientes) acciones que realiza el script son condicionales
    por ejemplo, la posición del ratón essolocomprobadosihay ventanas nuevas, etc.

En total, en mi sistema no pude notarlo ni medirlo.cualquiercarga adicional, como resultado del script.

La secuencia de comandos

#!/usr/bin/env python3
import subprocess
import time

def get(cmd):
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def screen_limit():
    screendata = [s for s in get("xrandr").split() if s.count("+") == 2]
    if len(screendata) == 2:
        return int([s.split("x")[0] for s in screendata if "+0+0" in s][0])

wd1 = get(["wmctrl", "-lG"])

t = 0
while True:
    time.sleep(2)
    # once per 10 seconds, check for a second screen
    if t == 0: 
        while True:
            rightside = screen_limit()
            # if no second screen, skip the procedure
            if rightside == None:
                time.sleep(10)
            else:
                break
    wd2 = get(["wmctrl", "-lG"])
    # check for buggy wmctrl
    if all([wd2 != None, wd1 != None]):
        wins = [w.split() for w in wd2.splitlines()]
        # check for new windows
        relevant = [w for w in wins if not w[0] in wd1]
        if relevant:
            # if new windows appeared, see if they match the mouse pos
            mousepos = int(get([
                "xdotool", "getmouselocation"
                ]).split()[0].split(":")[1])
            for w in relevant:
                check = [mousepos < rightside, int(w[2]) < rightside]
                if check[0] != check[1]:
                    # if mouse and window are not on the same screen > move
                    if check[0] == False:
                        cmd = ["xdotool", "windowmove", w[0],
                            str(int(w[2]) + rightside), w[3]]                    
                    else:
                        cmd = ["xdotool", "windowmove", w[0],
                            str(int(w[2]) - rightside), w[3]]
                    subprocess.Popen(cmd)
    wd1 = wd2
    t = 0 if t == 10 else t
    t += 1

Cómo utilizar

  1. El guión necesita ambos wmctrly xdotool. Ejecutar en una terminal:

    sudo apt-get install xdotool wmctrl
    
  2. Copie el script en un archivo vacío, guárdelo comomove_windows.py
  3. Pruebe: ejecute el script con el comando:

    python3 /path/to/move_windows.py
    
  4. Si todo funciona como se esperaba, agréguelo a Aplicaciones de inicio: Tablero > Aplicaciones de inicio > Agregar. Agregue el comando:

    /bin/bash -c "sleep 15 && python3 /path/to/move_windows.py"
    

información relacionada