Cuando se enciende un ordenador o se enchufa un monitor, se lee de dicho monitor una información llamada EDID que contiene los datos sobre las frecuencias a las que funciona el monitor o las resoluciones soportadas.
Con xrandr podemos cambiar la resolución gráfica de la pantalla a través de la línea de comandos sin usar las opciones correspondientes a nuestro entorno de escritorio. Obviamente esto sólo tiene sentido si se ejecuta el comando desde una de las terminales virtuales con un servidor gráfico como X corriendo.
Algunos de los usos básicos de xrandr son:
Listar los monitores y las resoluciones que soportan
Basta con ejecutar el comando xrandr en la consola y nos devolverá los monitores enchufados, incluyendo su código. Por ejemplo, en mi caso al ejecutar xrandr se devuelve esto:
$ xrandr
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 32767 x 32767
VGA1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 410mm x 230mm
1152x864 75.0
1024x768 75.1 70.1 60.0
832x624 74.6
800x600 72.2 75.0 60.3 56.2
640x480 72.8 75.0 66.7 60.0
720x400 70.1
1280x720 59.9
1366x768 59.8*
Como veis en la parte superior del código devuelto, mi monitor lo
detecta como VGA1. Este es un código que tendremos que usar en el resto
de funciones para que xrandr sepa con qué monitor estamos trabajando
(con el nuestro, con una TV o con un proyector...). También se muestran
las distintas resoluciones que soporta y las frecuencias de refresco a
las que funciona el monitor.
Establecer un modo de pantalla
Podemos establecer un modo de pantalla usando el comando:
$ xrandr --output --mode
Donde es el código del dispositivo con el que estamos trabajando (por ejemplo, VGA1 en mi caso), y es la resolución de pantalla que queramos usar y que por supuesto debe estar en la lista. Por ejemplo:
$ xrandr --output VGA1 --mode 1366x768
Añadir nuevos modos de pantalla no detectados
En algunos casos el EDID puede no ser leído correctamente y podría no
ser posible establecer alguna resolución en concreto. Esto puede ser un
problema ya que si estamos configurando un monitor TFT o un proyector no
podríamos establecer la resolución óptima y eso podría tener el
inconveniente de que la visión del monitor no será nítida, tal vez la
resolución de aspecto no coincida...
Para solucionar eso podemos crear modos nuevos con la ayuda de otro
programa llamado cvt. Con cvt podremos crear Modelines, que son
definiciones de modos gráficos que pueden ser procesados por xrandr y
establecidos como resoluciones.
Para usar cvt tenemos que usar dos o tres parámetros. Como mínimo
tenemos que indicarle el ancho y el alto de la resolución que queremos
crear, aunque también podemos indicarle la frecuencia de refresco. Por
ejemplo:
$ cvt 1280 720 # 1280x720, frecuencia predeterminada
$ cvt 1280 720 60 # 1280x720, 60 Hz de refresco
Nos devolverá una línea con la información que le hemos pedido:
$ cvt 1280 720
# 1280x720 59.86 Hz (CVT 0.92M9) hsync: 44.77 kHz; pclk: 74.50 MHz
Modeline "1280x720_60.00" 74.50 1280 1344 1472 1664 720 723 728 748 -hsync +vsync
Este código podemos introducirlo en xrandr para añadir la resolución
nueva. Tendremos que descartar la primera línea, que empieza con la
almohadilla, ya que no es útil. Nos interesa la segunda línea, la que
empieza con Modeline, aunque tampoco nos interesa esa palabra, sino que
sólamente querremos introducir el bloque "1280x720_60.00" 74.50 1280 1344 1472 1664 720 723 728 748 -hsync +vsync.
Para agregar este modo a xrandr tenemos que usar la siguiente secuencia de comandos:
1. Crear el modo
Simplemente ejecutando el comando
$ xrandr --newmode
donde es lo que nos ha devuelto CVT, como ya
hemos dicho a partir de la palabra Modeline pero sin incluir ésta misma.
Por ejemplo:
$ xrandr --newmode "1280x720_60.00" 74.50 1280 1344 1472 1664 720 723 728 748 -hsync +vsync
2. Añadir el modo a una pantalla
Una vez creado el modo tendremos que añadir ese modo que hemos configurado a un monitor usando el comando
$ xrandr --addmode
de modo que es el dispositivo gráfico al que lo
queremos añadir (como VGA1), y es el nombre del modo que
hemos creado, que es ese código que venía entre comillas en la línea
generada con cvt, por ejemplo, "1280x720_60.00". De modo que esto se
podría hacer así:
$ xrandr --addmode VGA1 1280x720_60.00
Ahora podemos ejecutar xrandr a secas para ver como ya ha sido añadido a
la lista y podríamos establecer ese modo simplemente haciendo xrandr
--set VGA1 --mode 1280x720_60.00. Como se ve, este código entre comillas
que viene generado por CVT identifica al modo. Si os resulta un poco
incómodo siempre podéis cambiarlo por algo más simplificado como por
ejemplo "1280x720" a secas.
Para monitor ASUS VS2070
cvt 1600 900
xrandr --newmode "1600x900_60.00" 118.25 1600 1696 1856 2112 900 903 908 934 -hsync +vsync
xrandr --addmode VGA-0 1900x600_60.00
xrandr --output VGA-0 --mode 1600x900_60.00