Comment forcer plusieurs moniteurs à corriger les résolutions pour LightDM?

17

Je suis concerné par le BUG: https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 Sinon, si comme moi, vous avez un ordinateur portable connecté à un deuxième moniteur de résolution supérieure, LIGHTDM à l'étape de connexion, reflète les affichages dans les deux écrans et leur attribue une résolution commune (1024X768) dans mon cas, au lieu d'étendre le bureau (écran principal avec le plus accueillant et secondaire avec juste un logo comme mentionné dans le livre de spécifications UX de plusieurs moniteurs) pour 12.04).

Voici mon xrandr -q

@L502X:~$ xrandr -q
Screen 0: minimum 320 x 200, current 1920 x 1848, maximum 8192 x 8192
LVDS1 connected 1366x768+309+1080 (normal left inverted right x axis y axis) 344mm x 193mm
   1366x768       60.0*+
   1360x768       59.8     60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 510mm x 287mm
   1920x1080      60.0*+
   1600x1200      60.0  
   1680x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1280x800       59.8  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        60.0  
DP1 disconnected (normal left inverted right x axis y axis)

J'ai essayé de forcer lightdm à exécuter certaines commandes xrandr afin de définir la bonne résolution pour chaque moniteur et d'étendre le bureau, j'ai donc créé un script simple nommé /usr/share/lightdmxrand.sh :

#!/bin/sh
xrandr --output HDMI1 --primary --mode 1920x1080 --output LVDS1 --mode 1366x768 --below HDMI1

Et a demandé à lightdm de l'exécuter: /etc/lightdm/lightdm.conf

