web-dev-qa-db-fra.com

Comment récupérer une fenêtre hors écran après avoir déconnecté le second moniteur?

J'utilise Ubuntu 14.04 sur mon ordinateur portable à mon bureau avec un deuxième moniteur. Lorsque je me déconnecte du deuxième moniteur - sans échec - ma fenêtre pour Emacs disparaît de l'écran.

Je peux Alt-TAB pour que Emacs devienne la fenêtre active et, en mode aveugle, arrête Emacs pour le redémarrer, ce qui le fait réapparaître à l'écran. Mais, il me semble qu’il devrait exister un moyen dans Ubuntu de faire revenir une fenêtre hors écran à l’écran. Y a-t-il?

Bien sûr, une meilleure solution serait d’empêcher les fenêtres de sortir de l’écran en réponse au contrôle de la déconnexion, et j’accepterais une solution à ce problème .

PDATE:

La sortie de xrandr lorsque vous êtes connecté à un deuxième moniteur:

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)

La sortie de xrandr après la déconnexion du deuxième moniteur:

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)

De plus, j'ai essayé d'échanger les positions gauche-droite de ma fenêtre Terminal et de ma fenêtre Emacs, puis de me déconnecter. Cela permet à la fenêtre Emacs de rester affichée après la déconnexion du deuxième moniteur. Et la fenêtre du terminal survit dans la position qui a éliminé Emacs. Donc, il semble que l'application a quelque chose à voir avec cela.

7
davidrmcharles

Déplacer toutes les fenêtres dans la zone visible

Comme proposé/demandé dans un commentaire, le script ci-dessous déplacera toutes les fenêtres "normales" vers la zone visible de l'espace de travail actuel.

La solution est une solution de contournement; les informations sur l'écran sont mises à jour correctement, compte tenu de la différence entre xrandr, avant et après la déconnexion. La raison pour laquelle les fenêtres ne bougent pas d'elles-mêmes est (actuellement) inconnue, à moins qu'une autre réponse ne résolve le problème.

Le scénario

#!/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]])])

Comment utiliser

  1. Le script a besoin de wmctrl:

    Sudo apt-get install wmctrl
    
  2. Copiez le script dans un fichier vide et protégez-le en tant que move_windows.py

  3. Testez-le: ouvrez un certain nombre de fenêtres, placez-les sur différents espaces de travail, etc. ou essayez de déconnecter le deuxième moniteur. Puis lancez la commande:

    python3 /path/to/move_windows.py
    

    Toutes les fenêtres "normales" doivent se déplacer vers la zone visible de l'espace de travail actuel.

  4. Si tout fonctionne correctement, ajoutez-le à une touche de raccourci: choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:

    python3 /path/to/move_windows.py
    

Vous devriez maintenant pouvoir déplacer toutes les fenêtres dans la zone visible de l'espace de travail actuel, avec votre touche de raccourci.

6
Jacob Vlijm

Une solution simple qui a fonctionné pour moi dans la récupération de fenêtres laissées sur des "écrans" d'écrans déconnectés (pas tout à fait le même problème que l'OP, mais lié) utilise le raccourci clavier pour agrandir la fenêtre: Ctrl + Super + ↑.

[N.B. Super est la touche portant le symbole "Windows", généralement entre Fn et Alt. Sur un Mac, cela correspond à Command = ⌘. Sur les anciennes versions d'Ubuntu que la mienne (16.04), vous n'aurez peut-être pas besoin d'inclure Ctrl.]

0
Stromael