diff --git a/widget/src/mac/nsMacEventHandler.cpp b/widget/src/mac/nsMacEventHandler.cpp index 3430decb5796..8f5b8199d753 100644 --- a/widget/src/mac/nsMacEventHandler.cpp +++ b/widget/src/mac/nsMacEventHandler.cpp @@ -1094,7 +1094,7 @@ PRBool nsMacEventHandler::HandleActivateEvent(EventRecord& aOSEvent) //------------------------------------------------------------------------- PRBool nsMacEventHandler::HandleUpdateEvent(EventRecord& aOSEvent) { - mTopLevelWidget->HandleUpdateEvent(); + mTopLevelWidget->HandleUpdateEvent(nil); return PR_TRUE; } diff --git a/widget/src/mac/nsWindow.cpp b/widget/src/mac/nsWindow.cpp index 3c990981fa07..64206cca075f 100644 --- a/widget/src/mac/nsWindow.cpp +++ b/widget/src/mac/nsWindow.cpp @@ -1057,11 +1057,15 @@ NS_IMETHODIMP nsWindow::Update() static PRBool reentrant = PR_FALSE; if (reentrant) - HandleUpdateEvent(); + HandleUpdateEvent(nil); else { reentrant = PR_TRUE; + StRegionFromPool regionToValidate; + if (!regionToValidate) + return NS_ERROR_OUT_OF_MEMORY; + // make a copy of the window update rgn StRegionFromPool saveUpdateRgn; if (!saveUpdateRgn) @@ -1073,7 +1077,7 @@ NS_IMETHODIMP nsWindow::Update() StPortSetter portSetter(mWindowPtr); ::BeginUpdate(mWindowPtr); - HandleUpdateEvent(); + HandleUpdateEvent(regionToValidate); ::EndUpdate(mWindowPtr); // restore the window update rgn @@ -1082,17 +1086,11 @@ NS_IMETHODIMP nsWindow::Update() // ::CopyRgn(saveUpdateRgn, ((WindowRecord*)mWindowPtr)->updateRgn); ::InvalWindowRgn(mWindowPtr, saveUpdateRgn); #else - ::CopyRgn(saveUpdateRgn, ((WindowRecord*)mWindowPtr)->updateRgn); + ::CopyRgn(saveUpdateRgn, ((WindowRecord*)mWindowPtr)->updateRgn); #endif - // validate the rect of the widget we have just drawn - nsRect bounds = mBounds; - LocalToWindowCoordinate(bounds); - Rect macRect; - nsRectToMacRect(bounds, macRect); - - ::ValidWindowRect(mWindowPtr, &macRect); - + ::ValidWindowRgn(mWindowPtr, regionToValidate); + reentrant = PR_FALSE; } @@ -1219,7 +1217,7 @@ nsWindow :: CountUpdateRect (Rect *inDirtyRect, void* inData) // Must be called between BeginUpdate/EndUpdate: the window visRgn // is expected to be set to whatever needs to be drawn. //------------------------------------------------------------------------- -nsresult nsWindow::HandleUpdateEvent() +nsresult nsWindow::HandleUpdateEvent(RgnHandle regionToValidate) { if (! mVisible) return NS_OK; @@ -1297,6 +1295,10 @@ nsresult nsWindow::HandleUpdateEvent() printf("update took %g microseconds.\n", double(finish - start)); } #endif + + // Copy updateRgn to regionToValidate + if (regionToValidate) + ::CopyRgn(updateRgn, regionToValidate); } return NS_OK; } diff --git a/widget/src/mac/nsWindow.h b/widget/src/mac/nsWindow.h index eda700f8364b..58f00758d3e5 100644 --- a/widget/src/mac/nsWindow.h +++ b/widget/src/mac/nsWindow.h @@ -161,7 +161,7 @@ public: virtual PRBool DispatchWindowEvent(nsGUIEvent& event); virtual PRBool DispatchWindowEvent(nsGUIEvent &event,nsEventStatus &aStatus); - virtual nsresult HandleUpdateEvent(); + virtual nsresult HandleUpdateEvent(RgnHandle regionToValidate); virtual void AcceptFocusOnClick(PRBool aBool) { mAcceptFocusOnClick = aBool;}; PRBool AcceptFocusOnClick() { return mAcceptFocusOnClick;}; void Flash(nsPaintEvent &aEvent);