Eu conectei um LCD ao meu laptop. Quando tento abrir um arquivo no Nautilus, o aplicativo de destino é aberto na tela do meu laptop, em vez da segunda tela (na qual a janela do Nautilus está aberta).
Não quero alterar a exibição padrão. Quero abrir janelas na tela em que estou trabalhando. Se meu gerenciador de arquivos estiver na tela do laptop, quero que os aplicativos sejam abertos na tela do laptop. Se meu gerenciador de arquivos estiver em um monitor externo, espero abrir arquivos lá.
A saída 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)
Responder1
O comportamento que você descreve (abrindo a janela na tela atual)deveseja 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 uma opção "limpar" disponível (correção), você poderá usar a solução alternativa abaixo.
Existe um script em segundo plano, procurando que novas janelas apareçam. Caso exista 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 é movida, usando o xdotool
comando windowmove`.
Um script de fundo é uma má ideia?
Se você não precisa de um script de segundo plano, não o use.
Ao mesmo tempo: se adicionar funcionalidades importantes e/ou economizar seu tempo, seria tolice não fazê-lo,seo roteiro é bem organizado e, portanto, "com pouco combustível".
Como referência: tanto no meu laptop quanto no meu desktop, executo constantementepelo menos5 scripts de fundo + ocasionalmente alguns adicionais para fins de teste, semqualquerperceber.
O que é feito para economizar combustível:
- O script tem um ciclo de loop variável
Uma vez a cada 10 segundos, o script verifica se a segunda tela está conectada. Caso contrário, o script ignora todo o procedimento de verificação da janela e verifica novamente após 10 segundos. Isso significa que o roteiroapenasatua se uma segunda tela estiver anexada. Assim que uma segunda tela for conectada, em 10 segundos, o loop será alterado para um período de 2 segundos. - Todas as (próximas) ações que o script executa são condicionais
por exemplo, a posição do mouse éapenasverificadosehá novas janelas etc.
Todos juntos, no meu sistema não consegui perceber nem medirqualquercarga adicional, como resultado do script.
O roteiro
#!/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 de ambos
wmctrl
exdotool
. Execute em um terminal:sudo apt-get install xdotool wmctrl
- Copie o script em um arquivo vazio e 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 a Aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:
/bin/bash -c "sleep 15 && python3 /path/to/move_windows.py"