J'utilise donc Ubuntu 14.10 sur mon ordinateur portable et le branche de temps en temps à mon téléviseur pour un deuxième écran. Ma télévision est à gauche de mon bureau. Lorsque je l’active comme moniteur externe à gauche de l’écran de mon ordinateur portable, toutes les fenêtres de cet ordinateur se déplacent sur l’écran de la télévision. Je peux les ramener, mais c'est vraiment pénible de devoir le faire à chaque fois, surtout quand plusieurs fenêtres sont ouvertes.
Les fenêtres ne bougent pas, cependant, si je règle l'écran de mon téléviseur à droite de l'écran de mon ordinateur portable (pratiquement). Mais cela est naturellement déroutant à utiliser car c’est le contraire de la configuration physique. De plus, je ne veux pas déplacer mon bureau.
Il semble qu'Ubuntu ou le serveur d'affichage suppose simplement que le moniteur le plus à gauche est le moniteur principal et que toutes les fenêtres doivent être. Existe-t-il un moyen de désactiver ce comportement?
J'ai consulté ces forums mais je n'ai jamais vu personne écrire à ce sujet. Le fil le plus proche que j'ai trouvé était celui-ci, bien que ce ne soit pas tout à fait le même problème.
oblige Ubuntu à NE PAS déplacer les fenêtres lors de la désactivation de l'un des moniteurs
Quelqu'un a des idées? S'il vous plaît laissez-moi savoir si vous le faites. Merci!
Je n'ai pas trouvé de paramètre "secret" pour modifier le comportement du comportement conçu, semble-t-il. Il semble en effet que l'écran de gauche soit supposé être l'écran "de base".
Il est cependant très bien possible de créer une solution de contournement, avec essentiellement le même résultat. Vous pouvez créer un script qui, à l’occasion de la connexion d’un deuxième écran, répertorie toutes les fenêtres. Par la suite, toutes les fenêtres qui sont initialement déplacées vers l’écran de gauche sont repassées à l’écran de droite, en une seconde ou deux. La taille de toutes les fenêtres sera préservée.
C'est ce que fait le script ci-dessous.
Vous pouvez restaurer vos fenêtres arrangées de deux manières:
préparations
Installer wmctrl
Sudo apt-get install wmctrl
Recherchez les noms de vos deux écrans à l'aide de xrandr
, les noms des écrans se trouveront juste avant le mot "connecté".
Copier Soit l’un des scripts ci-dessous, dans la section head, remplacez les noms d’écran par ces deux lignes:
screen_1 = "LVDS1" # your main screen (laptop)
screen_2 = "VGA1" # secundary screen (on the left)
enregistrer le script sous move_windows.py
Assurez-vous que dans les paramètres d'affichage, votre écran secondaire est à gauche. Les lignes du haut des deux écrans doivent être alignées (comme dans la première image de votre question).
Exécuter le script
- Si vous utilisez celui-ci pour fonctionner de temps en temps, exécutez-le après la connexion de votre deuxième écran.
python3 /path/to/move_windows.py
Vous voudrez peut-être l'ajouter à un raccourci clavier si vous pensez qu'il fait ce qu'il devrait faire. Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:
Si vous utilisez celui qui s’exécute en arrière-plan, exécutez-le également à l’aide de la commande suivante:
python3 /path/to/move_windows.py
Si cela vous convient, ajoutez-le à vos applications de démarrage: Dash> Applications de démarrage> Ajouter
J'ai testé le script avec mon ordinateur portable (à droite) et deux écrans différents (à gauche). Le résultat était le même.
écran d'ordinateur portable
connexion sans script
connexion avec le script en cours d'exécution
Une fois que le script a fait son travail, les fenêtres seront "laissées seules" (bien sûr), et vous pourrez organiser vos fenêtres à votre guise.
1. Version "manuelle", à exécuter après la connexion de l'écran
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
shift_windows(get_shift(get("xrandr")))
2. Version automatique, à exécuter en arrière-plan
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
while True:
try:
screen_info1 = get("xrandr")
time.sleep(5)
screen_info2 = get("xrandr")
check = screen_2+" connected"
if (check in screen_info1, check in screen_info2) == (False, True):
time.sleep(5)
shift_windows(get_shift(screen_info2))
except:
pass