]> git.donarmstrong.com Git - deb_pkgs/autorandr.git/commitdiff
Merge pull request #145 from theperfidious/master
authorPhillip Berndt <phillip.berndt@googlemail.com>
Sat, 4 May 2019 15:49:19 +0000 (17:49 +0200)
committerGitHub <noreply@github.com>
Sat, 4 May 2019 15:49:19 +0000 (17:49 +0200)
Add crtc value in the config file

README.md
autorandr.py
contrib/bash_completion/autorandr

index 7268f6dbb73bf72d83a6389d8449242f449be1e1..a081ed2f25dd8b939cbbf8b4f475e3a3597cf36c 100644 (file)
--- a/README.md
+++ b/README.md
@@ -212,6 +212,10 @@ profiles matching multiple (or any) monitors.
 
 ## Changelog
 
+**autorandr 1.9 (dev)**
+
+* *2019-03-24* Fix handling of recently disconnected outputs (See #128 and #143)
+
 **autorandr 1.8.1**
 
 * *2019-03-18* Removed mandb call from Makefile
index b18ce7b4d0ad61c456f9e062430a070ea29c0d1b..0c1c942b7392f6bdb7b219ba1eb8342082e038a8 100755 (executable)
@@ -318,7 +318,13 @@ class XrandrOutput(object):
         else:
             edid = "%s-%s" % (XrandrOutput.EDID_UNAVAILABLE, match["output"])
 
-        if not match["connected"] or not match["width"]:
+        # An output can be disconnected but still have a mode configured. This can only happen
+        # as a residual situation after a disconnect, you cannot associate a mode with an disconnected
+        # output.
+        #
+        # This code needs to be careful not to mix the two. An output should only be configured to
+        # "off" if it doesn't have a mode associated with it, which is modelled as "not a width" here.
+        if not match["width"]:
             options["off"] = None
         else:
             if match["mode_name"]:
@@ -327,10 +333,11 @@ class XrandrOutput(object):
                 options["mode"] = "%sx%s" % (match["mode_width"], match["mode_height"])
             else:
                 if match["rotate"] not in ("left", "right"):
-                    options["mode"] = "%sx%s" % (match["width"], match["height"])
+                    options["mode"] = "%sx%s" % (match["width"] or 0, match["height"] or 0)
                 else:
-                    options["mode"] = "%sx%s" % (match["height"], match["width"])
-            options["rotate"] = match["rotate"]
+                    options["mode"] = "%sx%s" % (match["height"] or 0, match["width"] or 0)
+            if match["rotate"]:
+                options["rotate"] = match["rotate"]
             if match["primary"]:
                 options["primary"] = None
             if match["reflect"] == "X":
@@ -575,6 +582,17 @@ def profile_blocked(profile_path, meta_information=None):
     return not exec_scripts(profile_path, "block", meta_information)
 
 
+def check_configuration_pre_save(configuration):
+    "Check that a configuration is safe for saving."
+    outputs = sorted(configuration.keys(), key=lambda x: configuration[x].sort_key)
+    for output in outputs:
+        if "off" not in configuration[output].options and not configuration[output].edid:
+            return ("`%(o)s' is not off (has a mode configured) but is disconnected (does not have an EDID).\n"
+                    "This typically means that it has been recently unplugged and then not properly disabled\n"
+                    "by the user. Please disable it (e.g. using `xrandr --output %(o)s --off`) and then rerun\n"
+                    "this command.") % {"o": output}
+
+
 def output_configuration(configuration, config):
     "Write a configuration file"
     outputs = sorted(configuration.keys(), key=lambda x: configuration[x].sort_key)
@@ -1192,6 +1210,11 @@ def main(argv):
         if options["--save"] in (x[0] for x in virtual_profiles):
             raise AutorandrException("Cannot save current configuration as profile '%s':\n"
                                      "This configuration name is a reserved virtual configuration." % options["--save"])
+        error = check_configuration_pre_save(config)
+        if error:
+            print("Cannot save current configuration as profile '%s':" % options["--save"])
+            print(error)
+            sys.exit(1)
         try:
             profile_folder = os.path.join(profile_path, options["--save"])
             save_configuration(profile_folder, config)
index e7f098c1b4474db3596c2e659fbf74e80b469feb..03beabe9f2f87bdebe2e96f3f8e0bc8519dd24c1 100644 (file)
@@ -29,9 +29,9 @@ _autorandr ()
                AR_DIRS=( "${AR_DIRS[@]}" "${XDG_CONFIG_HOME:-$HOME/.config}/autorandr/" )
        fi
 
-       if [ -n "${AR_DIRS}" ]
+       if [ "${#AR_DIRS[@]}" -gt 0 ]
        then
-               prfls="$(find "${AR_DIRS[@]}" -mindepth 1 -maxdepth 1 -type d ! -name "*.d" -printf '%f\n' | sort -u)"
+               prfls="$(find "${AR_DIRS[@]}" -mindepth 1 -maxdepth 1 -type d ! -name "*.d" -printf '%f\n' 2>/dev/null | sort -u)"
        else
                prfls=""
        fi