--- orig/displayconfigabstraction.py 2008-01-06 22:15:23.000000000 +0100 +++ 1/displayconfigabstraction.py 2008-01-06 22:16:09.000000000 +0100 @@ -9,6 +9,7 @@ import xorgconfig import ScanPCI import csv +import re from execwithcapture import * """Classes for dealing with X.org configuration in a sane way. @@ -2513,17 +2514,7 @@ self.vendordb = {} self.driverdb = {} - self.drivers = ["ati", "glint", "vga", "fbdev"] - #FIXME - #if arch() .startswith("sparc"): - # self.drivers.extend(["sunbw2", "suncg14", "suncg3", "suncg6", "sunffb", "sunleo", "suntcx"]) - #else: - self.drivers.extend(["apm", "ark", "chips", "cirrus", "cyrix", "glide", - "i128", "i740", "i810", "intel", "imstt", "mga", - "neomagic", "newport", "nsc", "nv", "rendition", - "r128", "radeon", "vesa", "s3", "s3virge", - "savage", "siliconmotion", "sis", "tdfx", "tga", - "trident", "tseng", "vmware"]) + self.drivers = self._getAvailableDrivers() self.proprietary_drivers = [] @@ -2540,6 +2531,82 @@ def getAllGfxCardModelNames(self): return self.db.keys() + def _getDriverDirs(self): + "Returns a list of directories where X driver files may be located" + + # Fallback dir: + defaultDirs = ["/usr/lib/xorg/modules/drivers/"] + + # Get display number: + display_number = 0 + if "DISPLAY" in os.environ: + display_name = os.environ["DISPLAY"] + displayRE = re.compile("^.*:(\d+)\.\d+$") + m = displayRE.match(display_name) + if m: + display_number = int(m.group(1)) + else: + print "failed to parse display number from '%s' - falling back to default (%d)" % (display_name, display_number) + else: + print "$DISPLAY not set - falling back to default number (%d)" % display_number + + # Get the list of module paths from the Xorg log file: + XLogfile = "/var/log/Xorg.%d.log" % display_number + cmd = "awk -F \" ModulePath set to \" '/^\(..\) ModulePath set to (.*)/ {print $2}' %s" % XLogfile + + baseList = os.popen(cmd).readline().strip().strip('"') + if baseList == "": + print "warning: failed to get module paths from '%s' - falling back to default" % XLogfile + return defaultDirs + + pathList = [] + for basePath in baseList.split(","): + pathList.append("%s/drivers/" % basePath) + + return pathList + + def _getAvailableDrivers(self): + """ + Returns the list of available X graphics drivers. + Algorithm taken from Xorg source (see GenerateDriverlist() in xf86Config.C). + """ + + # These are drivers that cannot actually be used in xorg.conf, hence they are hidden: + hiddenDrivers = ( + "atimisc", # seems to be just the internal implementation for ati driver + "dummy", # dummy driver without any output + "v4l", # not an actual video device driver, but just the v4l module + "ztv" # seems to be the TV output module for AMD Geode + ) + + drivers = [] + driverDirectories = self._getDriverDirs() + + driverNameRE = re.compile("^(.+)_drv.(s)?o$") + for ddir in driverDirectories: + try: + driverFiles = os.listdir(ddir) + except OSError: + print "error reading directory '%s'" % ddir + continue + for f in driverFiles: + m = driverNameRE.match(f) + if m: + driverName = m.group(1) + if driverName in drivers: + print "ignoring duplicate driver '%s/%s'" % (ddir, f) + else: + if driverName in hiddenDrivers: + #print "ignoring hidden driver '%s'" % driverName + pass + else: + drivers.append(driverName) + else: + #print "ignoring driver file with invalid name '%s'" % f + pass + #print "found %d drivers" % len(drivers) + return drivers + def _checkProprietaryDrivers(self): # Check for the NVidia driver. # FIXME x86_64 => 'lib64'