// Routine to find out which windows have moved // If copyrect detection isn't perfect then this call returns // the copyrect destination region, to allow the caller to check // for mistakes void vncDesktop::CalcCopyRects(rfb::UpdateTracker &tracker) { HWND foreground = GetForegroundWindow(); RECT foreground_rect; // Actually, we just compare the new and old foreground window & its position if (foreground != m_foreground_window) { m_foreground_window=foreground; // Is the window invisible or can we not get its rect? if (!IsWindowVisible(foreground) || !GetWindowRect(foreground, &foreground_rect)) { m_foreground_window_rect.clear(); } else { m_foreground_window_rect = foreground_rect; } } else { // Same window is in the foreground - let's see if it's moved RECT destrect; rfb::Rect dest; rfb::Point source; // Get the window rectangle if (IsWindowVisible(foreground) && GetWindowRect(foreground, &destrect)) { rfb::Rect old_foreground_window_rect = m_foreground_window_rect; source = m_foreground_window_rect.tl; m_foreground_window_rect = dest = destrect; if (!dest.is_empty() && !old_foreground_window_rect.is_empty()) { // Got the destination position. Now send to clients! if (!source.equals(dest.tl)) { rfb::Point delta = rfb::Point(dest.tl.x-source.x, dest.tl.y-source.y); // Clip the destination rectangle dest = dest.intersect(m_bmrect); if (dest.is_empty()) return; // Clip the source rectangle dest = dest.translate(delta.negate()).intersect(m_bmrect); dest = dest.translate(delta); if (!dest.is_empty()) { // Tell the buffer about the copyrect m_buffer.CopyRect(dest, delta); // Notify all clients of the copyrect tracker.add_copied(dest, delta); } } } } else { m_foreground_window_rect.clear(); } } }
//////////////////////////////////////////////////////////////////////////////////// // Modif rdv@2002 - v1.1.x - videodriver void vncDesktopThread::copy_bitmaps_to_buffer(ULONG i,rfb::Region2D &rgncache,rfb::UpdateTracker &tracker) { rfb::Rect rect; int x = m_desktop->pchanges_buf->pointrect[i].rect.left; int w = m_desktop->pchanges_buf->pointrect[i].rect.right-m_desktop->pchanges_buf->pointrect[i].rect.left; int y = m_desktop->pchanges_buf->pointrect[i].rect.top; int h = m_desktop->pchanges_buf->pointrect[i].rect.bottom-m_desktop->pchanges_buf->pointrect[i].rect.top; //vnclog.Print(LL_INTINFO, VNCLOG("Driver ************* %i %i %i %i \n"),x,y,w,h); if (!ClipRect(&x, &y, &w, &h, m_desktop->m_bmrect.tl.x, m_desktop->m_bmrect.tl.y, m_desktop->m_bmrect.br.x-m_desktop->m_bmrect.tl.x, m_desktop->m_bmrect.br.y-m_desktop->m_bmrect.tl.y)) return; //vnclog.Print(LL_INTINFO, VNCLOG("Driver ************* %i %i %i %i \n"),x,y,w,h); rect.tl.x = x; rect.br.x = x+w; rect.tl.y = y; rect.br.y = y+h; switch(m_desktop->pchanges_buf->pointrect[i].type) { case SCREEN_SCREEN: { int dx=m_desktop->pchanges_buf->pointrect[i].point.x; int dy=m_desktop->pchanges_buf->pointrect[i].point.y; if (!m_screen_moved && (dx==0 || dy==0) ) { //// Fix in case !Cliprect int xx=x; int yy=y; int hh=h; int ww=w; if (ClipRect(&xx,&yy,&ww,&hh,m_desktop->m_bmrect.tl.x, m_desktop->m_bmrect.tl.y, m_desktop->m_bmrect.br.x-m_desktop->m_bmrect.tl.x, m_desktop->m_bmrect.br.y-m_desktop->m_bmrect.tl.y)) { rect.tl.x=xx; rect.tl.y=yy; rect.br.x=xx+ww; rect.br.y=yy+hh; rgncache.assign_union(rect); } ////////////////////// // Fix Eckerd x=x+dx;; y=y+dy;; if (!ClipRect(&x,&y,&w,&h,m_desktop->m_bmrect.tl.x, m_desktop->m_bmrect.tl.y, m_desktop->m_bmrect.br.x-m_desktop->m_bmrect.tl.x, m_desktop->m_bmrect.br.y-m_desktop->m_bmrect.tl.y)) return; ////////////////////// // Fix Eckerd rect.tl.x=x-dx; rect.tl.y=y-dy; rect.br.x=x+w-dx; rect.br.y=y+h-dy; rfb::Point delta = rfb::Point(-dx,-dy); rgncache.assign_union(rect); tracker.add_copied(rect, delta); // vnclog.Print(LL_INTINFO, VNCLOG("Copyrect \n")); } else { rgncache.assign_union(rect); } break; } case SOLIDFILL: case TEXTOUT: case BLEND: case TRANS: case PLG: case BLIT:; rgncache.assign_union(rect); break; default: break; } }