[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu
greeter-setup-script=/usr/bin/numlockx on
display-setup-script=/usr/share/lightdmxrandr.sh

redémarré lightdm: sudo restart lightdm Et l'écran de connexion de l'unité d'accueil était correct. Écrans avec leurs résolutions correctes respectives et si je déplace la souris sur un écran, il se concentre avec la boîte de connexion et le panneau, tandis que l'écran non focalisé affiche simplement un logo Ubuntu (exactement comme spécifié dans le livre de spécifications MM UX). Fantastique!

Cette solution de contournement fonctionne très bien tant que le moniteur externe est connecté à l'ordinateur portable. Dans la situation où il n'est pas connecté, au stade de la connexion, j'obtiens: une ERREUR DE MODE GRAPHIQUE BAS (Vous utilisez en mode graphique bas, votre écran, les périphériques d'entrée ... n'ont pas été détectés ..). Normal, car xrandressaie de sortir sur un moniteur non connecté.

La question ici est de savoir comment modifier le script de manière à ce que lorsque le moniteur externe n'est pas connecté, les xrandrsorties ne concernent que l'écran du portable et ignorent tout moniteur externe. PAR EXEMPLE:

If (xrandr -q | grep 'HDMI1 connected') != NULL (HDMI1 is connected )
then xrandr --output HDMI1 --primary --mode 1920x1080 --output LVDS1 --mode 1366x768 --below HDMI1
else xrandr --output LVDS1 --mode 1366x768 (or do nothing - because the resolution of the laptop screen is correct when no external monitor is connected)

Merci d'avance.

Hanynowsky
la source

Réponses:

18

REMARQUE: j'ai également posté cette réponse ici

J'ai trouvé une solution de contournement très simple qui fonctionne parfaitement pour moi en exécutant 13.04. sur un ordinateur portable avec un écran externe de 24 "qui n'est pas connecté en permanence.

Je vais juste copier d' ici

  1. s'identifier
  2. utilisez xrandr ou l'utilitaire de contrôle des écrans pour configurer vos moniteurs comme vous souhaitez qu'ils soient configurés dans l'écran de connexion
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

Comme j'avais déjà configuré correctement mes moniteurs, je devais simplement faire l'étape 3.

Tobold
la source
9

J'ai géré ce petit script de base ci-dessous qui répond à ma question. Maintenant, que le moniteur externe soit connecté ou non, Lightdm utilise les bonnes résolutions au stade plus agréable. Néanmoins, ce même script doit être modifié pour être générique , de manière à ce que l'utilisateur n'ait pas besoin de spécifier manuellement les résolutions de ses écrans d'ordinateur portable et de moniteur.

 (Parse the output of `XRAND -q` command, 
identify the connected devices, 
grab their first/maximum resolutions 
and use `XRANDR --output` to display them). 

Donc, si quelqu'un a une meilleure solution ou un script plus générique, c'est lui.

SCÉNARIO:

    #!/bin/bash
    # V-1.0 by Hanynowsky - April 2012. 
    # I am a very basic script that works around bug 874241 repprted in launchpad.

    XCOM0=`xrandr -q | grep 'HDMI1 connected'`
    XCOM1=`xrandr --output HDMI1 --primary --mode 1920x1080 --output LVDS1 --mode 1366x768 --below HDMI1`
    XCOM2=`xrandr --output LVDS1 --mode 1366x768`
    # if the external monitor is connected, then we tell XRANDR to set up an extended desktop
    if [ -n "$XCOM0" ] || [ ! "$XCOM0" = "" ]; then echo $XCOM1
    # if the external monitor is disconnected, then we tell XRANDR to output only to the laptop screen
    else echo $XCOM2
    fi
    exit 0;
Hanynowsky
la source
2

Merci beaucoup Hanynowsky! Trouver votre réponse m'a fait économiser une tonne de travail (récemment mis à jour le 12.04). Cependant, dans mon cas, il n'a pas fourni la solution complète, donc je voudrais ajouter ce que j'ai appris. Ma configuration était un Samsung S22A300B branché sur le port VGA d'un Vaio VGN-CR120E avec écran 1280x800 intégré et un contrôleur graphique intégré Mobile GM965 / GL960.

En bref, ce que j'ai trouvé était:

  • La résolution maximale que je pouvais définir sur l'écran Samsung externe à l'aide du paramètre Système d'affichage était 1024x768.
  • Cela est apparemment dû au fait que mon contrôleur VGA ne prend pas en charge EDID. Pour une raison quelconque, Windows Vista et Windows 7 (sur un autre ordinateur portable) peuvent gérer cette situation et fournir une gamme complète de résolutions.

Pour contourner cette résolution maximale limitée, j'ai fait ce qui suit:

  • Ajout de lignes à votre script pour invoquer xrandr avec --newmode et --addmode
  • J'ai essayé de générer le modèle --newmode pour 1920x1080, mais malheureusement cela n'a pas fonctionné pour ma configuration.
  • A emprunté un ordinateur portable avec un port HDMI, l'a démarré avec le Samsung branché et a saisi la ligne de modulation pour 1920x1080 56,2 kHz dans /var/log/Xorg.0.log
  • Branché ce modline avec la modification de votre script pour ma configuration (par exemple HDMI1-> VGA1, résolution d'ordinateur portable correcte, etc.)

Cela a presque fonctionné, mais après la connexion, le moniteur externe a été réinitialisé à partir d'un joli 1920x1080 en 1024x768. Il s'est avéré qu'il s'agissait d'un paramètre utilisateur persistant et a été facilement corrigé en utilisant les paramètres d'affichage ... du système (dans le menu de l'équipement) au 1920x1080 maintenant disponible. Maintenant, quand je démarre avec le moniteur externe connecté, tout fonctionne comme prévu.

Un problème supplémentaire: si ce script est exécuté deux fois (par exemple à partir du terminal), la ligne xrandr --newmode recevra une erreur "BadName (la couleur ou la police nommée n'existe pas)", mais /programming/ 851704 / xrandr-errors-badname-named-color-or-font-does-not-exist a expliqué cela et cela semble bénin. Cela ne devrait pas non plus être un problème lorsque le script est connecté lightdm.conf selon les instructions de Hanynowsky par rapport à une exécution manuelle.

Je fournis les modifications adaptées à ce qui précède (VGA sans fonctionnalité EDID) dans l'espoir que cela aidera quelqu'un d'autre. Comme mentionné dans les réponses précédentes, vous devrez l'adapter à votre propre configuration. Je n'ai pas de bons conseils pour obtenir la bonne ligne de mod, mais si quelqu'un d'autre le fait, je vous en prie.

#!/bin/bash
# Modified for Vaio with 1920x1080 external on VGA
XCOM0=`xrandr -q | grep 'VGA1 connected'`
XCOM1="xrandr --output VGA1 --primary --mode 1920x1080 --output LVDS1 --mode 1280x800 --left-of VGA1"
XCOM2="xrandr --output LVDS1 --mode 1280x800"
NEWMODE="xrandr --newmode "1920x1080" 148.50  1920 2448 2492 2640  1080 1084 1089 1125 +hsync +vsync"
ADDMODE="xrandr --addmode VGA1 1920x1080"

# Always add this mode in case we need it (better would be to test first)
eval $NEWMODE
eval $ADDMODE

if [ -n "$XCOM0" ] || [ ! "$XCOM0" = "" ];
then
        # if the external monitor is connected, then we tell XRANDR to set up an extended desktop
        eval $XCOM1
else
        # if the external monitor is disconnected, then we tell XRANDR to output only to the laptop screen
        eval $XCOM2
fi
exit 0;

REMARQUE: je ne sais pas si l'évaluation est nécessaire (par rapport à l'écho dans l'original). Je l'ai mis avant de découvrir que mes paramètres d'affichage ... réinitialisaient l'affichage externe à une résolution inférieure.

Walter Wittel
la source
Vous êtes les bienvenus @ Walter Wittel et merci pour votre précieuse contribution. Une fois que j'aurais le temps, j'essaierais de trouver un script plus générique si possible; mais je doute qu'il serait possible d'extraire la ligne de modulation correcte pour un moniteur non EDID en utilisant XRANDR. En tout cas, voyons voir.
Hanynowsky
1

J'ai trouvé qu'au lieu d'utiliser --mode pour énoncer explicitement la résolution, --auto choisira la meilleure résolution pour vous (la plus grande je crois).

#!/bin/bash

XCOM0=`xrandr -q | grep 'VGA1 connected'`
XCOM1=`xrandr --output LVDS1 --primary --auto --output VGA1 --auto --right-of LVDS1`
XCOM2=`xrandr --output LVDS1 --primary --auto`
# if the external monitor is connected, then we tell XRANDR to set up an extended desktop
if [ -n "$XCOM0" ] || [ ! "$XCOM0" = "" ]; then echo $XCOM1
# if the external monitor is disconnected, then we tell XRANDR to output only to the laptop screen
else echo $XCOM2
fi

exit 0;
hachi
la source
1
hachi votre script fonctionne très bien! Toute personne affectée par ce bogue n'a qu'à mettre la résolution correcte de ses affichages dans ce script et redémarrer lightdm: sudo restart lightdm c'est tout! Tout fonctionne très bien! J'ai posté ma question sur ce problème ici: askubuntu.com/questions/181112/…
conscienceist
0

Si vous utilisez le greeter GTK de LightDM, vous pouvez exécuter xrandr -qpour trouver les noms de vos moniteurs, puis modifier /etc/lightdm/lightdm-gtk-greeteret définir la propriété active-monitorcomme décrit dans les commentaires à l'intérieur de ce fichier. Cette propriété peut prendre plusieurs valeurs ordonnées, y compris #cursorpour le moniteur qui affiche actuellement le curseur de la souris.

Dzamo Norton
la source