Anzeige automatisch klonen

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

2 „Gefällt mir“