X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=autorandr.py;h=c2fdb9ad08f300a259a8832fe30cd55bde62ce71;hb=96231a60c0771d39b994d2d54f5b528aba0e7802;hp=adeaa6099ecd2917b6f437fc3f0987502b01e8f1;hpb=0243a5bb29217d0a9fb3dbe510ea9a00c9a13a49;p=deb_pkgs%2Fautorandr.git diff --git a/autorandr.py b/autorandr.py index adeaa60..c2fdb9a 100755 --- a/autorandr.py +++ b/autorandr.py @@ -23,22 +23,21 @@ # from __future__ import print_function -import copy -import getopt import binascii +import copy +import getopt import hashlib import os +import posix import re import subprocess import sys -from distutils.version import LooseVersion as Version +from collections import OrderedDict +from distutils.version import LooseVersion as Version from functools import reduce from itertools import chain -from collections import OrderedDict - -import posix virtual_profiles = [ @@ -544,6 +543,8 @@ def apply_configuration(new_configuration, current_configuration, dry_run=False) # the xrandr call fails with an invalid RRSetScreenSize parameter error. # Update the configuration in 3 passes in that case. (On Haswell graphics, # at least.) + # - Some implementations can not handle --transform at all, so avoid it unless + # necessary. (See https://github.com/phillipberndt/autorandr/issues/37) auxiliary_changes_pre = [] disable_outputs = [] @@ -555,9 +556,20 @@ def apply_configuration(new_configuration, current_configuration, dry_run=False) else: if "off" not in current_configuration[output].options: remain_active_count += 1 - enable_outputs.append(new_configuration[output].option_vector) - if xrandr_version() >= Version("1.3.0") and "transform" in current_configuration[output].options: - auxiliary_changes_pre.append(["--output", output, "--transform", "none"]) + + option_vector = new_configuration[output].option_vector + if xrandr_version() >= Version("1.3.0"): + if "transform" in current_configuration[output].options: + auxiliary_changes_pre.append(["--output", output, "--transform", "none"]) + else: + try: + transform_index = option_vector.index("--transform") + if option_vector[transform_index+1] == XrandrOutput.XRANDR_DEFAULTS["transform"]: + option_vector = option_vector[:transform_index] + option_vector[transform_index+2:] + except ValueError: + pass + + enable_outputs.append(option_vector) # Perform pe-change auxiliary changes if auxiliary_changes_pre: @@ -613,13 +625,13 @@ def generate_virtual_profile(configuration, modes, profile_name): "Generate one of the virtual profiles" configuration = copy.deepcopy(configuration) if profile_name == "common": - common_resolution = [ set(( ( mode["width"], mode["height"] ) for mode in output )) for output in modes.values() ] + common_resolution = [ set(( ( mode["width"], mode["height"] ) for mode in output_modes )) for output, output_modes in modes.items() if configuration[output].edid ] common_resolution = reduce(lambda a, b: a & b, common_resolution[1:], common_resolution[0]) common_resolution = sorted(common_resolution, key=lambda a: int(a[0])*int(a[1])) if common_resolution: for output in configuration: configuration[output].options = {} - if output in modes: + if output in modes and configuration[output].edid: configuration[output].options["mode"] = [ x["name"] for x in sorted(modes[output], key=lambda x: 0 if x["preferred"] else 1) if x["width"] == common_resolution[-1][0] and x["height"] == common_resolution[-1][1] ][0] configuration[output].options["pos"] = "0x0" else: @@ -635,7 +647,7 @@ def generate_virtual_profile(configuration, modes, profile_name): for output in configuration: configuration[output].options = {} - if output in modes: + if output in modes and configuration[output].edid: mode = sorted(modes[output], key=lambda a: int(a["width"])*int(a["height"]) + (10**6 if a["preferred"] else 0))[-1] configuration[output].options["mode"] = mode["name"] configuration[output].options["rate"] = mode["rate"] @@ -799,6 +811,12 @@ def main(argv): except Exception as e: raise AutorandrException("Failed to apply profile '%s'" % load_profile, e, True) + if "--dry-run" not in options and "--debug" in options: + new_config, _ = parse_xrandr_output() + if not is_equal_configuration(new_config, load_config): + print("The configuration change did not go as expected:") + print_profile_differences(new_config, load_config) + sys.exit(0) if __name__ == '__main__':