Como mover as janelas para uma determinada tela ao usar mais de dois monitores no gnome-shell?

0

Há uma pergunta que é perguntando como mover uma janela usando atalhos de teclado .

No entanto, a resposta fornecida de usar

  • Ctrl + Alt + NUMPAD 4 (margem esquerda)
  • Ctrl + Alt + NUMPAD 6 (margem direita)

não funciona para uma configuração de três monitores, pois o salto omite as telas do meio e vai para a tela mais à esquerda ou mais à direita.

Outra resposta recomendou a Coloca a extensão do Windows , mas a sua combinação de teclas parece não funcionar eu, como é ativo, mas os atalhos não estão funcionando em tudo.

Como ser capaz de mover janelas para uma tela específica usando mais de dois monitores usando o gnome-shell?

Minha saída de xrandr :

Screen 0: minimum 8 x 8, current 5760 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 309mm x 174mm
   1920x1080      60.0*+   59.9     48.0  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1600x900       60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1368x768       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1280x720       60.0  
   1024x768       60.0  
   1024x576       60.0  
   960x540        60.0  
   800x600        60.3     56.2  
   864x486        60.0  
   640x480        59.9  
   720x405        60.0  
   640x360        60.0  
DP1 disconnected (normal left inverted right x axis y axis)
DP1-1 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 477mm x 268mm
   1920x1080      60.0*+
   1680x1050      59.9  
   1600x900       60.0  
   1280x1024      75.0     60.0  
   1280x800       59.9  
   1152x864       75.0  
   1280x720       60.0  
   1024x768       75.1     60.0  
   832x624        74.6  
   800x600        75.0     60.3  
   640x480        75.0     60.0  
   720x400        70.1  
DP1-2 connected 1920x1080+3840+0 (normal left inverted right x axis y axis) 477mm x 268mm
   1920x1080      60.0*+
   1680x1050      59.9  
   1600x900       60.0  
   1280x1024      75.0     60.0  
   1280x800       59.9  
   1152x864       75.0  
   1280x720       60.0  
   1024x768       75.1     60.0  
   832x624        74.6  
   800x600        75.0     60.3  
   640x480        75.0     60.0  
   720x400        70.1  
DP1-3 disconnected (normal left inverted right x axis y axis)
HDMI1 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 k0pernikus 10.11.2015 / 11:01

1 resposta

1

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

  1. O script precisa de wmctrl :

    sudo apt-get install wmctrl
    
  2. Copie o script em um arquivo vazio, salve-o como move_window.py

  3. 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.

  4. 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.
por Jacob Vlijm 10.11.2015 / 12:49