O comportamento que você descreve (abrindo a janela na tela atual) deve ser o comportamento padrão, no meu 14.04 é assim.
Devido a pequenas incompatibilidades com algumas combinações de driver gráfico / GPU, "peculiaridades" podem ocorrer em alguns casos. Se não houver nenhuma opção "limpa" disponível (correção), você poderá usar a solução alternativa abaixo.
Existe um script de segundo plano, procurando novas janelas para aparecer. No caso de existir uma nova janela, o script compara a posição da janela com a posição atual do mouse. Se o mouse e a nova janela não estiverem na mesma tela, a janela será movida usando o comando xdotool
windowmove '.
Um script de segundo plano é uma má ideia?
Se você não precisa de um script de segundo plano, não o use.
Ao mesmo tempo: se adicionar funcionalidade importante e / ou poupar tempo, seria tolo não, se o script está bem organizado e, portanto, "baixo consumo de combustível ".
Como referência: tanto no meu laptop como no meu Desktop, eu constantemente corro pelo menos 5 scripts de background + ocasionalmente alguns adicionais para fins de teste, sem nenhum aviso.
O que é feito para economizar combustível:
-
O script tem um ciclo de loop variável
Uma vez por 10 segundos, o script verifica se a segunda tela está conectada. Caso contrário, o script pula o procedimento de verificação da janela inteira e verifica novamente após 10 segundos. Isso significa que o script somente atua se uma segunda tela for anexada. Quando uma segunda tela é conectada, em 10 segundos, o loop é alterado para um período de 2 segundos. -
Todas as ações (seguintes) que o script toma são condicionais
por exemplo. a posição do mouse é somente verificada se houver novas janelas, etc.
Todos juntos, no meu sistema, eu não pude notar nem medir qualquer carga adicional, como resultado do script.
O script
#!/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
Como usar
-
O script precisa dos dois
wmctrl
exdotool
. Executar em um terminal:sudo apt-get install xdotool wmctrl
- Copie o script em um arquivo vazio, salve-o como
move_windows.py
-
Teste- execute o script pelo comando:
python3 /path/to/move_windows.py
-
Se tudo funcionar conforme o esperado, adicione-o aos aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:
/bin/bash -c "sleep 15 && python3 /path/to/move_windows.py"