xrandr is an official configuration utility to the RandR X Window System extension. It can be used to set the size, orientation or reflection of the outputs for a screen. For configuring multiple monitors see the Multihead page.
- 1 Installation
- 2 Testing configuration
- 3 Configuration
- 4 Troubleshooting
- 5 See also
Install . A graphical front end such as or is also available.
When run without any option, xrandr shows the names of different outputs available on the system (
VGA-0, etc.) and resolutions available on each, with a * after the current one and a + after the preferred one :
Screen 0: minimum 320 x 200, current 1440 x 900, maximum 8192 x 8192 VGA disconnected (normal left inverted right x axis y axis) LVDS connected (normal left inverted right x axis y axis) 1440x900 59.9*+ 1280x854 59.9 1280x800 59.8 ...
You can use xrandr to set different resolution (must be present in the above list) on some output:
$ xrandr --output LVDS --mode 1280x800
When multiple refresh rates are present in the list (not in the example above), it may be changed by the
--rate option, either at the same time or independently. For example:
$ xrandr --output LVDS --mode 1280x800 --rate 75
--auto option will turn the specified output on if it is off and set the preferred (maximum) resolution:
$ xrandr --output LVDS --auto
It is possible to specify multiple outputs in one command, e.g. to turn off
LVDS and turn on
HDMI-0 with preferred resolution:
$ xrandr --output LVDS --off --output HDMI-0 --auto
- Changes you make using xrandr will only last through the current session.
- xrandr has a lot more capabilities - see for details.
xrandr is just a simple interface to the RandR extension and has no configuration file. However, there are multiple ways of achieving persistent configuration:
- The RandR extension can be configured via X configuration files, see Multihead#RandR for details. This method provides only static configuration.
- If you need dynamic configuration, you need to execute xrandr commands each time X server starts. See Autostarting#Graphical for details. This method has the disadvantage of occurring fairly late in the startup process, thus it will not alter the resolution of the display manager if you use one.
- Custom scripts calling xrandr can be bound to events (for example when external monitor is plugged in), see acpid for details. The #Scripts section provides you with some example scripts that might be useful for this purpose.
/etc/gdm/, while for KDM this is done at
/usr/share/config/kdm/Xsetupand for SDDM at
/usr/share/sddm/scripts/Xsetup. This method requires root access and mucking around in system config files, but will take effect earlier in the startup process than using xprofile.
Toggle external monitor
This script toggles between an external monitor (specified by
$extern) and a default monitor (specified by
$intern), so that only one monitor is active at a time.
The default monitor should be connected when running the script, which is always true for a laptop.
#!/bin/bash intern=LVDS1 extern=VGA1 if xrandr | grep "$extern disconnected"; then xrandr --output "$extern" --off --output "$intern" --auto else xrandr --output "$intern" --off --output "$extern" --auto fi
xrandr --output "$intern" --primary --auto --output "$extern" --right-of "$intern" --auto.
AUR is a Bash script to quickly manage 2-monitors display (ex: computer, duplicate, extend, projector mode).
Mostly made for laptops, we may need to manage 2-plugged-in monitors as well as using basic well-known features on a daily basis (for more details, see mons).
This script iterates through connected monitors, selects currently active monitor, turns next one on and the others off:
# get info from xrandr connectedOutputs=$(xrandr | grep " connected" | sed -e "s/\([A-Z0-9]\+\) connected.*/\1/") activeOutput=$(xrandr | grep -E " connected (primary )?[1-9]+" | sed -e "s/\([A-Z0-9]\+\) connected.*/\1/") # initialize variables execute="xrandr " default="xrandr " i=1 switch=0 for display in $connectedOutputs do # build default configuration if [ $i -eq 1 ] then default=$default"--output $display --auto " else default=$default"--output $display --off " fi # build "switching" configuration if [ $switch -eq 1 ] then execute=$execute"--output $display --auto " switch=0 else execute=$execute"--output $display --off " fi # check whether the next output should be switched on if [ $display = $activeOutput ] then switch=1 fi i=$(( $i + 1 )) done # check if the default setup needs to be executed then run it echo "Resulting Configuration:" if [ -z "$(echo $execute | grep "auto")" ] then echo "Command: $default" `$default` else echo "Command: $execute" `$execute` fi echo -e "\n$(xrandr)"
Avoid X crash with xrasengan
Use this workaround to turn on connected outputs that may be in suspend mode and hence shown as disconnected, as is often the case of DisplayPort monitors:
declare -i count=2 declare -i seconds=1 while ((count)); do xrandr >/dev/null sleep $seconds ((count--)) done
xrasengan is an xrandr wrapper with this workaround built in.
$ xrasengan --force -on DisplayPort-0 -off HDMI-0
--force option, xrasengan will update status of all outputs before HDMI-0 is turned off, avoiding an X crash if they were the only connected/active outputs.
To force reload current settings, xrasengan provides a
--try-reload-active-layout option, which uses
--force and unxrandr from the package to assemble the command line:
$ xrasengan --try-reload-active-layout
This can be used in systemd unit or in a keyboard binding to avoid blank screen when resuming DisplayPort monitors from suspend.
Adding undetected resolutions
Due to buggy hardware or drivers, your monitor's correct resolutions may not always be detected by xrandr. For example, the EDID data block queried from the monitor may be incorrect. However, we can add the desired resolutions to xrandr.
First we run
cvt to get the Modeline for the resolution we want:
For some LCD screens (samsung 2343NW), the command "cvt -r" (= with reduced blanking) is to be used.
$ cvt 1280 1024
# 1280x1024 59.89 Hz (CVT 1.31M4) hsync: 63.67 kHz; pclk: 109.00 MHz Modeline "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync
/var/log/Xorg.0.log— use that first if it is different from the output of
cvt. For instance, the log and its use with xrandr:
[ 45.063] (II) intel(0): clock: 241.5 MHz Image Size: 597 x 336 mm [ 45.063] (II) intel(0): h_active: 2560 h_sync: 2600 h_sync_end 2632 h_blank_end 2720 h_border: 0 [ 45.063] (II) intel(0): v_active: 1440 v_sync: 1443 v_sync_end 1448 v_blanking: 1481 v_border: 0
xrandr --newmode "2560x1440" 241.50 2560 2600 2632 2720 1440 1443 1448 1481 -hsync +vsync
Then we create a new xrandr mode. Note that the Modeline keyword needs to be ommited.
$ xrandr --newmode "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync
After creating it we need an extra step to add this new mode to our current output (VGA1). We use just the name of the mode, since the parameters have been set previously.
$ xrandr --addmode VGA1 1280x1024_60.00
Now we change the resolution of the screen to the one we just added:
$ xrandr --output VGA1 --mode 1280x1024_60.00
Note that these settings only take effect during this session.
If you are not sure about the resolution you will test, you may add a
sleep 5 and a safe resolution command line following, like this:
$ xrandr --output VGA1 --mode 1280x1024_60.00 && sleep 5 && xrandr --newmode "1024x768-safe" 65.00 1024 1048 1184 1344 768 771 777 806 -HSync -VSync && xrandr --addmode VGA1 1024x768-safe && xrandr --output VGA1 --mode 1024x768-safe
VGA1 to correct output name.
EDID checksum is invalid
xrandr --addmode might give you the error
X Error of failed request: BadMatch. NVIDIA users should read NVIDIA/Troubleshooting#xrandr BadMatch.
BadMatch could indicate an invalid EDID checksum. To verify that this is the case, run X in verbose mode (e.g.
startx -- -logverbose 6) and check your Xorg log for messages about a bad EDID.
Poke around with
~/.config/monitors.xml, or delete the file completely, and then reboot.
It is better explained in this article.
Permanently adding undetected resolutions
Once a suitable resolution is found using
xrandr, the mode can be permanently added by creating an entry in
Section "Monitor" Identifier "VGA1" Modeline "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync Option "PreferredMode" "1280x1024_60.00" EndSection Section "Screen" Identifier "Screen0" Monitor "VGA1" DefaultDepth 24 SubSection "Display" Modes "1280x1024_60.00" EndSubSection EndSection Section "Device" Identifier "Device0" Driver "intel" EndSection
intel with the right driver, e.g.
Resolution lower than expected
If you video card is recognized but the resolution is lower than you expect, you may try this.
Background: ATI X1550 based video card and two LCD monitors DELL 2408(up to 1920x1200) and Samsung 206BW(up to 1680x1050). Upon first login after installation, the resolution default to 1152x864. xrandr does not list any resolution higher than 1152x864. You may want to try editing /etc/X11/xorg.conf, add a section about virtual screen, logout, login and see if this helps. If not then read on.
Section "Screen" ... SubSection "Display" Virtual 3600 1200 EndSubSection EndSection
About the numbers: DELL on the left and Samsung on the right. So the virtual width is of sum of both LCD width 3600=1920+1680; Height then is figured as the max of them, which is max(1200,1050)=1200. If you put one LCD above the other, use this calculation instead: (max(width1, width2), height1+height2).
Correction of overscan tv resolutions
Check your TV if there is a parameter to change. if not, apply an underscan and change values of vborder and hborder. Underscan vborder and underscan hborder can be different for you, just check it and change it by more or less.
xrandr --output HDMI-0 --set underscan on --set "underscan vborder" 25 --set "underscan hborder" 40
Full RGB in HDMI
It may occur that the Intel driver will not configure correctly the output of the HDMI monitor. It will set a limited color range (16-235) using the Broadcast RGB property, and the black will not look black, it will be grey.
To see if it is your case:
$ xrandr --output HDMI1 --set "Broadcast RGB" "Full"