Configuring screens with xrandr
There are various GUI tools on Linux to change the screen resolution and
configure the various screens of your machine, which is useful to do, e.g., when
plugging in a video projector to give talks.
From my experience, however, the right tool, the one that does not
hide anything from you and allows you to get the job done, is the CLI utility
xrandr
.
This post is a quick guide to perform common tasks with xrandr
. I'm certainly
not an
X guru,
but maybe this can serve as an introduction about how to perform
common display configuration tasks with it.
The starting point is always to see the current state with:
xrandr -q
This will print out information about all screens and outputs known to the system. For instance:
Screen 0: minimum 320 x 200, current 3360 x 1080, maximum 16384 x 16384
LVDS connected 1920x1080+1440+0 (normal left inverted right x axis y axis) 382mm x 215mm
1920x1080 60.01*+
1680x1050 59.95
1400x1050 59.98
1280x1024 59.89
1440x900 59.89
1280x960 59.94
1280x854 59.89
1280x800 59.81
1280x720 59.86
1152x768 59.78
1024x768 59.92
800x600 59.86
848x480 59.66
720x480 59.71
640x480 59.38
DisplayPort-0 disconnected (normal left inverted right x axis y axis)
DisplayPort-1 disconnected (normal left inverted right x axis y axis)
DisplayPort-2 disconnected (normal left inverted right x axis y axis)
VGA-0 connected 1440x900+0+0 (normal left inverted right x axis y axis) 408mm x 255mm
1440x900 59.89*+ 74.98
1280x1024 75.02 60.02
1280x800 59.81
1152x864 75.00
1024x768 75.08 70.07 60.00
832x624 74.55
800x600 72.19 75.00 60.32 56.25
640x480 75.00 72.81 66.67 60.00
720x400 70.08
The first thing is to figure out which output corresponds to which of the screens you have in front of you. You can usually determine it from the output names: VGA, HDMI, and DVI usually correspond to the connector type on the motherboard. On the example output above from my work computer, VGA-0 is indeed an external screen plugged in my computer's VGA port. LVDS is usually a laptop's internal screen, which is the case in the example. Sometimes the names are off, e.g., on my home computer, a DVI port is mistakenly labeled as an HDMI port. Alternatively, you can identify screens by their modes if you know which resolutions they support. For instance, above, I know that my main screen supports 1920x1080, so it is necessarily the LVDS one. (If you don't know what a screen resolution is, read on, I'll explain it.)
If you're trying to configure an external screen or video projector, and it
doesn't show up in the output of xrandr -q
, then you have a problem that's
deeper than just persuading X to use the output properly. You should probably
investigate whether the kernel or X server can see anything (in case your output
is not listed) or check the cable (in case the output is listed but indicated as
disconnected). When debugging things, know that all external screen standards
that I know of (VGA, DVI, HDMI) are perfectly plug-and-play, meaning that it is
safe to play with the cables. However, in some cases (e.g., laptops), it could
be the case that an output will not work unless the system has booted with a
usable screen on that output, or unless some magic key combination is pressed to
enable the output.
If all outputs that you want to use seem to be listed and have a screen connected to them, congrats! You can now configure them. The two simplest commands are the following. The first one enables one output that has a connected screen and sets it to its preferred resolution, which is usually what you want to do. The second one disables one output (any screen connected to it will usually go in power-save mode).
# enable output VGA1 and set its screen to its preferred mode
xrandr --output VGA1 --auto
# disable output VGA1
xrandr --output VGA1 --off
Now, how to decide what to put on each screen? The first possibility is to tile the display across multiple screens. This makes sense when you have a laptop and an external screen, or multiple screens on one machine, and want to show different windows on them. If you are trying to use a video projector, this is reasonable if you are using a fancy presentation tool like pdfpc that can show the slides on one screen and use your laptop screen to show the next slide, notes, etc. Here is an example to illustrate how this is configured1:
# my home setup is as follows, from left to right:
# one VGA screen, one DVI screen, one HDMI screen
xrandr --output VGA1 --left-of DVI1
xrandr --output DVI1 --left-of HDMI1
The second thing that you could want to do is to have two screens that show the same thing. For instance, for presentations using a non-fancy PDF reader, you usually want both your screen and the video projector to show your slides. This is achieved very simply:
# set VGA1 (the projector) to show the same thing as LVDS1 (laptop screen)
xrandr --output VGA1 --same-as LVDS1
However, if your projector is not set to the same resolution as your screen, your presentation will be clipped or mis-centered on one of the displays. Let me explain a bit about this. What a screen displays is made of atomic dots, aka pixels2, and the resolution of a screen is the number of pixels it displays, given as the width times the height, for instance 1024x768 (with the letter 'x' commonly used for the times symbol instead of the Unicode character '×'). Screen resolutions also have names, such as "VGA" (for 640x480), or "FHD" (for Full HD, that is3, 1920x1080). Screen resolution tells you nothing about the actual size of the display, which depends on the size of the physical pixels on the screen, aka pixel density4.
Screens can support multiple resolutions. In the vast majority of cases, the screen is designed to be used at its highest possible resolution, and lower resolutions look a bit ugly because they crudely scale up the lower resolution to the screen's physical resolution (the number of physical pixels it has). Screens can be set at a lower resolution as a poor man's version of zooming, although it is usually far prettier to do the resizing at the software level, e.g., use larger fonts, so that fonts are large but remain crisp. However, lower resolutions are also useful to show the same thing (e.g., your presentation) on two screens with different characteristics.
Doing xrandr -q
indicates which modes are supported by the screen connected to each
output, with a '+' next to the preferred mode (the one the screen is "designed"
to be used in) and a '*' next to the currently used mode. Each mode consists of
a screen resolution, given at the left, and a refresh
rate5.
Thus, to fix the problem with --same-as
, you should determine from the list what is
the highest resolution supported by both outputs. (With some luck, it will be
the projector's preferred resolution, so only your laptop screen will look a bit
blurry; but this is not always the case, especially when aspects ratios do not
match.) You should then set the outputs to that resolution; for
instance:
xrandr --output VGA1 --mode 1024x768
xrandr --output LVDS1 --mode 1024x768
It turns out that, when you want to use a mode that is not
proposed in xrandr -q
, you may be able to add one yourself. To create a mode
for 1024x768 at 60 Hz, you first run:
gtf 1024 768 60 | grep Modeline | cut -d' ' -f4-
Now you can run xrandr --newmode LINE
, where LINE
is the
output of the above, and run xrandr --addmode DISPLAY NAME
, where DISPLAY
is
the name of the display to which you want to add the mode, and NAME
is the
first field of LINE
(the one in quotes). The new mode should now appear in
xrandr -q
, and you can try switching to it with --mode
. This may fail in
creative ways if your screen doesn't like the mode. Thanks to Pierre for pointing this out!
Once you are done giving your presentation, you will probably want to revert your laptop's
screen to its preferred resolution using --auto
, as previously explained.
You can do a bunch of other things with xrandr
, such as rotating displays,
applying transformation matrices to them, software brightness and gamma
correction, zooming, etc., see man xrandr
to know more. Playing with these
options should be safe
(although it's true that, in ancient days, there were stories about
software ways to destroy CRT
screens...).
A real risk, however, is
that if you make all your screens unusable (e.g., turn them off with --off
,
make them display garbage with bogus scales, flip them, etc.,), xrandr
has no way to allow you to revert to sane settings automatically after a time,
as GUI tools often do. You will have to undo your
mistake in the blind. If you can't do this, one possible option is to switch to
a TTY with Ctrl-Alt-F1, and use xrandr from there; you will probably have to
pass it an environment variable so that it can talk to your X server, for
instance:
DISPLAY=":0" xrandr --output LDVS1 --auto
Worst comes, of course, you can always restart the machine, as these settings do not persist across reboots.
-
Experts will note that you can combine this in one invocation to the
xrandr
command, but for simplicity I will not address this here. ↩ -
Pixel is the abbreviation of "picture element" and is supposed to be the smallest displayable unit. However, in fact, on LCD screens, individual pixels are further split in red, green, and blue subpixels, as you can easily see with a magnifying glass (or, e.g., a drop of rain on your smartphone's screen). This fact is commonly used to improve the quality of the display to something finer than what the resolution would suggest, especially for text; this is known as subpixel rendering. ↩
-
It is typically quite annoying to see screens advertised as "Full HD" as if it were some magical statement about the quality of the screen, whereas it is nothing more than a technical statement about the number of pixels it can display. ↩
-
In particular, what Apple brands as "retina displays" are displays with a certain high pixel density, which supposedly exceeds the human eye's own density for a certain typical viewing distance. Nothing magical here either. ↩
-
The refresh rate is the number of times per second the screen should update, in Hertz. You can select it using
--rate
. I will not talk about it further, because it usually does not matter. ↩