All right.... some final reading on that link found me this gem:
from RRSetCrtcConfig:
This request sets the CRTC to the specified position, mode, rotation
and reflection. The entire area of the CRTC must fit within the
screen size, else a Match error results. As an example, rotating the
screen so that a single CRTC fills the entire screen before and
after may necessitate disabling the CRTC, resizing the screen,
then re-enabling the CRTC at the new configuration to avoid an
invalid intermediate configuration.
So the proper behaviour seems to be what xrandr already does:
1. Disable any active outputs whose screen-size won't match the new size
2. Call RRSetScreenSize
3. Call RRSetCrtcConfig for all outputs to be configured.
So my patch is already a "proper" solution, except that it needs to disable any outputs that "are active and won't fit" on the new size, rather than blindly disabling all of the "changed" outputs... but I am too exhausted to work on this right now.
All right.... some final reading on that link found me this gem:
from RRSetCrtcConfig:
This request sets the CRTC to the specified position, mode, rotation
and reflection. The entire area of the CRTC must fit within the
screen size, else a Match error results. As an example, rotating the
screen so that a single CRTC fills the entire screen before and
after may necessitate disabling the CRTC, resizing the screen,
then re-enabling the CRTC at the new configuration to avoid an
invalid intermediate configuration.
So the proper behaviour seems to be what xrandr already does:
1. Disable any active outputs whose screen-size won't match the new size
2. Call RRSetScreenSize
3. Call RRSetCrtcConfig for all outputs to be configured.
So my patch is already a "proper" solution, except that it needs to disable any outputs that "are active and won't fit" on the new size, rather than blindly disabling all of the "changed" outputs... but I am too exhausted to work on this right now.