-# 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
-
-# convert a (width, height) pair into a string accepted by xrandr as argument for --mode
-def res2xrandr(res):
- (w, h) = res
- return str(w)+'x'+str(h)
-
-# convert a (width, height) pair into a string to be displayed to the user
-def res2user(res):
- (w, h) = res
- # get ratio
- ratio = int(round(16.0*h/w))
- if ratio == 12: # 16:12 = 4:3
- strRatio = '4:3'
- elif ratio == 13: # 16:12.8 = 5:4
- strRatio = '5:4'
- else: # let's just hope this will never be 14 or more...
- strRatio = '16:%d' % ratio
- return '%dx%d (%s)' %(w, h, strRatio)