X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=autorandr.py;h=95867a34f051d4ddaa47cfaffde6ab298696a202;hb=6af575a941cb59bfda019532a11bff7e75a6660b;hp=ba6c5f0fcd708f3842545c793869204576399be9;hpb=75f1533eaba22f258aa29d0d1e259ea10f76ebe4;p=deb_pkgs%2Fautorandr.git diff --git a/autorandr.py b/autorandr.py index ba6c5f0..95867a3 100755 --- a/autorandr.py +++ b/autorandr.py @@ -42,6 +42,11 @@ from distutils.version import LooseVersion as Version from functools import reduce from itertools import chain +if sys.version_info.major == 2: + import ConfigParser as configparser +else: + import configparser + try: input = raw_input except NameError: @@ -49,6 +54,7 @@ except NameError: virtual_profiles = [ # (name, description, callback) + ("off", "Disable all outputs", None), ("common", "Clone all connected outputs at the largest common resolution", None), ("clone-largest", "Clone all connected outputs with the largest resolution (scaled down if necessary)", None), ("horizontal", "Stack all connected outputs horizontally at their largest resolution", None), @@ -762,13 +768,13 @@ def generate_virtual_profile(configuration, modes, profile_name): for output in configuration: configuration[output].options = {} if output in modes and configuration[output].edid: - def key(a, b): + def key(a): score = int(a["width"]) * int(a["height"]) if a["preferred"]: score += 10**6 return score - modes = sorted(modes[output], key=key) - mode = modes[-1] + output_modes = sorted(modes[output], key=key) + mode = output_modes[-1] configuration[output].options["mode"] = mode["name"] configuration[output].options["rate"] = mode["rate"] configuration[output].options["pos"] = pos_specifier % shift @@ -782,13 +788,13 @@ def generate_virtual_profile(configuration, modes, profile_name): for output in configuration: configuration[output].options = {} if output in modes and configuration[output].edid: - def key(a, b): + def key(a): score = int(a["width"]) * int(a["height"]) if a["preferred"]: score += 10**6 return score - modes = sorted(modes[output], key=key) - mode = modes[-1] + output_modes = sorted(modes[output], key=key) + mode = output_modes[-1] configuration[output].options["mode"] = mode["name"] configuration[output].options["rate"] = mode["rate"] configuration[output].options["pos"] = "0x0" @@ -799,6 +805,11 @@ def generate_virtual_profile(configuration, modes, profile_name): configuration[output].options["transform"] = "{},0,{},0,{},{},0,0,1".format(scale, mov_x, scale, mov_y) else: configuration[output].options["off"] = None + elif profile_name == "off": + for output in configuration: + for key in list(configuration[output].options.keys()): + del configuration[output].options[key] + configuration[output].options["off"] = None return configuration @@ -806,18 +817,18 @@ def print_profile_differences(one, another): "Print the differences between two profiles for debugging" if one == another: return - print("| Differences between the two profiles:", file=sys.stderr) + print("| Differences between the two profiles:") for output in set(chain.from_iterable((one.keys(), another.keys()))): if output not in one: if "off" not in another[output].options: - print("| Output `%s' is missing from the active configuration" % output, file=sys.stderr) + print("| Output `%s' is missing from the active configuration" % output) elif output not in another: if "off" not in one[output].options: - print("| Output `%s' is missing from the new configuration" % output, file=sys.stderr) + print("| Output `%s' is missing from the new configuration" % output) else: for line in one[output].verbose_diff(another[output]): - print("| [Output %s] %s" % (output, line), file=sys.stderr) - print("\\-", file=sys.stderr) + print("| [Output %s] %s" % (output, line)) + print("\\-") def exit_help(): @@ -1002,6 +1013,15 @@ def dispatch_call_to_sessions(argv): X11_displays_done.add(display) +def read_config(options, directory): + """Parse a configuration config.ini from directory and merge it into + the options dictionary""" + config = configparser.ConfigParser() + config.read(os.path.join(directory, "settings.ini")) + if config.has_section("config"): + for key, value in config.items("config"): + options.setdefault("--%s" % key, value) + def main(argv): try: opts, args = getopt.getopt(argv[1:], "s:r:l:d:cfh", @@ -1040,6 +1060,7 @@ def main(argv): if os.path.isdir(system_profile_path): profiles.update(load_profiles(system_profile_path)) profile_symlinks.update(get_symlinks(system_profile_path)) + read_config(options, system_profile_path) # For the user's profiles, prefer the legacy ~/.autorandr if it already exists # profile_path is also used later on to store configurations profile_path = os.path.expanduser("~/.autorandr") @@ -1049,6 +1070,7 @@ def main(argv): if os.path.isdir(profile_path): profiles.update(load_profiles(profile_path)) profile_symlinks.update(get_symlinks(profile_path)) + read_config(options, profile_path) # Sort by descending mtime profiles = OrderedDict(sorted(profiles.items(), key=lambda x: -x[1]["config-mtime"])) except Exception as e: @@ -1143,7 +1165,7 @@ def main(argv): for profile_name in profiles.keys(): if profile_blocked(os.path.join(profile_path, profile_name), block_script_metadata): - print("%s (blocked)" % profile_name, file=sys.stderr) + print("%s (blocked)" % profile_name) continue props = [] if profile_name in detected_profiles: @@ -1152,7 +1174,7 @@ def main(argv): load_profile = profile_name if profile_name in current_profiles: props.append("(current)") - print("%s%s%s" % (profile_name, " " if props else "", " ".join(props)), file=sys.stderr) + print("%s%s%s" % (profile_name, " " if props else "", " ".join(props))) if not configs_are_equal and "--debug" in options and profile_name in detected_profiles: print_profile_differences(config, profiles[profile_name]["config"])