Einführung

An einem Computer oder Notebook angeschlossene Bildschirme kann man sehr einfach mit dem Tool xrandr verwalten und steuern. Dabei kann man z. B. den Bildausschnitt oder die Auflösung festlegen. Dieser Artikel gilt für Bildschirme wie auch für Beamer.

Bildschirme erkennen

Mit folgendem Befehl kann man feststellen, welche Bildschirme einem zur Verfügung stehen und wie die aktuelle Konfiguration aussieht:

$ xrandr --query

Wenn an meinem Notebook kein externer Bildschirm angeschlossen ist, sieht das so aus:

$ xrandr --query
Screen 0: minimum 320 x 200, current 1280 x 800, maximum 8192 x 8192
LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm
   1280x800       60.2*+   50.0
   1024x768       60.0
   800x600        60.3     56.2
   640x480        59.9
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)

Am Status disconnected ist gut ersichtlich, dass am VGA-Port ( VGA1) noch kein Gerät angeschlossen ist. Nach dem Einstecken von einem Bildschirm am VGA Port sieht die Ausgabe folgendermassen aus:

$ xrandr --query
Screen 0: minimum 320 x 200, current 1280 x 800, maximum 8192 x 8192
LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm
   1280x800       60.2*+   50.0
   1024x768       60.0
   800x600        60.3     56.2
   640x480        59.9
VGA1 connected (normal left inverted right x axis y axis)
   1024x768       60.0 +   85.0     75.1     70.1
   1280x1024      60.0
   1152x864       75.0
   832x624        74.6
   800x600        85.1     72.2     75.0     60.3
   640x480        85.0     72.8     75.0     60.0
HDMI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)

Das Pluszeichen ( +) zeigt, welche Auflösung für die Autokonfiguration ( --auto) verwendet wird. Der Stern ( *) zeigt, welche Auflösung aktiv ist. In diesem Fall ist nur der interne Monitor ( LVDS1) aktiviert. Der externe Bildschirm ( VGA1) ist nicht aktiv.

Alle angeschlossenen Bildschirme automatisch aktivieren

Um alle angeschlossenen Bildschirme zu aktivieren, genügt dieser einfache Befehl:

$ xrandr --auto

Somit werden alle angeschlossenen Geräte automatisch mit der passendsten Auflösung (erkennbar am +) konfiguriert und eingeschaltet. Dabei liegen die zwei Bilder übereinander. Ist ein Bildschirm kleiner, wird dort das Bild abgeschnitten und ist nicht komplett sichtbar.

Nach dem Ausstecken von einem Monitor kann man diesen Befehl auch zum Deaktivieren vom nicht mehr mehr angeschlosenen Monitor verwenden.

Nur externen Bildschirm verwenden

Der externe Bildschirm ( VGA1) kann mit diesem Befehl aktiviert und der interne Bildschirm ( LVDS1) deaktiviert werden:

$ xrandr --output LVDS1 --off --output VGA1 --auto

Jetzt ist nur noch der externe Bildschirm aktiv.

Nur internen Bildschirm verwenden

Wenn man den externen Monitor ( VGA1) deaktivieren und nur noch den internen Monitor ( LVDS1) verwenden will, kann man folgenden Befehl nutzen:

$ xrandr --output LVDS1 --auto --output VGA1 --off

Jetzt ist nur noch der interne Bildschirm aktiv.

Internen Bildschirm mit externem Bildschirm erweitern

Manchmal möchte man den internen Bildschirm um den externen Bildschirm erweitern. Mit dem Schalter --right-of, --left-of, --above oder --below kann man dabei die Position festlegen.

$ xrandr --output LVDS1 --auto --output VGA1 --auto --right-of LVDS1

Nach dem Ausführen von diesem Befehl, ist der externe Bildschirm ( VGA1) auf der rechten Seite vom internen Bildschirm ( LVDS1) aktiv.

Internen Bildschirm auf externen Bildschirm clonen

Um genau dasselbe Bild auf beiden Bildschirmen auszugeben, muss man zuerst die grösste gemeinsame Auflösung herausfinden. Diese Information kann man mit xrandr --query herausfinden. Folgender Befehl macht das automatisch:

$ xrandr --query | awk '/^ *[0-9]*x[0-9]*/{ print $1 }' | sort -n | uniq -d | tail -1

Dass der externe Bildschirm ( VGA1) dasselbe wie der interne Bildschirm ( LVDS1) anzeigt, wird mit dem Schalter --same-as LVDS1 gesagt. Die gemeinsame Auflösung muss man für beide Bildschirme mit dem Schalter --mode definieren. So sieht der Befehl aus:

$ xrandr --output LVDS1 --mode 1024x768 --output VGA1 --same-as LVDS1 --mode 1024x768

Jetzt nutzen beide Bildschirme die selbe Auflösung und zeigen den selben Inhalt an.

Automatisierung mit einem Script

Ich habe mir ein Wrapper-Script geschrieben, welches diese Aufgaben für mich übernimmt:

#!/usr/bin/env bash
######################################################################
#
# bildschirm
# Bildschirme/Beamer steuern und verwalten
#
# Copyright 2011 Emanuel Duss
# Licensed under GNU General Public License
#
# 2011-07-26; Emanuel Duss; Erste Version
# 2012-08-26; Emanuel Duss; $CLONERES automatisch bestimmen
#
######################################################################

######################################################################
# Variabeln
INTERN="LVDS1"
EXTERN="VGA1"

######################################################################
# Funktionen
PrintUsage(){
cat << EOI
Usage:
 bildschirm < modes | intern | extern | clone | extend >
Optionen:
  modes    Moegliche Modes ausgeben
  intern   Nur internen Bildschirm verwenden
  extern   Nur externer Bildschirm verwenden
  clone    Gleiche Ausgabe auf beiden Bildschirmen
  extend   Bild auf externem Bildschirm erweitern
EOI
}

######################################################################
# Main
case $1 in
  modes)
    xrandr -q
    ;;
  intern)
    xrandr --output $INTERN --auto --output $EXTERN --off
    ;;
  extern)
    xrandr --output $INTERN --off --output $EXTERN --auto
    ;;
  clone)
    CLONERES=`xrandr --query | awk '/^ *[0-9]*x[0-9]*/{ print $1 }' | sort -n | uniq -d | tail -1`
    xrandr --output $INTERN --mode $CLONERES --output $EXTERN --same-as $INTERN --mode $CLONERES
    ;;
  extend)
    xrandr --output $INTERN --auto --output $EXTERN --auto --right-of $INTERN
    # xrandr --output $EXTERN --mode $EXTRES --pos 1280x0 --output $INTERN --mode $INTRES --pos 0x400
    ;;
  *)
    PrintUsage
    ;;
esac
# EOF

Dem Skript gibt man als ersten Parameter entweder modes, intern, extern, clone oder extend mit und schon wird der richtige xrandr-Befehl aufgerufen. Das sind die möglichen Optionen:

  • modes: Moegliche Modes ausgeben
  • intern: Nur internen Bildschirm verwenden
  • extern: Nur externer Bildschirm verwenden
  • clone: Gleiche Ausgabe auf beiden Bildschirmen
  • extend: Bild auf externem Bildschirm erweitern

Wenn ich z.B. jetzt auf beiden Bildschirmen das gleiche Bild anzeigen will, mache ich das so:

$ bildschirm clone

Vorausgesetzt das Script ist ausführbar im $PATH zu finden.

Die aktuellste Version davon gibt es auf GitHub in meinem Scripts Repository: screenctl.