summaryrefslogtreecommitdiffstats
path: root/core/modules/run-virt/data/opt/openslx/vmchooser/data/linux/resolution
blob: 08a4853a7fd4561a3a6d1d8649ffa86156ecd37d (plain) (blame)
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
89
90
91
92
93
94
95
96
#!/bin/bash

# Achtung: Dieses Skript ist veraltet und sollte nur noch zur Anschauung bzw. zu Debugzwecken
# genutzt werden. Stattdessen sollte das Skriptpaket openslx genutzt werden.
# Es liest die Datei openslx.ini aus, in der die Auflösung des Grundsystems bereitgestellt 
# wird. Die (Pseudo-)Floppy fd1 wird vom  openslx-Grundsystem geliefert. Es loggt nach SYSLOG (
# syslog oder messages).
# 
# Zu erledigen: Jede Menge, zB anständiges Trapping, Fehler abfangen usw...
# set -x

OWNDIR=$(dirname $0)
source "$(dirname $0)"/includes/00_vars.inc
source "$(dirname $0)"/includes/60_resolution.inc

DISPLAY=:0.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}')
for wartezeit in 1 2 3 5 10 10 0 ende; do
	[ "$wartezeit" = "ende" ] && { logger "openslx resolution utility: XAUTHFILE not found. Exiting." ; exit 1; }
	XAUTHORITY=$(ps aux | grep -o "root.*X.* \-auth *[^ ]*" | awk '{print $NF}')
	[ -n "${XAUTHORITY}" ] && break
	sleep $wartezeit
done
logger "openslx resolution utility: XAUTHFILE found."

# 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 8 8 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