9 de julio de 2013

Cambiar la resolución de la pantalla con xrandr y cvt

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 <dispositivo> --mode <resolucion>

Donde <dispositivo> es el código del dispositivo con el que estamos trabajando (por ejemplo, VGA1 en mi caso), y <resolucion> 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 <línea de Modeline>

donde <línea de Modeline> 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 <dispositivo> <modo>

de modo que <dispositivo> es el dispositivo gráfico al que lo queremos añadir (como VGA1), y <modo> 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.