Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I am affected by the BUG: https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 Otherwise, if like me you have a laptop connected to a second monitor of higher resolution, LIGHTDM at the login stage, mirrors the displays in both screens and assign to them a common resolution (1024X768) in my case, instead of extending the desktop (Primary screen with the greeter and secondary with just a logo as mentioned in the Multiple Monitors UX specifications book for 12.04).

Here is my 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)

I tried to force lightdm to execute some xrandr commands in order to set the right resolution for each monitor and extend the desktop, so I created a simple script named /usr/share/lightdmxrand.sh:

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

And told lightdm to run it : /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

restarted lightdm : sudo restart lightdm And the unity greeter login screen was correct. Screens with their respective correct resolutions and if I move the mouse to a screen, it gets focus with the login box and panel, while the unfocused screen just displays an Ubuntu Logo (Just as specified in the MM UX spec book). Fantastic!

This workaround works great as long as The external monitor is connected to the laptop. In the situation where it is not connected, at the login stage, I get :a LOW GRAPHICS MODE ERROR (You're running in low graphics mode, your screen, input devices...did not get detected..). Normal, because xrandr tries to output to a non connected monitor.

The question here is how should I modify the script in a way that when the external monitor is not connected xrandr outputs only to the laptop screen and ignores any external monitor. E.G:

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)

Thanks in advance.

share|improve this question
add comment

4 Answers

Many thanks Hanynowsky! Finding your answer saved me a ton of work (recently upgraded 12.04). However in my case it didn't provide the complete solution so I would like to add what I learned. My setup was a Samsung S22A300B plugged into the VGA port of a Vaio VGN-CR120E with built-in 1280x800 display and a Mobile GM965/GL960 Integrated Graphics Controller.

Briefly what I found was:

  • The maximum resolution I could set on the external Samsung display using the Displays System Setting was 1024x768.
  • This was apparently caused because my VGA controller doesn't support EDID. For some reason both Windows Vista and Windows 7 (on a different laptop) can handle this situation and provide a full range of resolutions.

To workaround this limited maximum resolution I did the following:

  • Added lines to your script to invoke xrandr with --newmode and --addmode
  • Tried cvt to generate the --newmode modeline for 1920x1080, but unfortunately it didn't work for my setup.
  • Borrowed a laptop with a an HDMI port, booted it with the Samsung plugged in, and grabbed the modline for 1920x1080 56.2 kHz out of /var/log/Xorg.0.log
  • Plugged that modline along with modifying your script for my setup (e.g. HDMI1->VGA1, correct laptop resolution, etc.)

This ALMOST worked, but after logon the external monitor was reset from a nice 1920x1080 back to 1024x768. It turned out that this was a persistent user setting and was easily fixed by using the Displays... System Setting (from the gear menu) to the now available 1920x1080. Now when I boot with the external monitor connected everything works as expected.

One additional glitch: If this script gets run twice (for example from terminal) the xrandr --newmode line will get a "BadName (named color or font does not exist)" error, but http://stackoverflow.com/questions/851704/xrandr-errors-badname-named-color-or-font-does-not-exist explained this and it seems benign. Also shouldn't be a problem when the script is hooked up lightdm.conf per Hanynowsky's instructions vs. run manually.

I'm providing the changes adapted for the above (VGA with no EDID functionality) in the hopes it will help someone else. As mentioned in the preceding answers you will have to adapt this for your own setup. I don't have any good advice on obtaining the correct modline, but if someone else does please chip in.

#!/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: I'm not sure if the eval is necessary (vs. echo in the original). I put this in before I discovered that my Displays... settings were resetting the external display to a lower resolution.

share|improve this answer
    
You're welcome @Walter Wittel & thank you for your valuable contribution. Once I have time I'd try to figure out a more generic script if possible; but I doubt it'd be possible to extract the correct modline for a non EDID monitor using XRANDR. In anyway, let's see. –  Hanynowsky Apr 30 '12 at 3:36
add comment

NOTE: I also posted this answer here

I found a very simple workaround that works perfectly for me running 13.04. on a laptop with a 24" external screen that is not permanently connected.

I'll just copy from here

  1. log in
  2. use xrandr or the Displays control utility to configure your monitors how you'd like them to be configured in the login screen
  3. copy ~/.config/monitors.xml to /var/lib/lightdm/.config

Since I already had my monitors configured properly I just had to do step 3.

share|improve this answer
add comment

I found that instead of using --mode to explicitly state the resolution, --auto will choose the best resolution for you(the largest one I believe).

#!/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;
share|improve this answer
1  
hachi your script works great! Anyone affected with this bug just have to put correct resolution of their displays in this script and restart lightdm : sudo restart lightdm thats all! Everything works great! I've posted my question about this problem here: askubuntu.com/questions/181112/… –  conscientist Sep 9 '12 at 23:20
add comment
up vote 7 down vote accepted

I managed this little basic script below that answers my question. Now, whether the external monitor is connected or not, Lightdm uses the right resolutions at the greeter stage. Nevertheless, this same script needs to be modified to be generic, in a way that the user wouldn't need to specify manually resolutions of its laptop and monitor screens.

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

So if someone has a better solution or a more generic script, he's the man.

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;
share|improve this answer
add comment

protected by Community Sep 10 '12 at 14:17

Thank you for your interest in this question. Because it has attracted low-quality answers, posting an answer now requires 10 reputation on this site.

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.