)
\s*
(?P<primary>primary\ )? # Might be primary screen
- (?:\s* # The remainder of the first line only appears as one or not at all:
+ (?:\s*
(?P<width>[0-9]+)x(?P<height>[0-9]+) # Resolution (might be overridden below!)
- \+(?P<x>[0-9]+)\+(?P<y>[0-9]+)\s+ # Position
+ \+(?P<x>-?[0-9]+)\+(?P<y>-?[0-9]+)\s+ # Position
(?:\(0x[0-9a-fA-F]+\)\s+)? # XID
(?P<rotate>(?:normal|left|right|inverted))\s+ # Rotation
(?:(?P<reflect>X\ and\ Y|X|Y)\ axis)? # Reflection
)? # .. but everything of the above only if the screen is in use.
- (?:[\ \t]*\(.+)?
+ (?:[\ \t]*\([^\)]+\))(?:\s*[0-9]+mm\sx\s[0-9]+mm)?
+ (?:[\ \t]*panning\ (?P<panning>[0-9]+x[0-9]+\+[0-9]+\+[0-9]+))? # Panning information
+ (?:[\ \t]*tracking\ (?P<tracking>[0-9]+x[0-9]+\+[0-9]+\+[0-9]+))? # Tracking information
+ (?:[\ \t]*border\ (?P<border>(?:[0-9]+/){3}[0-9]+))? # Border information
(?:\s*(?: # Properties of the output
Gamma: (?P<gamma>[0-9\.: ]+) | # Gamma value
Transform: (?P<transform>(?:[\-0-9\. ]+\s+){3}) | # Transformation matrix
))+
\s*
(?P<modes>(?:
- (?P<mode_width>[0-9]+)x(?P<mode_height>[0-9]+).+?\*current.+\s+
+ (?P<mode_width>[0-9]+)x(?P<mode_height>[0-9]+).+?\*current.*\s+
h:.+\s+v:.+clock\s+(?P<rate>[0-9\.]+)Hz\s* | # Interesting (current) resolution: Extract rate
- [0-9]+x[0-9]+.+\s+h:.+\s+v:.+\s* # Other resolutions
+ [0-9]+x[0-9]+(?:(?!\*current).)+\s+h:.+\s+v:.+\s* # Other resolutions
)*)
"""
XRANDR_13_DEFAULTS = {
"transform": "1,0,0,0,1,0,0,0,1",
+ "panning": "0x0",
}
XRANDR_12_DEFAULTS = {
elif match["reflect"] == "X and Y":
options["reflect"] = "xy"
options["pos"] = "%sx%s" % (match["x"], match["y"])
+ if match["panning"]:
+ panning = [ match["panning"] ]
+ if match["tracking"]:
+ panning += [ "/", match["tracking"] ]
+ if match["border"]:
+ panning += [ "/", match["border"] ]
+ options["panning"] = "".join(panning)
if match["transform"]:
transformation = ",".join(match["transform"].strip().split())
if transformation != "1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000":