X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=autorandr.py;h=ec159bf6a0b5fc4a85b855f58cfba04b4a371f38;hb=6b814e115768437778816483dd239774dddb14ee;hp=24d8b3a9df0674291c91ac88756975fc08223315;hpb=01f69939e06274ffb725dd367013769c7585cfc0;p=deb_pkgs%2Fautorandr.git diff --git a/autorandr.py b/autorandr.py index 24d8b3a..ec159bf 100755 --- a/autorandr.py +++ b/autorandr.py @@ -68,6 +68,20 @@ virtual_profiles = [ ("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] @@ -157,6 +171,11 @@ class AutorandrException(Exception): 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\S[^ ]*)\s+ # Line starts with output name @@ -183,6 +202,7 @@ class XrandrOutput(object): CRTC:\s*(?P[0-9]) | # CRTC value Transform: (?P(?:[\-0-9\. ]+\s+){3}) | # Transformation matrix EDID: (?P\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* @@ -245,7 +265,19 @@ class XrandrOutput(object): "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 @@ -394,6 +426,9 @@ class XrandrOutput(object): 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 @@ -645,7 +680,8 @@ def find_profiles(current_config, profiles): 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