Não encontrei uma configuração "secreta" para alterar o comportamento do comportamento projetado, ao que parece. Parece mesmo que a tela esquerda é considerada a tela "base".
No entanto, é muito bem possível criar uma solução alternativa, com essencialmente o mesmo resultado. Você pode criar um script que, na ocasião de conectar uma segunda tela, liste todas as janelas. Posteriormente, todas as janelas que são movidas inicialmente para a tela esquerda, voltam para a tela à direita, dentro de um ou dois segundos. O tamanho de todas as janelas será preservado.
É isso que o script abaixo faz.
Duas versões
Você pode restaurar suas janelas organizadas de duas maneiras:
- Ocasionalmente, com uma tecla de atalho para executar após a segunda tela ser conectada.
- Automaticamente, executando o script em segundo plano, aguardando a conexão da tela.
Como usar
preparações
Instalar wmctrl
sudo apt-get install wmctrl
Procure os nomes das duas telas com a ajuda de xrandr
, os nomes das telas estarão logo antes da palavra "conectado".
Copiar Qualquer um dos scripts abaixo, na seção head, substitui nessas duas linhas os nomes de tela pelos corretos:
screen_1 = "LVDS1" # your main screen (laptop)
screen_2 = "VGA1" # secundary screen (on the left)
salve o script como move_windows.py
Certifique-se de que, nas configurações de exibição, sua tela secundária esteja à esquerda. As linhas superiores das duas telas precisam estar alinhadas (como na primeira imagem da sua pergunta).
Execute o script
- Se você usar um para executar ocasionalmente, execute-o após a segunda tela estar conectada.
python3 /path/to/move_windows.py
Convém adicioná-lo a um atalho de teclado, se achar que ele faz o que deve ser feito, escolha: Configurações do sistema> "Teclado"> "Atalhos"> "Atalhos personalizados". Clique no "+" e adicione o comando:
Se você usar esse para executar em segundo plano, execute-o também pelo comando:
python3 /path/to/move_windows.py
Se ele funcionar como você pretendia, adicione-o aos aplicativos de inicialização: Dash> Startup Applications> Add
Testei o script com meu laptop (à direita) e duas telas diferentes (à esquerda). O resultado foi o mesmo.
tela do laptop
conectando sem script
conectando com o script em execução
Depois que o script fez seu trabalho, as janelas serão "deixadas em paz" (é claro), e você poderá organizá-las à sua maneira.
Os scripts
1. Versão "Manual", a ser executada após a conexão da tela
#!/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. Versão automática, para executar em segundo plano
#!/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