Hallo, ich arbeite zurzeit an einem Shell Skript, das Plug-and-Play-Funktionalität für USB-Bildschirme bereitstellt. Es funktioniert an sich schon ganz gut. Hier und da könnten allerdings einige Stellen eleganter/allgemein gültiger gestaltet werden.
Info:
- Bisher getestet auf einem ThinkPad T430 mit dem USB-Display: Lenovo ThinkVision LT1421, Ubuntu 14.04, GNOME Shell
Fehler / Fehlverhalten:
- Nachdem der Computer aus dem Ruhezustand erwacht, teilweise komische Darstellung bzw. schwarzer Bildschirm oder sogar Systemabsturz.
Anregungen:
- Bei mir konfiguriert sich der Laptopbildschirm automatisch wieder korrekt, wenn ich den USB-Bildschirm abziehe. Wäre das Verhalten nicht dennoch klarer definiert, wenn man ein weiteres Skript schreibt, das nach Entfernen des Bildschirmes eine explizite Konfiguration vorgibt?
- Zeile 18: gibt es eine präziesere Möglichkeit um festzustellen, ob udl bereits im Kernel geladen wurde?
- Zeile 56: xauth extract ~/.Xauthority $DISPLAY in die .bashrc kopieren ist sicher kein guter Weg. Weiß jemand eine Alternative, um diesen Befehl optimal in den Systemstart zu integrieren?
- Zeile 82: users | cut -d " " -f 1 ist das der optimale Weg, um den momentanen Benutzer zu erkennen?
- Zeile 31 bis 34: Wie es schon in den Kommentaren steht, frage ich mich ob das vielleicht auch noch eleganter zu lösen wäre.
- Zeile 65: Trotz einiger Forschungsarbeit bin ich mir noch nicht ganz sicher, ob die 80 zu Beginn der udev-Regel richtig gewählt ist oder ob eine andere Zahl (aus welchen Gründen auch immer) besser wäre.
Das Skript: (Sorry, die Kommentare sind ein wenig verrückt worden ...)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #!/bin/bash ################################# Plug-and-Play für USB-Bildschirm (Thinkvision) ######################################## # für weitere nützliche Infos: https://wiki.archlinux.org/index.php/DisplayLink # nützlich: # tailf /var/log/syslog zeige letzte Zeilen des Systemlogs # udevadm info --query=all --attribute-walk --name=/dev/srX listet Infos (Attribute) über das Gerät (und dessen Eltern) # sudo udevadm trigger # sudo reload udev startet den udev Daemon neu # sudo udevadm test /sys/class/block/sdbX zeigt vorhandene Regeln für das Gerät an ########################################################################################################################### ################################################# FUNKTIONEN ############################################################## # Kernelmodul (USB-Display-Treiber) laden ... function ladeKernelModul(){ if [ `lsmod | grep -c udl` -eq 0 ]; then sudo modprobe udl fi } # Konfiguriere Displays mit xrandr ... function konfiguriere(){ leftright="$1" benutzer="$2" export XAUTHORITY=/home/$benutzer/.Xauthority # Gebe root die Rechte, um sich mit dem XServer des Users zu verbinden. export DISPLAY=:0.0 # Einfacher: erlaube root Zugriff auf die Bildschirme des users # Denn normalerweise hat root keinen Zugriff darauf. primaryscreen="`xrandr | grep -E \[0-9\]\{3,4\}x\[0-9\]\{3,4\} | grep connected | cut -d " " -f 1 | sed -n '1p'`" # Hauptdisplayinterface usbscreen="`xrandr --current | grep -E \[0-9\]\{3,4\}x\[0-9\]\{3,4\} | grep connected | cut -d " " -f 1 | sed -n '2p'`" # USB-Displayinterface if [ ${#usbscreen} -eq 0 ]; then # manchmal stellt xrandr den Interfacenamen des USB-Bildschirms, sowie seine Auflösung usbscreen=`xrandr --current | grep DVI | cut -d " " -f 1` # untereinander dar. Deswegen noch die (meines Erachtens unsichere) aber hilfreiche fi # zweite Suche nach "DVI". (Wenn der String $usbscreen leer ist) Ggf. mal überprüfen, # ob DVI viellecht sogar grundsätzlich korrekt wäre. # Wenn ja, dann kann es zukünftig einfach bei "xrandr --current | grep DVI | cut -d " " -f 1" bleiben. xrandr --setprovideroutputsource 1 0 gtf 1366 768 59.9 newmonitormode="1368x768_59.90" # Name des neuen Mode xrandr --newmode "$newmonitormode" 85.72 1368 1440 1584 1800 768 769 772 795 -HSync +Vsync # neue Modekonfiguration darauf erzeugen xrandr --addmode $usbscreen "$newmonitormode" # neuen Mode dem USB-Bildschirm hinzufügen if [ "$leftright" = "right" ]; then xrandr --output $primaryscreen --primary xrandr --output $usbscreen --mode "$newmonitormode" --right-of $primaryscreen elif [ "$leftright" = "left" ]; then xrandr --output $primaryscreen --primary xrandr --output $usbscreen --mode "$newmonitormode" --left-of $primaryscreen fi } # Funktion für die Erstinstallation des Display ... function erstelleRegelUndKopiereSkript(){ leftright="$1" benutzer="$2" echo echo "BEMERKUNG: Ggf. 'xauth extract ~/.Xauthority $DISPLAY' in die eigene .bashrc eintragen, um den Befehl bei jedem log-in erneut auszuführen." echo skript="`echo ${0##*/}`" # Pfad abschneiden: aus "/home/.../.../diesesSkript" wird einfach "diesesSkript" regel="KERNEL==\\\"fb[0-9]*\\\", SUBSYSTEM==\\\"graphics\\\", DRIVERS==\\\"?*\\\", ENV{DISPLAY}=\\\":0\\\", ENV{XAUTHORITY}=\\\"/home/$benutzer/.Xauthority\\\", ATTR{virtual_size}==\\\"1366,768\\\", SYMLINK+=\\\"usbscreen\\\", ACTION==\\\"add\\\", RUN+=\\\"/usr/local/bin/"$skript" "$leftright"\\\"" # Da in der Regel selbst einige weiche Anführungszeichen enthalten sein müssen, werden sie hier derart escaped. xauth extract ~/.Xauthority $DISPLAY if [ ! -e /usr/local/bin/$skript ]; then # kopiere dieses Skript nach /usr/local/bin. sudo cp "$0" /usr/local/bin/ fi sudo su -c "echo $regel > /etc/udev/rules.d/80-usbscreen-custom.rules" # schreibe die UDEV-Regel in /etc/udev/rules.d/80-usbscreen-custom.rules. } ##################################################### MAIN ################################################################ # Parametercheck ... if [ ! $# -eq 1 ]; then echo "Benutzung: usbscreen [left|right]" exit 1 elif [ ! "$1" = "right" -a ! "$1" = "left" ]; then echo "Falsche Parameter. exit." exit 1 fi # links/rechts und ausführenden Benutzername zum besseren Verständnis in Variablen erfassen ... leftright="$1" benutzer=`users | cut -d " " -f 1` # Erstinstallation + Konfiguration ... if [ ! -e /etc/udev/rules.d/80-usbscreen-custom.rules ]; then erstelleRegelUndKopiereSkript $leftright "$benutzer" fi ladeKernelModul konfiguriere $leftright "$benutzer" |
Vielen Dank für das Interesse! ☺