Non ho trovato un'impostazione "segreta" per modificare il comportamento del comportamento, a quanto sembra, progettato. Sembra infatti che lo schermo di sinistra sia considerato lo schermo di "base".
È comunque molto possibile creare una soluzione alternativa, con essenzialmente lo stesso risultato. È possibile creare uno script che, in occasione della connessione di una seconda schermata, elenca tutte le finestre. Successivamente, tutte le finestre che vengono spostate inizialmente sullo schermo di sinistra, vengono spostate di nuovo sullo schermo di destra, entro un secondo o due. Le dimensioni di tutte le finestre verranno mantenute.
Questo è ciò che fa lo script qui sotto.
Due versioni
Puoi ripristinare le finestre organizzate in due modi:
- Occasionalmente, con un tasto di scelta rapida da eseguire dopo aver collegato la seconda schermata.
- Automaticamente, eseguendo lo script in background, in attesa che lo schermo sia collegato.
Come usare
preparativi
Installare wmctrl
sudo apt-get install wmctrl
Cerca i nomi dei tuoi due schermi con l'aiuto di xrandr
, i nomi degli schermi saranno appena prima della parola "connesso".
Copia Uno dei seguenti script, nella sezione head, sostituisce in queste due righe i nomi delle schermate con quelli corretti:
screen_1 = "LVDS1" # your main screen (laptop)
screen_2 = "VGA1" # secundary screen (on the left)
salva lo script come move_windows.py
Assicurati che nelle impostazioni di visualizzazione la schermata secondaria sia a sinistra. Le linee superiori delle due schermate devono essere allineate (come nella prima immagine della domanda).
Esegui lo script
: se si utilizza quello per l'esecuzione occasionale, eseguirlo dopo aver collegato la seconda schermata.
python3 /path/to/move_windows.py
Potresti volerlo aggiungere a una scorciatoia da tastiera se pensi che faccia quello che dovrebbe fare, Scegli: Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Scorciatoie personalizzate". Fai clic su "+" e aggiungi il comando:
Se si utilizza quello per l'esecuzione in background, eseguirlo anche con il comando:
python3 /path/to/move_windows.py
Se funziona come previsto, aggiungilo alle applicazioni di avvio: Dash> Applicazioni di avvio> Aggiungi
Ho testato la sceneggiatura con il mio laptop (a destra) e due diversi schermi (a sinistra). Il risultato è stato lo stesso.
schermo del computer portatile
connettersi senza script
connettersi con lo script in esecuzione
Dopo che lo script ha fatto il suo lavoro, Windows sarà "lasciato solo" (ovviamente) e potrai sistemare le finestre a modo tuo.
La sceneggiatura
1. Versione "Manuale", da eseguire dopo aver collegato lo schermo
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
shift_windows(get_shift(get("xrandr")))
2. Versione automatica, per l'esecuzione in background
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
while True:
try:
screen_info1 = get("xrandr")
time.sleep(5)
screen_info2 = get("xrandr")
check = screen_2+" connected"
if (check in screen_info1, check in screen_info2) == (False, True):
time.sleep(5)
shift_windows(get_shift(screen_info2))
except:
pass