Index: /trunk/src/VBox/Main/include/DisplayImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/DisplayImpl.h	(revision 56467)
+++ /trunk/src/VBox/Main/include/DisplayImpl.h	(revision 56468)
@@ -179,4 +179,5 @@
     int i_notifyCroglResize(const PVBVAINFOVIEW pView, const PVBVAINFOSCREEN pScreen, void *pvVRAM);
 
+    int  i_saveVisibleRegion(uint32_t cRect, PRTRECT pRect);
     int  i_handleSetVisibleRegion(uint32_t cRect, PRTRECT pRect);
     int  i_handleQueryVisibleRegion(uint32_t *pcRect, PRTRECT pRect);
@@ -397,4 +398,11 @@
     bool volatile fVGAResizing;
 
+    /** Are we in seamless mode?  Not saved, as we exit seamless on saving. */
+    bool        mfSeamlessEnabled;
+    /** Last set seamless visible region, number of rectangles. */
+    uint32_t    mcRectVisibleRegion;
+    /** Last set seamless visible region, data.  Freed on final clean-up. */
+    PRTRECT     mpRectVisibleRegion;
+
     bool        mfVideoAccelVRDP;
     uint32_t    mfu32SupportedOrders;
Index: /trunk/src/VBox/Main/src-client/DisplayImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/DisplayImpl.cpp	(revision 56467)
+++ /trunk/src/VBox/Main/src-client/DisplayImpl.cpp	(revision 56468)
@@ -109,4 +109,7 @@
     mfu32SupportedOrders = 0;
     mcVideoAccelVRDPRefs = 0;
+
+    mfSeamlessEnabled = false;
+    mpRectVisibleRegion = NULL;
 
 #ifdef VBOX_WITH_CROGL
@@ -157,4 +160,5 @@
 
     videoAccelDestroy(&mVideoAccelLegacy);
+    i_saveVisibleRegion(0, NULL);
 
     if (RTCritSectIsInitialized(&mVideoAccelLock))
@@ -954,4 +958,8 @@
     mParent->i_consoleVRDPServer()->SendResize();
 
+    /* And re-send the seamless rectangles if necessary. */
+    if (mfSeamlessEnabled)
+        i_handleSetVisibleRegion(mcRectVisibleRegion, mpRectVisibleRegion);
+
     LogRelFlowFunc(("[%d]: default format %d\n", uScreenId, pFBInfo->fDefaultFormat));
 
@@ -1125,4 +1133,8 @@
     cxInputMapping      = cx;
     cyInputMapping      = cy;
+
+    /* Re-send the seamless rectangles if necessary. */
+    if (mfSeamlessEnabled)
+        i_handleSetVisibleRegion(mcRectVisibleRegion, mpRectVisibleRegion);
 }
 
@@ -1249,4 +1261,26 @@
 }
 
+int Display::i_saveVisibleRegion(uint32_t cRect, PRTRECT pRect)
+{
+    RTRECT *pRectVisibleRegion = NULL;
+
+    if (pRect == mpRectVisibleRegion)
+        return VINF_SUCCESS;
+    if (cRect != 0)
+    {
+        pRectVisibleRegion = (RTRECT *)RTMemAlloc(cRect * sizeof(RTRECT));
+        if (!pRectVisibleRegion)
+        {
+            return VERR_NO_MEMORY;
+        }
+        memcpy(pRectVisibleRegion, pRect, cRect * sizeof(RTRECT));
+    }
+    if (mpRectVisibleRegion)
+        RTMemFree(mpRectVisibleRegion);
+    mcRectVisibleRegion = cRect;
+    mpRectVisibleRegion = pRectVisibleRegion;
+    return VINF_SUCCESS;
+}
+
 int Display::i_handleSetVisibleRegion(uint32_t cRect, PRTRECT pRect)
 {
@@ -1257,4 +1291,10 @@
         return VERR_NO_TMP_MEMORY;
     }
+    int rc = i_saveVisibleRegion(cRect, pRect);
+    if (RT_FAILURE(rc))
+    {
+        RTMemTmpFree(pVisibleRegion);
+        return rc;
+    }
 
     unsigned uScreenId;
@@ -1269,8 +1309,8 @@
              */
             RTRECT rectFramebuffer;
-            rectFramebuffer.xLeft   = pFBInfo->xOrigin;
-            rectFramebuffer.yTop    = pFBInfo->yOrigin;
-            rectFramebuffer.xRight  = pFBInfo->xOrigin + pFBInfo->w;
-            rectFramebuffer.yBottom = pFBInfo->yOrigin + pFBInfo->h;
+            rectFramebuffer.xLeft   = pFBInfo->xOrigin - xInputMappingOrigin;
+            rectFramebuffer.yTop    = pFBInfo->yOrigin - yInputMappingOrigin;
+            rectFramebuffer.xRight  = rectFramebuffer.xLeft + pFBInfo->w;
+            rectFramebuffer.yBottom = rectFramebuffer.yTop  + pFBInfo->h;
 
             uint32_t cRectVisibleRegion = 0;
@@ -1281,8 +1321,8 @@
                 if (displayIntersectRect(&pVisibleRegion[cRectVisibleRegion], &pRect[i], &rectFramebuffer))
                 {
-                    pVisibleRegion[cRectVisibleRegion].xLeft -= pFBInfo->xOrigin;
-                    pVisibleRegion[cRectVisibleRegion].yTop -= pFBInfo->yOrigin;
-                    pVisibleRegion[cRectVisibleRegion].xRight -= pFBInfo->xOrigin;
-                    pVisibleRegion[cRectVisibleRegion].yBottom -= pFBInfo->yOrigin;
+                    pVisibleRegion[cRectVisibleRegion].xLeft -= rectFramebuffer.xLeft;
+                    pVisibleRegion[cRectVisibleRegion].yTop -= rectFramebuffer.yTop;
+                    pVisibleRegion[cRectVisibleRegion].xRight -= rectFramebuffer.xLeft;
+                    pVisibleRegion[cRectVisibleRegion].yBottom -= rectFramebuffer.yTop;
 
                     cRectVisibleRegion++;
@@ -1313,5 +1353,5 @@
                 pCtl->aParms[0].u.pointer.size = cRect * sizeof(RTRECT);
 
-                int rc = i_crCtlSubmit(&pCtl->Hdr, sizeof(*pCtl), i_displayCrCmdFree, pCtl);
+                rc = i_crCtlSubmit(&pCtl->Hdr, sizeof(*pCtl), i_displayCrCmdFree, pCtl);
                 if (!RT_SUCCESS(rc))
                 {
@@ -1766,4 +1806,5 @@
             pVMMDevPort->pfnRequestSeamlessChange(pVMMDevPort, !!enabled);
     }
+    mfSeamlessEnabled = enabled;
 
 #if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
