-# iterator yielding common names of internal connectors
-def commonInternalConnectorNames():
- for prefix in commonInternalConnectorPrefixes:
- for suffix in commonInternalConnectorSuffices:
- yield prefix+suffix
-
-# helper function: execute a process, return output as iterator, throw exception if there was an error
-# you *must* iterate to the end if you use this!
-def processOutputGen(*args):
- with subprocess.Popen(args, stdout=subprocess.PIPE) as p:
- for line in p.stdout:
- yield line.decode("utf-8")
- if p.returncode != 0:
- raise Exception("Error executing "+str(args))
-def processOutputIt(*args):
- return list(processOutputGen(*args)) # list() iterates over the generator
-
-# Run xrandr and return a dict of output names mapped to lists of available resolutions, each being a (width, height) pair.
-# An empty list indicates that the connector is disabled.
-def getXrandrInformation():
- connectors = {} # map of connector names to a list of resolutions
- connector = None # current connector
- for line in processOutputGen("xrandr", "-q"):
- # screen?
- m = re.search(r'^Screen [0-9]+: ', line)
- if m is not None: # ignore this line
- connector = None
- continue
- # new connector?
- m = re.search(r'^([\w\-]+) (dis)?connected ', line)
- if m is not None:
- connector = m.groups()[0]
- assert connector not in connectors
- connectors[connector] = []
- continue
- # new resolution?
- m = re.search(r'^ ([\d]+)x([\d]+) +', line)
- if m is not None:
- assert connector is not None
- connectors[connector].append((int(m.groups()[0]), int(m.groups()[1])))
- continue
- # unknown line
- # not fatal as my xrandr shows strange stuff when a display is enabled, but not connected
- #raise Exception("Unknown line in xrandr output:\n"+line)
- print("Warning: Unknown xrandr line %s" % line)
- return connectors