1 | #!/bin/sh
|
---|
2 | #
|
---|
3 | # @file
|
---|
4 | #
|
---|
5 | # Sun xVM VirtualBox
|
---|
6 | # X11 guest additions: dynamic display changes
|
---|
7 | #
|
---|
8 | # Copyright (C) 2008 Sun Microsystems, Inc.
|
---|
9 | #
|
---|
10 | # This file is part of VirtualBox Open Source Edition (OSE), as
|
---|
11 | # available from http://www.virtualbox.org. This file is free software;
|
---|
12 | # you can redistribute it and/or modify it under the terms of the GNU
|
---|
13 | # General Public License (GPL) as published by the Free Software
|
---|
14 | # Foundation, in version 2 as it comes in the "COPYING" file of the
|
---|
15 | # VirtualBox OSE distribution. VirtualBox OSE is distributed in the
|
---|
16 | # hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
|
---|
17 | #
|
---|
18 | # Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
|
---|
19 | # Clara, CA 95054 USA or visit http://www.sun.com if you need
|
---|
20 | # additional information or have any questions.
|
---|
21 | #
|
---|
22 |
|
---|
23 | #
|
---|
24 | # In order to keep things simple, we just call the X11 xrandr application
|
---|
25 | # when we receive notification of a display change instead of reimplementing
|
---|
26 | # it inside our Guest Additions client application. This saves us among
|
---|
27 | # other things having to find ways to build and link the C code on systems
|
---|
28 | # which do not support RandR 1.2. We wrap the call to xrandr in this script
|
---|
29 | # so that we can make any fiddly adjustments to the call which may be needed.
|
---|
30 | #
|
---|
31 |
|
---|
32 | xorgbin=Xorg
|
---|
33 | found=`which Xorg | grep "no Xorg"`
|
---|
34 | if test ! -z "$found"; then
|
---|
35 | if test -f "/usr/X11/bin/Xorg"; then
|
---|
36 | xorgbin=/usr/X11/bin/Xorg
|
---|
37 | else
|
---|
38 | exit 1
|
---|
39 | fi
|
---|
40 | fi
|
---|
41 |
|
---|
42 | randrbin=xrandr
|
---|
43 | found=`which xrandr | grep "no xrandr"`
|
---|
44 | if test ! -z "$found"; then
|
---|
45 | if test -f "/usr/X11/bin/xrandr"; then
|
---|
46 | randrbin=/usr/X11/bin/xrandr
|
---|
47 | else
|
---|
48 | exit 1
|
---|
49 | fi
|
---|
50 | fi
|
---|
51 |
|
---|
52 | refreshbin=xrefresh
|
---|
53 | found=`which xrefresh | grep "no xrefresh"`
|
---|
54 | if test ! -z "$found"; then
|
---|
55 | if test -f "/usr/X11/bin/xrefresh"; then
|
---|
56 | refreshbin=/usr/X11/bin/xrefresh
|
---|
57 | else
|
---|
58 | exit 1
|
---|
59 | fi
|
---|
60 | fi
|
---|
61 |
|
---|
62 | # If we were called with the --test parameter, we check whether the display
|
---|
63 | # we are running on is really using the VBox video driver (and RandR 1.2),
|
---|
64 | # and whether we are running on a buggy version of X.Org which might crash
|
---|
65 | # when we resize.
|
---|
66 | if test "$1" = "--test"; then
|
---|
67 | # Check for buggy X.Org versions
|
---|
68 | xout=`$xorgbin -version 2>&1`
|
---|
69 | if echo "$xout" | grep 1.4.99.901 > /dev/null ||
|
---|
70 | echo "$xout" | grep 1.4.99.902 > /dev/null ||
|
---|
71 | echo "$xout" | grep 1.4.99.903 > /dev/null ||
|
---|
72 | echo "$xout" | grep 1.4.99.904 > /dev/null ||
|
---|
73 | echo "$xout" | grep 1.4.99.905 > /dev/null
|
---|
74 | then
|
---|
75 | echo "Warning: the version of the X Window system on your guest has a known"
|
---|
76 | echo "problem. Because of this, dynamic resizing and seamless mode will not work."
|
---|
77 | echo
|
---|
78 | exit 1
|
---|
79 | fi
|
---|
80 | # Check to see if the server is configured to use static modes only.
|
---|
81 | for conf in "/etc/X11/xorg.conf-4" "/etc/X11/xorg.conf" "/etc/X11/.xorg.conf" "/etc/xorg.conf" \
|
---|
82 | "/usr/etc/X11/xorg.conf-4" "/usr/etc/X11/xorg.conf" "/usr/lib/X11/xorg.conf-4" \
|
---|
83 | "/usr/lib/X11/xorg.conf"
|
---|
84 | do
|
---|
85 | if [ -r $conf ]
|
---|
86 | then
|
---|
87 | if awk -v IN_SECTION=0 \
|
---|
88 | 'tolower($0) ~ /^[ \t]*section/ { IN_SECTION=1 } '\
|
---|
89 | 'tolower($0) ~ /^[ \t]*modes/ { if (IN_SECTION) { print "mode"; exit } } '\
|
---|
90 | 'tolower($0) ~ /^[ \t]*option[ \t]+\"preferredmode\"/ { if (IN_SECTION) { print "mode"; exit } } '\
|
---|
91 | 'tolower($0) ~ /endsection/ { IN_SECTION=0 }' \
|
---|
92 | $conf 2>/dev/null | grep mode > /dev/null
|
---|
93 | then
|
---|
94 | echo "Disabling dynamic resizing as the X server is configured to only use static"
|
---|
95 | echo "resolutions. To fix this, edit the server configuration file, remove all"
|
---|
96 | echo "\"Modes\" lines from the \"Screen\" section and any Option \"PreferredMode\""
|
---|
97 | echo "lines from \"Monitor\" sections and restart the server."
|
---|
98 | echo
|
---|
99 | exit 1
|
---|
100 | fi
|
---|
101 | fi
|
---|
102 | done
|
---|
103 | # Don't write out error information in this case, as this script is also
|
---|
104 | # called from the installer, and vboxvideo will not yet be in place yet in
|
---|
105 | # that case.
|
---|
106 | $randrbin 2> /dev/null | grep VBOX1 > /dev/null
|
---|
107 | exit
|
---|
108 | fi
|
---|
109 |
|
---|
110 | # Otherwise we just switch the guest display into its preferred resolution,
|
---|
111 | # which is the one corresponding to the last video mode hint sent by the host.
|
---|
112 | $randrbin --output VBOX1 --preferred
|
---|
113 | $refreshbin 2>&1 > /dev/null
|
---|
114 |
|
---|