summaryrefslogblamecommitdiffstats
path: root/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/includes/60_resolution.inc
blob: 6643366319991cbd077a88ce515f1f55b157a411 (plain) (tree)


























                                                                                                              
                                                   
















































                                                                                                                                        
set_resolution()
{
	DISPLAY="${1}.0"
	logger "openslx resolution utility started."
	
	# Da nun fremdgemountet wird, hier sicherheitshalber zur Kontrolle wg. Gross-/Kleinschreibung:
	SLXCONFIGFILE=$(find "${DISKMOUNTDIR}" -iwholename "${SLXCONFIGFILE}")
	
	if [ -f "$SLXCONFIGFILE" ]; then
		RESOLUTION=$(grep 'resolution=' "$SLXCONFIGFILE" | cut -d '=' -f 2)
		if [ -z $RESOLUTION ]; then
			logger "openslx resolution utility: resolution file $SLXCONFIGFILE seems to be empty!"
			exit 1
		fi
		logger "openslx resolution utility: resolution file $SLXCONFIGFILE yields ${RESOLUTION}."
	else
		logger "openslx resolution utility: resolution file $SLXCONFIGFILE not found!"
		exit 1
	fi
	
	# Das ist mitunter ein Problem, da die richtige zu finden - Distroabhängig!
	# Hier ein Beispiel für openSuse 13.2, sollte auch für Debian, Ubuntu, Redhat usw. laufen:.
	# XAUTHDATEI=$(ps aux | grep -o "root.*X.* \-auth *[^ ]*" | awk '{print $NF}')
	get_xauthfile

	# Zu verbessern: Der Name des Verbundenen ist nicht immer bekannt. Daher nehmen wir das
	# erste 'connected' in der Ausgabe xrandrs Und warten evtl. ein Weilchen)::
	for wartezeit in 1 1 1 2 2 2 4 4 0 ende; do
		[ "$wartezeit" = "ende" ] && { logger "openslx resolution utility: Could not detect output device. Exiting." ; exit 1; }
		AUSGABE=$(DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" xrandr -q|grep -m 1 " connected "|awk '{print $1}')
		[ -n "$AUSGABE" ] && break
		sleep $wartezeit
	done
	
	# Pruefen, ob xrand eine passende modeline ausgibt:
	if [ "$(DISPLAY=${DISPLAY} XAUTHORITY=${XAUTHORITY} xrandr | grep -c ${RESOLUTION}[[:space:]])" -eq 0 ]; then
		logger "openslx resolution utility: xrandr yields no fitting modeline; adding one."
		MODELINE=$(cvt ${RESOLUTION//x/ } | grep -v "^#" | sed "s/Modeline //g" | sed 's/"//g')
		DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" xrandr --newmode $(echo ${MODELINE})
		DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" xrandr --addmode ${AUSGABE} $(echo ${MODELINE} | cut -d " " -f 1)
		# Dann einzusteuernde Auflösung natürlich auf die neue ändern:
		RESOLUTION=$(echo ${MODELINE} | cut -d " " -f 1)
		logger "openslx resolution utility: (xrandr) modeline ${MODELINE} added (${RESOLUTION})."
	fi
	
	# Auflösung per xrandr setzen:
	DISPLAY="${DISPLAY}" XAUTHORITY="${XAUTHORITY}" xrandr --output ${AUSGABE} --mode ${RESOLUTION}
	ERR=$?
	if [ $ERR -ne 0 ]; then
		logger "openslx resolution utility: xrandr error code ${ERR}."
	else
		logger "openslx resolution utility: xrandr ok. Mode $RESOLUTION set."
	fi
	
	# Das hier ist ein wenig problematisch, da nach X-Start die gewünschte Desktopumgebung
	# diese gern zuvor gespeicherte Auflösungen wieder einspielt. Daher warten wir einfach,
	# und prüfen in gewissen Zeitabständen, ob sich die Auflösung geändert hat, und spielen
	# im Änderungsfalle die Grundsystemauflösung wieder ein. Schön ist das nicht.
	
	# Now, let's wait some seconds to see if another process re-changes res.:
	sleep 5
	check_resolution
	
	# Now, let's wait some more seconds to see if another process re-changes res.:
	sleep 15
	check_resolution
	
	# Now, let's wait even more seconds to see if another process re-changes res.:
	sleep 20
	check_resolution
	
	# Now, let's wait even more seconds to see if another process re-changes res.:
	sleep 40
	check_resolution
	
	exit 0
}