(resend) Scroll window fix
Peter Oberndorfer
kumbayo84 at arcor.de
Sat Mar 3 17:53:11 CST 2007
On Tuesday 13 February 2007 14:38, Aric Stewart wrote:
> finds the case where the scrolling amount exceeds the window but still
> falls within the clipping rect. This generates an additional update
> region that needs to be invalidated.
> includes a test
>
Hi,
I think your patch has a problem.
It calls CombineRgn with the deleted Region hrgnClip.
I don't know if it impacts real world applications, but i just saw a warning about a invalid handle
in my debug log.
Maybe moving DeleteObject below the if solves the problem?
I don't know...
@@ -870,6 +870,26 @@ INT WINAPI ScrollWindowEx( HWND hwnd, IN
CombineRgn( hrgnWinupd, hrgnWinupd, hrgnTemp, RGN_OR );
RedrawWindow( hwnd, NULL, hrgnTemp, rdw_flags);
DeleteObject( hrgnClip ); //<<<<<<< deleted here
+
+ /* Catch the case where the scolling amount exceeds the size of the
+ * original window. This generated a second update area that is the
+ * location where the original scrolled content would end up.
+ * This second region is not returned by the ScrollDC and sets
+ * ScrollWindowEx apart from just a ScrollDC.
+ *
+ * This has been verified with testing on windows.
+ */
+ if (abs(dx) > abs(rc.right - rc.left) ||
+ abs(dy) > abs(rc.bottom - rc.top))
+ {
+ DeleteObject( hrgnTemp );
+ hrgnTemp = CreateRectRgn(rc.left + dx, rc.top + dy, rc.right+dx, rc.bottom + dy);
+ CombineRgn( hrgnTemp, hrgnTemp, hrgnClip, RGN_AND ); //<<<<<<< used here
+ CombineRgn( hrgnUpdate, hrgnUpdate, hrgnTemp, RGN_OR );
+
+ if( !bOwnRgn)
+ CombineRgn( hrgnWinupd, hrgnWinupd, hrgnTemp, RGN_OR );
+ }
}
DeleteObject( hrgnTemp );
Greetings Peter
More information about the wine-devel
mailing list