#!/bin/bash # xrandr-video-clone # # Speicherort: /opt/videosettings/xrandr-video-clone.sh # # Stellt die native Bildschirmauflösung für 1 Anzeigegerät ein und skaliert die anderen Anzeigegeräte ohne Bildverzerrung. # Durch erneutes Starten wird das nächste Anzeigegerät als jenes mit der nativen Bildschirmauflösung ausgewählt # # Linux Mint 17.0 Xfce 64bit # Linux Mint 18.2 Xfce 64bit # # Sen 2017-12-12 # GPL v3 ### Shortcut setzen, um Skript per Shortcut aufrufen zu können (NUR FÜR XFCE-Desktop) # xfconf-query -c xfce4-keyboard-shortcuts -p "/commands/custom/r" -n -t string -s "/opt/videosettings/xrandr-video-clone.sh" ### Ermitteln der angeschlossenen Anzeigeräte und der jewiligen ersten nativen Auflösung xrandr --query --verbose > /tmp/xrandr-video-clone.xdr za=`cat /tmp/xrandr-video-clone.xdr | wc -l` nmbr=0 # Äußere Schleife for ((z=1;z<=$za;z++)) ; do cat /tmp/xrandr-video-clone.xdr | sed -n `echo $z`p > /tmp/xrandr-video-clone.ln1 vo=`awk '{ if ($1 ~ /[L,V,D,H]/) print $1 }' /tmp/xrandr-video-clone.ln1` vo_state=`awk '{ if ($1 ~ /[L,V,D,H]/) print $2 }' /tmp/xrandr-video-clone.ln1` if [ "$vo_state" = "connected" ] ; then unset vo_res # Innere Schleife while [ "$vo_res" = '' ] ; do ((z++)) cat /tmp/xrandr-video-clone.xdr | sed -n `echo $z`p > /tmp/xrandr-video-clone.ln2 vo_res=`cat /tmp/xrandr-video-clone.ln2 | grep -e \+preferred$ -e \+preferred[[:space:]] | awk '{print $1}'` # Endlosschleife bei fehlerhafter Ausgabe von xrandr vermeiden if [ "$z" -gt 1000 ] ; then break fi done # Bezeichnungen des angeschlossenen Anzeigeräts speichern disp[nmbr]=$vo echo "Angeschlossenes Anzeigegerät Nr.$nmbr: ${disp[nmbr]}" # Native Auflösungen des angeschlossenen Anzeigeräts speichern natres[nmbr]=$vo_res echo ${natres[nmbr]} natresx[nmbr]=$(echo $vo_res | cut -dx -f1) natresy[nmbr]=$(echo $vo_res | cut -dx -f2) echo "xres: ${natresx[nmbr]}" echo "yres: ${natresy[nmbr]}" echo "--------------" disp[nmbr]=$vo # Höchste Nummer der angeschlossenen Anzeigeräte speichern (beginnend mit 0) dispmaxnumb=$nmbr # Zähler erhöhen nmbr=$((nmbr + 1)) # Anzahl der angeschlossenen Anzeigeräte speichern (beginnend mit 1) dispcon=$nmbr fi done echo "Höchste Nr. der angeschlossenen Anzeigegeräte: $dispmaxnumb" echo "Anzahl der angeschlossenen Anzeigegeräte: $dispcon" ### Fallunterscheidung falls nur 1 Anzeigegerät angeschlossen ist case $dispcon in 1*) ### Ein Anzeigegerät angeschlossen # Standardauflösung einstellen xrandr --output ${disp[0]} --mode ${natres[0]} --scale 1x1 ;; *) ### Mehrere Anzeigegeräte angeschlossen # Zähler für natives Anzeigegerät numb=$(head -n 1 /tmp/xrandr-video-clone.log) # Zähler erhöhen numb=$((numb + 1)) # Zähler überprüfen und gegebenenfalls zurücksetzen [[ ! $numb = [0-$dispmaxnumb] ]] && numb=0 # Zähler in Datei schreiben echo $numb > /tmp/xrandr-video-clone.log # Zähler für anzupassende Anzeigegeräte for((i=0; i<$dispcon; i++)) ; do if [ ! $i = $numb ] ; then # Anzupassenden Anzeigemodus berechnen quotx=$(echo "scale=8; ${natresx[$numb]} / ${natresx[$i]}" | bc -l) echo "xopt: ${natresx[$numb]}" echo "xtofit: ${natresx[$i]}" echo "xquot: $quotx" quoty=$(echo "scale=8; ${natresy[$numb]} / ${natresy[$i]}" | bc -l) echo "yopt: ${natresy[$numb]}" echo "ytofit: ${natresy[$i]}" echo "yquot: $quoty" if ( expr $quotx \> $quoty >/dev/null ) ; then echo "xquot>yquot" fitresx[$i]=${natresx[$i]} fitresy[$i]=$(echo "scale=0; ${natresx[$i]} * ${natresy[$numb]} / ${natresx[$numb]}" | bc -l) echo "xfit: ${fitresx[$i]}" echo "yfit: ${fitresy[$i]}" else echo "yquot>xquot" fitresy[$i]=${natresy[$i]} fitresx[$i]=$(echo "scale=0; ${natresy[$i]} * ${natresx[$numb]} / ${natresy[$numb]}" | bc -l) echo "xfit: ${fitresx[$i]}" echo "yfit: ${fitresy[$i]}" fi fitmodeline[$i]=$(cvt ${fitresx[$i]} ${fitresy[$i]} | grep Modeline | cut -d\" -f2,3 | sed 's/\"//g') fitmode[$i]=$(cvt ${fitresx[$i]} ${fitresy[$i]} | grep Modeline | cut -d\" -f2) echo "fitmodeline: ${fitmodeline[$i]}" echo "fitmode: ${fitmode[$i]}" # Berechneten Anzeigemodus registrieren echo "Befehlszeile: xrandr --newmode ${fitmodeline[$i]}" xrandr --newmode ${fitmodeline[$i]} echo "Befehlszeile: xrandr --addmode ${disp[$i]} ${fitmode[$i]}" xrandr --addmode ${disp[$i]} ${fitmode[$i]} # Anzeige klonen echo "Befehlszeile: xrandr --output ${disp[$numb]} --mode ${natres[$numb]} --scale 1x1 --output ${disp[$i]} --same-as ${disp[$numb]} --mode ${fitmode[$i]} --scale-from ${natres[$numb]}" xrandr --output ${disp[$numb]} --mode ${natres[$numb]} --scale 1x1 --output ${disp[$i]} --same-as ${disp[$numb]} --mode ${fitmode[$i]} --scale-from ${natres[$numb]} fi done ;; esac ### Benachrichtigung anzeigen notify-send -t 8700 "Anzeige ist nun optimiert für Anzeigerät ${disp[$numb]}" exit 0