1. Script para trocar todas as janelas da tela 1 - > tela 2 e vice-versa
O script assume que as telas são da mesma resolução vertical , e a tela esquerda é a principal. As resoluções horizontais de ambas as telas são pesquisadas pelo script.
Como configurar
O script precisa de wmctrl
para ser instalado:
sudo apt-get install wmctrl
- Copie o script abaixo em um arquivo vazio, salve-o como
swap_windows
(sem extensão) em~/.bin
. Crie o diretório se ele já não existir e torne o script executável . - Se você acabou de criar o diretório
~/bin
(ainda não existe), efetue logout / in ou execute em um terminal:source ~/.profile
. -
teste execute o script com o comando:
swap_windows
-
Se tudo funcionar conforme o esperado, adicione a tecla de atalho; escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando
O script
#!/usr/bin/env python3
import subprocess
import sys
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shiftright(xr_output):
lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def get_shiftleft(xr_output):
lines = [l for l in xr_output.splitlines() if "+0" in l and not "+0+0" in l][0].split()
return -int([it for it in lines if "x" in it][0].split("x")[0])
def swap_windows():
xr_output = get("xrandr")
shift_r = get_shiftright(xr_output)
shift_l = get_shiftleft(xr_output)
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
for w in w_data:
props = get("xprop -id "+w[0])
if any(["_TYPE_NORMAL" in props, "TYPE_DIALOG" in props]):
if 0 < int(w[2]) < shift_r:
shift = shift_r
elif shift_r-shift_l > int(w[2]) >= shift_r:
shift = -shift_r
else:
shift = 0
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
swap_windows()
2. Script para mover (todas) as janelas de um monitor para o outro
O script abaixo move as janelas em uma configuração de monitor duplo de uma tela para outra:
-
do monitor da esquerda para a direita - >
ou
-
do monitor da direita para a esquerda < -
Dependendo do argumento, você o executa com ( left
ou right
)
O script (novamente) assume que as telas são da mesma resolução vertical , e a tela esquerda é a principal. As resoluções horizontais de ambas as telas são pesquisadas pelo script.
Como configurar
O script precisa de wmctrl
para ser instalado:
sudo apt-get install wmctrl
- Copie o script abaixo em um arquivo vazio, salve-o como
shift_windows
(sem extensão) em~/.bin
. Crie o diretório se ele já não existir e torne o script executável . - Se você acabou de criar o diretório
~/bin
(ainda não existe), efetue logout / in ou execute em um terminal:source ~/.profile
. -
teste execute o script com os comandos
shift_windows right
e: shift_windows restantes
No primeiro caso, as janelas na sua tela esquerda devem se mover para a tela direita e, no segundo caso, vice-versa.
- Se tudo funcionar conforme esperado, adicione o script a duas combinações de atalhos: escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione os comandos conforme explicado acima.
O script
#!/usr/bin/env python3
import subprocess
import sys
vec = sys.argv[1]
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shiftright(xr_output):
lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def get_shiftleft(xr_output):
lines = [l for l in xr_output.splitlines() if "+0" in l and not "+0+0" in l][0].split()
return -int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows():
xr_output = get("xrandr")
shift_r = get_shiftright(xr_output)
shift_l = get_shiftleft(xr_output)
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
for w in w_data:
props = get("xprop -id "+w[0])
if vec == "right":
check = (0 < int(w[2]) < shift_r, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
shift = shift_r
if vec == "left":
check = (shift_r-shift_l > int(w[2]) >= shift_r , "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
shift = -shift_r
if check == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
shift_windows()
3. Mover uma única janela de uma tela para outra
Embora não seja literalmente sua pergunta, com apenas algumas linhas a mais, você pode mover todas janelas de uma tela para outra, mas também uma única (a mais frontal) com uma combinação de teclas.
Com o script abaixo, você pode mover as janelas all com o comando:
shift_windows right
ou mova uma única janela com o comando:
shift_windows right s
A configuração é praticamente a mesma do script acima (não se esqueça de instalar wmctrl
)
O script
#!/usr/bin/env python3
import subprocess
import sys
vec = sys.argv[1]
try:
n = sys.argv[2]
except IndexError:
n = "a"
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shiftright(xr_output):
lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def get_shiftleft(xr_output):
lines = [l for l in xr_output.splitlines() if "+0" in l and not "+0+0" in l][0].split()
return -int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows():
xr_output = get("xrandr")
shift_r = get_shiftright(xr_output)
shift_l = get_shiftleft(xr_output)
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
if n == "s":
frontmost = [l for l in get("xprop -root").splitlines() if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
frontmost = frontmost[:2]+"0"+frontmost[2:]
w_data = [l for l in w_data if frontmost in l]
for w in w_data:
props = get("xprop -id "+w[0])
if vec == "right":
check = (0 < int(w[2]) < shift_r, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
shift = shift_r
if vec == "left":
check = (shift_r-shift_l > int(w[2]) >= shift_r , "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
shift = -shift_r
if check == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
shift_windows()