Index: /trunk/src/VBox/Additions/x11/vboxvideo/vboxutils.c
===================================================================
--- /trunk/src/VBox/Additions/x11/vboxvideo/vboxutils.c	(revision 35047)
+++ /trunk/src/VBox/Additions/x11/vboxvideo/vboxutils.c	(revision 35048)
@@ -215,8 +215,6 @@
                 || aRects[i].y2 <   pVBox->aScreenLocation[j].y)
                 continue;
-            cmdHdr.x =   (int16_t)aRects[i].x1
-                       - pVBox->aScreenLocation[0].x;
-            cmdHdr.y =   (int16_t)aRects[i].y1
-                       - pVBox->aScreenLocation[0].y;
+            cmdHdr.x = (int16_t)aRects[i].x1;
+            cmdHdr.y = (int16_t)aRects[i].y1;
             cmdHdr.w = (uint16_t)(aRects[i].x2 - aRects[i].x1);
             cmdHdr.h = (uint16_t)(aRects[i].y2 - aRects[i].y1);
Index: /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.c
===================================================================
--- /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.c	(revision 35047)
+++ /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.c	(revision 35048)
@@ -1341,7 +1341,8 @@
     Bool rc = TRUE;
     Bool fPrimaryMoved = FALSE;
-    uint32_t cPrimary, cIndex;
+    uint32_t cIndex;
     uint32_t cwReal, chReal;
-    int32_t cxRel, cyRel, cxReal, cyReal, cxOld, cyOld;
+    uint32_t offStart, offStartReal;
+    int32_t cxReal, cyReal, cxOld, cyOld;
 
     TRACE_LOG("cDisplay=%u, cWidth=%u, cHeight=%u, x=%d, y=%d, displayWidth=%d\n",
@@ -1353,22 +1354,23 @@
     pVBox->aScreenLocation[cDisplay].x = x;
     pVBox->aScreenLocation[cDisplay].y = y;
-    cPrimary = vboxGetPrimaryIndex(pScrn);
     cIndex = vboxGetRealLocationIndex(pScrn, cDisplay);
-    if (cDisplay == cPrimary && (x != cxOld || y != cyOld))
-        fPrimaryMoved = TRUE;
     cwReal = pVBox->aScreenLocation[cIndex].cx;
     chReal = pVBox->aScreenLocation[cIndex].cy;
     cxReal = pVBox->aScreenLocation[cIndex].x;
     cyReal = pVBox->aScreenLocation[cIndex].y;
-    cxRel = cxReal - pVBox->aScreenLocation[cPrimary].x;
-    cyRel = cyReal - pVBox->aScreenLocation[cPrimary].y;
+    offStart = cyReal * pVBox->cbLine + cxReal * vboxBPP(pScrn) / 8;
+    /* Silently fail if the mode - specifically the virtual width - is too
+     * large for VRAM as we sometimes have to do this - see comments in
+     * VBOXPreInit. */
+    if (offStart + pVBox->cbLine * chReal > pVBox->cbFramebuffer)
+        return TRUE;
     /* Don't fiddle with the hardware if we are switched
      * to a virtual terminal. */
     if (!pVBox->vtSwitch)
     {
-        TRACE_LOG("setting mode.  cWidth=%u, cHeight=%u, cwReal=%u, chReal=%u, pScrn->virtualX=%d, pScrn->virtualY=%d, vboxBPP(pScrn)=%d, x=%d, y=%d, cDisplay=%u, cPrimary=%u, cIndex=%u, cxRel=%d, cyRel=%d, cxReal=%d, cyReal=%d, pVBox->cbLine=%d\n",
+        TRACE_LOG("setting mode.  cWidth=%u, cHeight=%u, cwReal=%u, chReal=%u, pScrn->virtualX=%d, pScrn->virtualY=%d, vboxBPP(pScrn)=%d, x=%d, y=%d, cDisplay=%u, cIndex=%u, cxReal=%d, cyReal=%d, pVBox->cbLine=%d\n",
                   cWidth, cHeight, cwReal, chReal, pScrn->virtualX,
-                  pScrn->virtualY, vboxBPP(pScrn), x, y, cDisplay, cPrimary,
-                  cIndex, cxRel, cyRel, cxReal, cyReal, pVBox->cbLine);
+                  pScrn->virtualY, vboxBPP(pScrn), x, y, cDisplay,
+                  cIndex, cxReal, cyReal, pVBox->cbLine);
         if (cDisplay == 0)
             VBoxVideoSetModeRegisters(cwReal, chReal, pScrn->displayWidth,
@@ -1381,22 +1383,7 @@
         && (pVBox->fHaveHGSMI)
         && !pVBox->vtSwitch)
-        VBoxHGSMIProcessDisplayInfo(&pVBox->guestCtx, cDisplay, cxRel, cyRel,
-                                      cyReal * pVBox->cbLine
-                                    + cxReal * vboxBPP(pScrn) / 8,
-                                    pVBox->cbLine,
-                                    cwReal, chReal, vboxBPP(pScrn));
-    /* The guest-host protocol says that first screen is always at offset
-     * (0,0).  Ergo, if the guest changes that offset we need to move all
-     * other screens in the host to keep the relative positions right. */
-    if (fPrimaryMoved)
-    {
-        unsigned i;
-        for (i = 1; i < pVBox->cScreens; ++i)
-            if (i != cPrimary)
-                VBOXSetMode(pScrn, i, pVBox->aScreenLocation[i].cx,
-                            pVBox->aScreenLocation[i].cy,
-                            pVBox->aScreenLocation[i].x,
-                            pVBox->aScreenLocation[i].y);
-    }
+        VBoxHGSMIProcessDisplayInfo(&pVBox->guestCtx, cDisplay, cxReal, cyReal,
+                                    offStart, pVBox->cbLine, cwReal, chReal,
+                                    vboxBPP(pScrn));
     TRACE_LOG("returning %s\n", rc ? "TRUE" : "FALSE");
     return rc;
