Como recuperar a janela offscreen depois de desconectar o segundo monitor?

7

Eu uso o Ubuntu 14.04 no meu laptop na minha mesa com um segundo monitor. Quando eu me desconectar do segundo monitor --- sem falhar --- minha janela para o Emacs sai da tela.

Eu posso usar Alt-TAB para fazer do Emacs a janela ativa, e, trabalhando cegamente, pare o Emacs para que eu possa reiniciá-lo, o que faz com que reapareça na tela. Mas, parece-me que deve haver uma maneira no Ubuntu de colocar uma janela fora da tela na tela. Existe?

Naturalmente, uma solução melhor seria impedir que as janelas saíssem da tela em resposta à desconexão do monitor, e eu aceitaria uma solução para o problema .

ATUALIZAÇÃO:

A saída de xrandr enquanto conectado a um segundo monitor:

Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+1280+0 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080      60.0*+   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  
VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 376mm x 301mm
   1280x1024      60.0*+   75.0  
   1280x960       60.0  
   1152x864       75.0  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   640x480        75.0     72.8     66.7     60.0  
   720x400        70.1  
HDMI1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

A saída de xrandr após a desconexão do segundo monitor:

Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080      60.0*+   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  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Além disso, tentei trocar as posições esquerda-direita da janela do meu Terminal e da minha janela do Emacs e, em seguida, desconectar. Isso permite que a janela do Emacs permaneça na tela após a desconexão do segundo monitor. E a janela do Terminal sobrevive na posição que eliminou o Emacs. Então, parece que o aplicativo tem algo a ver com isso.

    
por David Charles 25.08.2015 / 18:43

1 resposta

6

Mova todas as janelas para a área visível

Conforme proposto / solicitado em um comentário, o script abaixo moverá todas as janelas "normais" para a área visível na área de trabalho atual.

A solução é uma solução alternativa; as informações da tela são atualizadas corretamente, dada a diferença na saída de xrandr , antes e depois da desconexão. A razão pela qual as janelas não se movem sozinhas é (atualmente) desconhecida, a menos que outra resposta resolva o problema.

O script

#!/usr/bin/env python3
import subprocess

# get the resolution of the screen (+0+0)
res = [
    int(n) for n in [
        s.split("+")[0].split("x")\
        for s in subprocess.check_output(["xrandr"]).decode("utf-8").split()\
        if "+0+0" in s][0]
    ]
# create list of windows
w_list = [w.split() for w in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
# filter only "normal" ones
valid = [
    w for w in w_list if "_NET_WM_WINDOW_TYPE_NORMAL" in\
    subprocess.check_output(["xprop", "-id", w[0]]).decode("utf-8")
    ]
# get the number of valid windows and calculate a targeted position
# the targeted position is a hunch, it will be exact if the window fits completely inside the resolution
# it will work anyway
parts = len(valid)+2
positions = [(int(n*res[0]/parts), int(n*res[1]/parts)) for n in list(range(parts))[1:-1]]
# unmaximaize, move the windows to the visible area (current workspace)
for i, w in enumerate(valid):
    subprocess.Popen(["wmctrl", "-ir", w[0], "-b", "remove,maximized_vert,remove,maximized_horz"])
    # weird, but sometimes wmctrl refuses to move a window if it is not resized first (?)
    subprocess.Popen(["wmctrl", "-ir", w[0], "-e", "0,200,200,200,200"])      
    subprocess.Popen(["wmctrl", "-ir", w[0], "-e", (",").join(["0", str(positions[i][0]), str(positions[i][1]),w[4],w[5]])])

Como usar

  1. O script precisa de wmctrl :

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

  3. Teste-o: abra um número de janelas, coloque-as em espaços de trabalho diferentes, etc., ou tente desconectar o segundo monitor. Em seguida, execute o comando:

    python3 /path/to/move_windows.py
    

    Todas as janelas "normais" devem se mover para a área visível da área de trabalho atual.

  4. Se tudo funcionar bem, adicione-o a uma tecla de atalho: escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando:

    python3 /path/to/move_windows.py
    

Agora você deve poder mover todas as janelas para a área visível no espaço de trabalho atual, com a tecla de atalho.

    
por Jacob Vlijm 26.08.2015 / 08:12