Due to implemtation details on the host side, switching to a multihead
fullscreen mode means multiple mode changes along the way. However,
because rrSetScreenConfig returns before the mode change completes,
we can enter a race, where a subsequent SetDisplayTopology overrides
the current pending one, leading to a mode switch where the resolution
and topology are no longer consistent.
So, we fix this by ignoring any attempts to set the pending topology if
one is already pending.
* VMwareCtrlDoSetTopology --
*
* Set the custom topology and set a dynamic mode to the bounding box
- * of the passed topology.
+ * of the passed topology. If a topology is already pending, then do
+ * nothing but do not return failure.
*
* Results:
* TRUE on success, FALSE otherwise.
short maxY = 0;
size_t i;
+ if (pVMWARE->xineramaNextState) {
+ VmwareLog(("DoSetTopology: Aborting due to existing pending state\n"));
+ return TRUE;
+ }
+
for (i = 0; i < number; i++) {
maxX = MAX(maxX, extents[i].x_org + extents[i].width);
maxY = MAX(maxY, extents[i].y_org + extents[i].height);