A solução abaixo funciona da seguinte maneira:
- Pressione uma combinação de teclas
- O primeiro aplicativo que inicia dentro de 15 segundos será iniciado na tela 1
ou:
- Pressione uma combinação de teclas (nother)
- O primeiro aplicativo que inicia dentro de 15 segundos será iniciado na tela 2
Em outras palavras: você precisará de duas combinações de teclas para garantir que uma nova janela de aplicativo apareça na primeira ou na segunda tela.
Como configurar
O script usa xdotool
e wmctrl
:
sudo apt-get install xdotool
sudo apt-get install wmctrl
Então:
- Copie o script abaixo em um arquivo vazio, salve-o como
preferred_screen
(sem extensão) em~/bin
. Crie o diretório, se necessário. - Torne o script executável
- Na seção principal, defina a resolução horizontal da tela esquerda (eu já configurei para você para 1600)
-
Se você acabou de criar o diretório
~bin
, execute em um terminal:source ~/.profile
-
Teste-execute o script executando em uma janela de terminal o comando:
preferred_screen 1
Agora abra um aplicativo (qualquer), ele deve abrir na primeira tela
Repita o passo com o comando:
preferred_screen 2
agora o aplicativo deve ser aberto na segunda tela.
-
Se tudo funcionar bem, adicione os dois comandos a duas combinações de teclas diferentes: Escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione os comandos:
preferred_screen 1 preferred_screen 2
O script
#!/usr/bin/env python3
import subprocess
import time
import sys
#--- enter the horizontal resolution of the left screen below
left_width = 1600
#---
target_screen = int(sys.argv[1])
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8")
def new_window(left_width):
w_list1 = get(["wmctrl", "-lG"]).splitlines()
while True:
time.sleep(1)
w_list2 = get(["wmctrl", "-lG"]).splitlines()
new = [w.split() for w in w_list2 if not w in w_list1]
if len(new) != 0:
data = new[0]
pos = 1 if int(data[2]) < left_width else 2
coords = data[2:4]
w_id = data[0]
return [w_id, pos, coords]
break
subject = new_window(left_width)
if not int(subject[1]) == target_screen:
move = -left_width if target_screen == 1 else left_width - int(subject[2][0])
subprocess.Popen(["xdotool", "windowmove", subject[0], str(int(subject[2][0])+move), subject[2][1]])
Explicação
Invadir o processo de inicialização em si não pareceu uma solução limpa para mim nessa situação, então a solução abaixo funciona em uma base "acidental" (somente quando você o chama de uma combinação de teclas).
Se o script for chamado, ele espera por 15 segundos para que uma nova janela apareça e a move para a tela direita ou esquerda (se ainda não estiver na tela de segmentação) e, em seguida, termina. Após 15 segundos, termina de qualquer maneira para evitar a execução infinita se nenhuma janela aparecer.
Nota
O script assume que as telas são top-alinhadas. Se houver uma grande diferença, o script pode precisar de alguns ajustes para evitar que as janelas "colidam" na borda da outra tela.