web-dev-qa-db-fra.com

Comment forcer plusieurs moniteurs des résolutions correctes pour LightDM?

Je suis affecté par le bogue: https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 Sinon, si comme moi vous avez un ordinateur portable connecté à un second moniteur de résolution supérieure, LIGHTDM au stade de la connexion, miroirs affiche dans les deux écrans et leur attribue une résolution commune (1024X768) dans mon cas, au lieu d’allonger le bureau (écran principal avec l’indicateur de niveau et secondaire avec juste un logo, comme indiqué dans le cahier des charges Multiple Monitors UX du 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 dit à 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 a été correct. Les écrans avec leurs résolutions correctes respectives et si je déplace la souris vers un écran, la zone de connexion et le panneau de connexion lui permettent de se focaliser, alors que l’écran non focalisé n’affiche qu’un logo Ubuntu (comme spécifié dans le cahier des charges de MM UX). Fantastique!

Cette solution de contournement fonctionne très bien tant que le moniteur externe est connecté à l'ordinateur portable. Dans le cas où il n'est pas connecté, à l'étape de la connexion, j'obtiens: une ERREUR DE FAIBLE MODE GRAPHIQUE (vous utilisez un mode graphique faible, votre écran, vos périphériques d'entrée ... n'ont pas été détectés ...). Normal, car xrandr essaie de générer une sortie sur un moniteur non connecté.

La question est la suivante: comment modifier le script de manière à ce que, lorsque le moniteur externe n'est pas connecté, xrandr ne s'affiche que sur l'écran de l'ordinateur portable et ignore tout problème externe; moniteur. 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.

17
Hanynowsky

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

 (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, il est l'homme.

SCRIPT:

    #!/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;
9
Hanynowsky

NOTE: j'ai aussi posté cette réponse ici

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

Je vais simplement copier de ici

  1. s'identifier
  2. utilisez xrandr ou l’utilitaire de contrôle d’affichage pour configurer vos moniteurs comme vous le souhaitez dans l’écran de connexion
  3. Sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

Comme mes moniteurs étaient déjà configurés correctement, je n’ai plus qu’à passer à l’étape 3.

18
Tobold

Merci beaucoup Hanynowsky! Trouver votre réponse m'a épargné une tonne de travail (récemment mis à jour le 12.04). Cependant, dans mon cas, la solution complète n’était pas complète et j’aimerais 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 externe Samsung à l'aide du paramètre Système d'affichage était de 1024x768.
  • Cela était apparemment dû au fait que mon contrôleur VGA ne prend pas en charge EDID. Pour certaines raisons, 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 procédé comme suit:

  • Lignes ajoutées à votre script pour appeler xrandr avec --newmode et --addmode
  • J'ai essayé de générer le modèle --newmode pour 1920x1080, mais malheureusement, cela ne fonctionnait pas pour ma configuration.
  • Empruntez un ordinateur portable avec un port HDMI, démarrez-le avec le Samsung branché, puis saisissez la modline pour 1920x1080 à 56,2 kHz sur /var/log/Xorg.0.log
  • Branchez cette ligne de modification avec la modification de votre script pour ma configuration (par exemple, HDMI1-> VGA1, résolution correcte de l'ordinateur portable, etc.)

CELA PRESQUE a fonctionné, mais après l’ouverture de session, le moniteur externe a été réinitialisé d’un Nice 1920x1080 à 1024x768. Il s’est avéré qu’il s’agissait d’un paramètre utilisateur persistant qui pouvait facilement être corrigé à l’aide du paramètre Moniteurs ... du système (du menu de l’engrenage) au format 1920x1080 désormais disponible. Maintenant, lorsque je démarre avec le moniteur externe connecté, tout fonctionne comme prévu.

Un petit problème supplémentaire: si ce script est exécuté deux fois (par exemple depuis terminal), la ligne xrandr --newmode recevra un message d'erreur "Nom incorrect (couleur ou police inexistante)", mais https: // stackoverflow. com/questions/851704/xrandr-errors-badname-nommé-couleur-ou-la-police-n'existe-pas expliqué cela et cela semble anodin. Cela ne devrait pas non plus être un problème lorsque le script est connecté à lightdm.conf conformément aux instructions de Hanynowsky par opposition à une exécution manuelle.

Je fournis les modifications adaptées à ce qui précède (VGA sans fonctionnalité EDID) dans l'espoir d'aider 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, merci de le partager.

#!/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;

NOTE: Je ne suis pas sûr que eval soit nécessaire (vs é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.

2
Walter Wittel

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;
1
hachi

Si vous utilisez l'accélérateur GTK de LightDM, vous pouvez exécuter xrandr -q pour trouver les noms de vos moniteurs, puis éditer /etc/lightdm/lightdm-gtk-greeter et définir la propriété active-monitor comme décrit dans les commentaires contenus dans ce fichier. Cette propriété peut prendre plusieurs valeurs ordonnées, y compris #cursor pour le moniteur qui affiche actuellement le curseur de la souris.

0
Dzamo Norton