+ 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:
+ argv = base_argv + list(chain.from_iterable(auxiliary_changes_pre))
+ if call_and_retry(argv) != 0:
+ raise AutorandrException("Command failed: %s" % " ".join(argv))
+
+ # Disable unused outputs, but make sure that there always is at least one active screen
+ disable_keep = 0 if remain_active_count else 1
+ if len(disable_outputs) > disable_keep:
+ if call_and_retry(base_argv + list(chain.from_iterable(disable_outputs[:-1] if disable_keep else disable_outputs))) != 0:
+ # Disabling the outputs failed. Retry with the next command:
+ # Sometimes disabling of outputs fails due to an invalid RRSetScreenSize.
+ # This does not occur if simultaneously the primary screen is reset.
+ pass
+ else:
+ disable_outputs = disable_outputs[-1:] if disable_keep else []
+
+ # If disable_outputs still has more than one output in it, one of the xrandr-calls below would
+ # disable the last two screens. This is a problem, so if this would happen, instead disable only
+ # one screen in the first call below.
+ if len(disable_outputs) > 0 and len(disable_outputs) % 2 == 0:
+ # In the context of a xrandr call that changes the display state, `--query' should do nothing
+ disable_outputs.insert(0, ['--query'])
+
+ # Enable the remaining outputs in pairs of two operations
+ operations = disable_outputs + enable_outputs
+ for index in range(0, len(operations), 2):
+ argv = base_argv + list(chain.from_iterable(operations[index:index+2]))
+ if call_and_retry(argv) != 0:
+ raise AutorandrException("Command failed: %s" % " ".join(argv))
+
+def is_equal_configuration(source_configuration, target_configuration):
+ "Check if all outputs from target are already configured correctly in source"
+ for output in target_configuration.keys():
+ if (output not in source_configuration) or (source_configuration[output] != target_configuration[output]):