("vertical", "Stack all connected outputs vertically at their largest resolution", None),
]
+properties = [
+ "Colorspace",
+ "max bpc",
+ "aspect ratio",
+ "Broadcast RGB",
+ "audio",
+ "non-desktop",
+ "TearFree",
+ "underscan vborder",
+ "underscan hborder",
+ "underscan",
+ "scaling mode",
+]
+
help_text = """
Usage: autorandr [options]
class XrandrOutput(object):
"Represents an XRandR output"
+ XRANDR_PROPERTIES_REGEXP = "|".join(
+ [r"{}:\s*(?P<{}>[\S ]*\S+)"
+ .format(re.sub(r"\s", r"\\\g<0>", p), re.sub(r"\W+", "_", p.lower()))
+ for p in properties])
+
# This regular expression is used to parse an output in `xrandr --verbose'
XRANDR_OUTPUT_REGEXP = """(?x)
^\s*(?P<output>\S[^ ]*)\s+ # Line starts with output name
CRTC:\s*(?P<crtc>[0-9]) | # CRTC value
Transform: (?P<transform>(?:[\-0-9\. ]+\s+){3}) | # Transformation matrix
EDID: (?P<edid>\s*?(?:\\n\\t\\t[0-9a-f]+)+) | # EDID of the output
+ """ + XRANDR_PROPERTIES_REGEXP + """ | # Properties to include in the profile
(?![0-9])[^:\s][^:\n]+:.*(?:\s\\t[\\t ].+)* # Other properties
))+
\s*
"Return the command line parameters for XRandR for this instance"
args = ["--output", self.output]
for option, arg in sorted(self.options_with_defaults.items()):
- args.append("--%s" % option)
+ if option[:5] == "prop-":
+ prop_found = False
+ for prop, xrandr_prop in [(re.sub(r"\W+", "_", p.lower()), p) for p in properties]:
+ if prop == option[5:]:
+ args.append("--set")
+ args.append(xrandr_prop)
+ prop_found = True
+ break
+ if not prop_found:
+ print("Warning: Unknown property `%s' in config file. Skipping." % option[5:], file=sys.stderr)
+ continue
+ else:
+ args.append("--%s" % option)
if arg:
args.append(arg)
return args
options["crtc"] = match["crtc"]
if match["rate"]:
options["rate"] = match["rate"]
+ for prop in [re.sub(r"\W+", "_", p.lower()) for p in properties]:
+ if match[prop]:
+ options["prop-" + prop] = match[prop]
return XrandrOutput(match["output"], edid, options), modes
if not matches or any((name not in config.keys() for name in current_config.keys() if current_config[name].edid)):
continue
if matches:
- closeness = max(match_asterisk(output.edid, current_config[name].edid), match_asterisk(current_config[name].edid, output.edid))
+ closeness = max(match_asterisk(output.edid, current_config[name].edid), match_asterisk(
+ current_config[name].edid, output.edid))
detected_profiles.append((closeness, profile_name))
detected_profiles = [o[1] for o in sorted(detected_profiles, key=lambda x: -x[0])]
return detected_profiles