Hallo,
habe noch weitere BUGs entdeckt und entfernt:
Skript:
/opt/videosettings/xrandr-video-clone.sh
#!/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/<Primary><Alt>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
Download (Endung .txt muss entfernt werden): xrandr-video-clone.sh.txt (5,1 KB)
Gruß
Stefan