web-dev-qa-db-fra.com

Existe-t-il un moyen d'empêcher vos fenêtres de bouger lorsqu'un moniteur externe est connecté?

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.

TV on Left

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.

TV on Right

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!

9
K0j0

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.

Deux versions

Vous pouvez restaurer vos fenêtres arrangées de deux manières:

  • Occasionnellement, avec une touche de raccourci à exécuter après la connexion du deuxième écran.
  • Automatiquement, exécutez le script en arrière-plan, en attendant que votre écran soit connecté.

Comment utiliser

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

enter image description here

connexion sans script

enter image description here

connexion avec le script en cours d'exécution

enter image description here

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.

Le (s) script (s)

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
2
Jacob Vlijm