Mover janelas entre telas no modo de tela dupla

5

Eu tenho um laptop e um monitor de 27 polegadas. Eu tenho o Qt rodando em um monitor e o Pycharm no outro. Existe uma maneira de fazer uma combinação de teclas para trocar todas as janelas entre as duas telas? A razão é que eu quero programar apenas na tela grande. Eu já tenho 4 espaços de trabalho e todos eles já estão sendo usados.

A saída do xrandr:

Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 32767 x 32767
eDP1 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 344mm x 193mm
   1920x1080      60.2*+   59.9  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
HDMI1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 597mm x 336mm
   1920x1080      60.0*+   50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1600x1200      60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1366x768       59.8  
   1152x864       75.0  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   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)
    
por Mehdi 17.03.2015 / 14:17

1 resposta

4

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 horizontal de ambas as telas são pesquisadas pelo script.

Como configurar

O script precisa de wmctrl para ser instalado:

sudo apt-get install wmctrl
  1. 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 .
  2. Se você acabou de criar o diretório ~/bin (ainda não existe), efetue logout / in ou execute em um terminal: source ~/.profile .
  3. teste execute o script com o comando:

    swap_windows
    
  4. 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 da esquerda é a principal. As resoluções horizontal de ambas as telas são pesquisadas pelo script.

Como configurar

O script precisa de wmctrl para ser instalado:

sudo apt-get install wmctrl
  1. 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 .
  2. Se você acabou de criar o diretório ~/bin (ainda não existe), efetue logout / in ou execute em um terminal: source ~/.profile .
  3. teste execute o script com os comandos

    shift_windows right
    

    e:     shift_windows left

    No primeiro caso, as janelas na tela esquerda devem se mover para a tela direita e, no segundo caso, vice-versa.

  4. Se tudo funcionar conforme o 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()
    
por Jacob Vlijm 17.03.2015 / 21:58