home *** CD-ROM | disk | FTP | other *** search
- import os
- import string
- import kudzu
- import isys
- import sys
- import time
- from xf86config import *
- from kbd import Keyboard
-
- 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
- elif iutil.getArch() == "sparc":
- raise RuntimeError, "Unknown card"
- else:
- print "Unknown card, falling back to VGA16"
- serverPath = '/usr/X11R6/bin/XF86_VGA16'
-
- if not os.access (serverPath, os.X_OK):
- if iutil.getArch() == "sparc":
- raise RuntimeError, "Missing X server"
- print serverPath, "missing. Falling back to VGA16"
- serverPath = '/usr/X11R6/bin/XF86_VGA16'
-
- keycodes = "xfree86"
- symbols = "us(pc101)"
- geometry = "pc"
- rules = "xfree86"
- model = "pc101"
-
- kbd = Keyboard()
- if kbd.type == 'Sun':
- rules = "sun"
- model = kbd.model
- keycodes = "sun(" + kbd.model + ")"
- if model == 'type4':
- geometry = "sun(type4)"
- symbols = "sun/us(sun4)"
- else:
- if model == 'type5':
- geometry = "sun"
- elif model == 'type5_euro':
- geometry = "sun(type5euro)"
- else:
- geometry = "sun(type5unix)"
- symbols = "sun/us(sun5)"
- if kbd.layout == 'en_US':
- symbols = symbols + "+iso9995-3(basic)"
- elif kbd.layout != 'us':
- symbols = symbols + "+" + kbd.layout
-
- mouseEmulateStr="""
- Emulate3Buttons
- Emulate3Timeout 50
- """
- if not mouseEmulate:
- mouseEmulateStr=""
- settings = { "mouseDev" : '/dev/' + mouseDev ,
- "mouseProto" : mouseProtocol,
- "keycodes" : keycodes,
- "symbols" : symbols,
- "geometry" : geometry,
- "rules" : rules,
- "model" : model,
- "emulate" : mouseEmulateStr }
- 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/misc/"
- FontPath "/usr/share/fonts/ISO8859-2/75dpi/"
- FontPath "/usr/share/fonts/ISO8859-2/100dpi/"
- FontPath "/usr/share/fonts/ISO8859-9/misc/"
- FontPath "/usr/share/fonts/ISO8859-9/75dpi/"
- FontPath "/usr/share/fonts/ISO8859-9/100dpi/"
- EndSection
-
- Section "ServerFlags"
- EndSection
-
- Section "Keyboard"
- Protocol "Standard"
- AutoRepeat 500 5
- LeftAlt Meta
- RightAlt Meta
- ScrollLock Compose
- RightCtl Control
- XkbKeycodes "%(keycodes)s"
- XkbTypes "default"
- XkbCompat "default"
- XkbSymbols "%(symbols)s"
- XkbGeometry "%(geometry)s"
- XkbRules "%(rules)s"
- XkbModel "%(model)s"
- XkbLayout "us"
- EndSection
-
- Section "Pointer"
- Protocol "%(mouseProto)s"
- Device "%(mouseDev)s"
- %(emulate)s
- EndSection
- """ % settings)
- f.write (x.monitorSection (1))
- f.write (x.deviceSection ())
- if x.monSect:
- bpp = x.bpp
- else:
- x.modes["32"] = [ ]
- x.modes["16"] = [ ]
- x.modes["8"] = [ "640x480" ]
- bpp = None
- f.write (x.screenSection (1))
- f.close ()
-
- server = os.fork()
- if (not server):
- print "starting", serverPath
- args = [serverPath, ':1', 'vt7', '-s', '1440', '-terminate']
- if serverPath[0:19] == '/usr/X11R6/bin/Xsun':
- try:
- os.unlink("/dev/mouse")
- except:
- pass
- try:
- f = open("/dev/tty5", "w")
- f.write("\n")
- f.close()
- except:
- pass
- os.symlink(mouseDev, "/dev/mouse")
- if x.device:
- args.append ("-dev")
- args.append ('/dev/' + x.device)
- args.append("-fp")
- args.append("/usr/X11R6/lib/X11/fonts/misc/,"
- "/usr/X11R6/lib/X11/fonts/75dpi/,"
- "/usr/X11R6/lib/X11/fonts/100dpi/,"
- "/usr/X11R6/lib/X11/fonts/cyrillic/,"
- "/usr/share/fonts/ISO8859-2/misc/,"
- "/usr/share/fonts/ISO8859-2/75dpi/,"
- "/usr/share/fonts/ISO8859-2/100dpi/")
- else:
- args.append("-xf86config")
- args.append("/tmp/XF86Config")
- if bpp:
- args.append("-bpp")
- args.append(bpp)
- os.execv(serverPath, args)
-
- # give time for the server to fail (if it is going to fail...)
- # FIXME: Should find out if X server is already running
- # otherwise with NFS installs the X server may be still being
- # fetched from the network while we already continue to run
- time.sleep (4)
- 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)
- try:
- sys.kill(server, 15)
- pid, status = os.waitpid(server, 0)
- except:
- sys.exit(0)
-
- sys.exit((status >> 8) & 0xf)
-
- return ((mouseProtocol, mouseEmulate, mouseDev), x)
-
-
-
- #
- # to start X server using existing XF86Config file (reconfig mode use only)
- #
- def start_existing_X():
-
- os.environ['DISPLAY'] = ':1'
-
- server = os.fork()
- serverPath = "/etc/X11/X"
-
- # override fontpath because xfs is not running yet!
- if (not server):
- print "Starting X using existing XF86Config"
- args = [serverPath, ':1', 'vt7', '-s', '1440', '-terminate']
- args.append("-fp")
- args.append("/usr/X11R6/lib/X11/fonts/misc/,"
- "/usr/X11R6/lib/X11/fonts/75dpi/,"
- "/usr/X11R6/lib/X11/fonts/100dpi/,"
- "/usr/X11R6/lib/X11/fonts/cyrillic/,"
- "/usr/share/fonts/ISO8859-2/misc/,"
- "/usr/share/fonts/ISO8859-2/75dpi/,"
- "/usr/share/fonts/ISO8859-2/100dpi/")
-
- print args
- os.execv(serverPath, args)
-
- # give time for the server to fail (if it is going to fail...)
- # FIXME: Should find out if X server is already running
- # otherwise with NFS installs the X server may be still being
- # fetched from the network while we already continue to run
- time.sleep (4)
- pid, status = os.waitpid (server, os.WNOHANG)
- if status:
- raise RuntimeError, "X server failed to start"
-
- # startX() function above does a double-fork here, do we need to in
- # reconfig mode?
-
- return (None, None)
-