summaryrefslogtreecommitdiffstats
path: root/xserver.py
blob: 16bb34a981932c63d0ac74567638b11b639bb1ed (plain)
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import os
import string
import kudzu
import isys
import sys
import time
from xf86config import *

def startX():
    global serverPath
    global mode
    
    os.environ['DISPLAY'] = ':1'
    serverPath = None

    print "Probing for mouse type..."
    mice = kudzu.probe (kudzu.CLASS_MOUSE,
                        kudzu.BUS_UNSPEC,
                        kudzu.PROBE_ONE);
    if not mice:
        raise RuntimeError, "Unable to find a mouse!"

    device = None
    mouseProtocol = None
    (mouseDev, driver, descr) = mice[0]
    if mouseDev == 'psaux':
        mouseProtocol = "PS/2"
	mouseEmulate = 0
        # kickstart some ps/2 mice.  Blame the kernel
        try:
            f = open ('/dev/psaux')
            f.write ('1')
            f.close
        except:
            pass
    elif mouseDev == 'sunmouse':
	mouseProtocol = "sun"
	mouseEmulate = 0
    else:
        mouseProtocol = "Microsoft"
	mouseEmulate = 1

    x = XF86Config ((mouseProtocol, mouseEmulate, mouseDev))
    x.probe ()
    if x.server and len (x.server) >= 3 and x.server[0:3] == 'Sun':
	serverPath = '/usr/X11R6/bin/Xs' + x.server[1:]
    elif x.server:
        serverPath = '/usr/X11R6/bin/XF86_' + x.server
    else:
        print "Unknown card, falling back to VGA16"
        serverPath = '/usr/X11R6/bin/XF86_VGA16'

    if not os.access (serverPath, os.X_OK):
        print serverPath, "missing.  Falling back to VGA16"
        serverPath = '/usr/X11R6/bin/XF86_VGA16'
        
    settings = { "mouseDev" : '/dev/' + mouseDev ,
                 "mouseProto" : mouseProtocol }
    f = open ('/tmp/XF86Config', 'w')
    f.write ("""
Section "Files"
    RgbPath	"/usr/X11R6/lib/X11/rgb"
    FontPath	"/usr/X11R6/lib/X11/fonts/misc/"
    FontPath	"/usr/X11R6/lib/X11/fonts/Type1/"
    FontPath	"/usr/X11R6/lib/X11/fonts/Speedo/"
    FontPath	"/usr/X11R6/lib/X11/fonts/75dpi/"
    FontPath	"/usr/X11R6/lib/X11/fonts/100dpi/"
    FontPath    "/usr/X11R6/lib/X11/fonts/cyrillic/"
    FontPath    "/usr/share/fonts/ISO8859-2/75dpi/"
EndSection

Section "ServerFlags"
EndSection

Section "Keyboard"
    Protocol    "Standard"
    AutoRepeat  500 5
    LeftAlt     Meta
    RightAlt    Meta
    ScrollLock  Compose
    RightCtl    Control
    XkbKeymap       "xfree86(us)"
    XkbKeycodes     "xfree86"
    XkbTypes        "default"
    XkbCompat       "default"
    XkbSymbols      "us(pc101)"
    XkbGeometry     "pc"
    XkbRules        "xfree86"
    XkbModel        "pc101"
    XkbLayout       "us"
EndSection

Section "Pointer"
    Protocol    "%(mouseProto)s"
    Device      "%(mouseDev)s"
    Emulate3Buttons
    Emulate3Timeout    50
EndSection
""" % settings)
    f.write (x.monitorSection ())
    f.write (x.deviceSection ())
    x.modes["32"] = [ "640x480" ]
    x.modes["16"] = [ "640x480" ]
    x.modes["8"] = [ "640x480" ]
    f.write (x.screenSection ())
    f.close ()

    server = os.fork()
    if (not server):
        print "starting", serverPath
	args = [serverPath, ':1', 'vt7', '-s', '1440']
	if serverPath[0:19] == '/usr/X11R6/bin/Xsun':
	    try:
		os.unlink("/dev/mouse")
	    except:
		pass
	    os.symlink(mouseDev, "/dev/mouse")
	    if x.device:
		args.append ("-dev")
		args.append ('/dev/' + x.device)
	else:
	    args.append("-xf86config")
	    args.append("/tmp/XF86Config")
	os.execv(serverPath, args)

    # give time for the server to fail (if it is going to fail...)
    time.sleep (1)
    pid, status = os.waitpid (server, os.WNOHANG)
    if status:
        raise RuntimeError, "X server failed to start"
        
    child = os.fork()
    if (child):
        try:
            pid, status = os.waitpid(child, 0)
        except:
            sys.exit (-1)
        sys.exit((status >> 8) & 0xf)

    return ((mouseProtocol, mouseEmulate, mouseDev), x)