Rein Klazes wijn@wanadoo.nl writes:
if(( size = GetRegionData( SrcRgn, 0, NULL )) &&
(rdata = HeapAlloc( GetProcessHeap(), 0, size ))) {
GetRegionData( SrcRgn, size, rdata );
/* the rectangles in the region data are ordered top-to-bottom
* So if the scrolling is downward, traverse the array backwards
* to avoid touching pixels that have yet to be scrolled */
/* FIXME: implement something similar for left-to-right
* scrolling. */
if( dydev < 0 ) {
step = 1;
rect = (RECT *)rdata->Buffer;
} else {
step = -1;
rect = ((RECT *)rdata->Buffer) + rdata->rdh.nCount - 1;
}
for( i = 0; i < rdata->rdh.nCount; i++, rect += step) {
DPtoLP(hdc, (LPPOINT)rect, 2);
TRACE("Bit blitting %s to %ld,%ld\n", wine_dbgstr_rect(rect),
rect->left + dx, rect->top + dy);
BitBlt( hdc, rect->left + dx, rect->top + dy,
rect->right - rect->left, rect->bottom -rect->top,
hdc, rect->left, rect->top, SRCCOPY);
}
You really shouldn't need to scroll the region rectangle by rectangle. Selecting the proper clip region and then copying the whole area should have the same effect.
{ XEvent event;
XWindowEvent( gdi_display, physDev->drawable, ~0, &event );
if (event.type == NoExpose) break;
if( !XCheckWindowEvent( gdi_display, physDev->drawable, ~0, &event ))
break;
if (event.type == NoExpose) continue;
You can't use XCheckWindowEvent, you need to wait for the events that haven't arrived yet.