A boa notícia é que a resolução y de todas as telas é a mesma, e as telas são alinhadas verticalmente, então não precisamos cuidar de possíveis conflitos na posição y, como aqui .
Mover janelas em várias telas, usando a tela como um argumento
Abaixo de um script para disponibilizar sob três (para três telas) teclas de atalho. Ao pressionar as teclas, você pode mover as janelas para a tela 1, 2 ou 3. O script calcula em qual tela a janela está ativada e a distância em que a janela deve ser movida.
O script
#!/usr/bin/env python3
import subprocess
import sys
target = int(sys.argv[1])
# --- for Unity, there is a deviation in the y coordinate of the wmctrl -command
# --- for Unity, set: deviation = -28
deviation = 0
# ---
# get the (sorted) x resolution of the screens as a list
screens = [int(s.split("+")[-2]) for s in subprocess.check_output(
["xrandr"]).decode("utf-8").split() if (s).count("+") == 2]
screens.sort()
# get the frontmost window and its coordinates
frontmost = [l.split("#")[-1].strip() for l in subprocess.check_output([
"xprop", "-root"]).decode("utf-8").splitlines() if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0]
active = frontmost[:2]+(10-len(frontmost))*"0"+frontmost[2:]
windata = [l.split() for l in subprocess.check_output(
["wmctrl", "-lG"]).decode("utf-8").splitlines() if active in l][0]
# get the current screen the window is on, and (thus) the x-position (of the screen)
currscreen = len([cr for cr in screens if cr <= int(windata[2])])
currpos = sum([item for item in screens[:currscreen]])
# calculate the target position/the distance to move the window
target_pos = screens[target-1]
move = target_pos-currpos
command = ["wmctrl", "-ir", active, "-e", "0,"+(",").join(
[str(int(windata[2])+move), str(int(windata[3])-28), windata[4], windata[5]])]
# move the window to the targeted screen
subprocess.Popen(command)
Como usar
-
O script precisa de
wmctrl
:sudo apt-get install wmctrl
-
Copie o script em um arquivo vazio, salve-o como
move_window.py
-
Teste- execute o script executando-o em uma janela de terminal, com os comandos:
python3 /path/to/move_window.py 1
Para mover a janela ativa para a tela 1,
python3 /path/to/move_window.py 2
Para mover a janela ativa para a tela 2,
python3 /path/to/move_window.py 3
Para mover a janela ativa para a tela 3
Comooterminalésuajanelaativa,eledevesemoverpelastelasnoscomandos.
- Adicioneatrêsteclasdeatalhodiferentes,porex.Ctrl+Alt+1,2e3:escolha:Configuraçõesdosistema>"Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o (s) comando (s)
Notas
- A questão estava no Gnome, mas o roteiro também deveria funcionar no (pelo menos) Unity. No entanto, há um desvio quando usado no Unity, como explicado na seção head do script e aqui .
- Como o script obtém as informações de tela de
xrandr
, ele deve funcionar também com 2, 3, 4 ou qualquer número de telas.