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.
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.
#!/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]])])
Le script a besoin de wmctrl
:
Sudo apt-get install wmctrl
Copiez le script dans un fichier vide et protégez-le en tant que move_windows.py
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.
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.
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
.]