windowing/windowserver/nga/SERVER/openwfc/walkwindowtree.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/openwfc/walkwindowtree.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,707 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "walkwindowtree.h"
+#include "cliwin.h"
+#include "rootwin.h"
+#include "ANIM.H"
+#include "tcursor.h"
+#include "pointer.h"
+
+TWalkWindowTreeFocusChanged::TWalkWindowTreeFocusChanged(TBool aNewFocusState) :
+	iNewFocusState(aNewFocusState)
+	{
+	}
+
+TBool TWalkWindowTreeFocusChanged::DoIt(CWsWindow *aWin)
+//
+// Walk all windows that have had their focus state changed
+//
+	{
+	aWin->FocusChanged(iNewFocusState);
+	return(EFalse);
+	}
+
+TResumableWalkWindowTreeFindInvalid::TResumableWalkWindowTreeFindInvalid(CWsWindowRedraw** aResult) :
+	iResult(aResult)
+	{
+	}
+
+TBool TResumableWalkWindowTreeFindInvalid::DoIt(CWsWindow* aWin)
+//
+// Find a window with an invalid area
+//
+	{
+	WS_ASSERT_DEBUG(aWin->WinType()==EWinTypeClient, EWsPanicWindowType);
+	CWsWindowRedraw *redraw=((CWsClientWindow *)aWin)->Redraw();
+	if (redraw->NeedsRedraw()>0)
+		{
+		*iResult=redraw;
+		return(ETrue);
+		}
+	return(EFalse);
+	}
+
+TWalkWindowTreeDisconnect::TWalkWindowTreeDisconnect(RWsTextCursor *aCursor) :
+	iTextCursor(aCursor)
+	{}
+
+TBool TWalkWindowTreeDisconnect::DoIt(CWsWindow *aWin)
+//
+// Disconnect a window
+//
+	{
+	if (aWin->WinType()==EWinTypeClient)
+		{
+		CWsClientWindow *win=(CWsClientWindow *)aWin;
+		win->iRedraw->WindowClosing();
+		/* XXX jonas: the defect fix for PDEF114190 moved deactivation of sprites from CWsWindow::Shutdown() to here. Check that DeactivateAllSprites() is equivalent to SpriteManager::DeactivateSprites().
+		win->SpriteManager()->DeactivateSprites(win);
+		*/
+		win->DeactivateAllSprites();
+
+		if (iTextCursor)
+			iTextCursor->WindowDisconnected(win);
+		CWsAnim::WindowClosing(win->iAnimList);	// Destroy any animated objects attached to this window
+		TWsPointer::WindowDisconnected(aWin);
+
+		win->iParent=NULL;
+		win->iSibling=NULL;
+		win->iChild=NULL;
+		win->iFlags&=~EFlagActive;
+		win->ResetHiddenFlag();
+		}
+	return(EFalse);
+	}
+	
+TWalkWindowTreeRegionBase::TWalkWindowTreeRegionBase(RWsRegion *aRegion, TTranslucentBehaviour aTranslucentBehaviour) :
+	iTranslucentBehaviour(aTranslucentBehaviour), iRegion(aRegion), iSubRegion(NULL)
+	{}
+
+TBool TWalkWindowTreeRegionBase::DoIt(CWsWindow *aWin)
+	{
+	if (aWin->IsVisible())
+		{
+		DoIt2(aWin);
+		if (aWin->WinType()!=EWinTypeRoot)
+			{
+			STACK_REGION tmp;
+			switch(iTranslucentBehaviour)
+				{
+				case EDontWalkTranslucent:
+					static_cast<CWsClientWindow *>(aWin)->GetClippedBaseArea(tmp);
+					iRegion->SubRegion(tmp,iSubRegion);
+					break;
+				case EWalkTranslucent:
+					static_cast<CWsClientWindow *>(aWin)->GetClippedBaseArea(*iSubRegion);
+					iSubRegion->Intersect(*iRegion);
+					if (iSubRegion->Count() > 0)
+						{
+						static_cast<CWsClientWindow *>(aWin)->GetOpaqueClippedBaseArea(tmp);
+						iRegion->SubRegion(tmp);
+						}
+					break;
+				}
+			tmp.Close();
+			}
+		else if(iSubRegion)
+			{
+			iSubRegion->Copy(*iRegion);
+			}
+		if (iSubRegion && (iSubRegion->Count()>0 || iSubRegion->CheckError()))
+			{
+			if (DoIt3(aWin))
+				return ETrue;
+			iSubRegion->Clear();
+			}
+		}
+	return(iRegion->IsEmpty());
+	}
+TBool TWalkWindowTreeRegionBase::DoIt3(CWsWindow*)
+	{return EFalse;}
+
+TWalkWindowTreeSchedule::TWalkWindowTreeSchedule() :
+	TWalkWindowTreeBase(),
+	iHead(0)
+	{
+	}
+
+CWsWindow * TWalkWindowTreeSchedule::HeadWindow() const
+	{
+	return iHead;
+	}
+
+TWalkWindowListSchedule::TWalkWindowListSchedule(CWsWindow* aHeadWin, TRegion& aScreenUpdateRegion)
+	: TWalkWindowTreeSchedule(), iScreenUpdateRegion(aScreenUpdateRegion)
+	{
+	iHead = aHeadWin;
+	}
+
+void TWalkWindowListSchedule::WalkWindowList()
+	{
+	CWsWindow* win = iHead;
+	CWsWindow* previous = NULL;
+	while (win)
+		{
+		if (!DoIt(win))
+			{
+			// Remove win from list, as it doesn't need to be rendered
+			if (win == iHead)
+				{
+				iHead = win->NextScheduled();
+				}
+			else
+				{
+				WS_ASSERT_DEBUG(previous,EWsPanicWindowNull);
+				previous->SetNextScheduled(win->NextScheduled());
+				}
+			}
+		else
+			{
+			previous = win;
+			}
+		win = win->NextScheduled();
+		}
+	}
+
+/**
+@return ETrue if aWin has content that needs to be rendered, otherwise EFalse. 
+*/
+TBool TWalkWindowListSchedule::DoIt(CWsWindow* aWin)
+	{
+	if (aWin->IsVisible())
+		{
+		//In case we don't have all content, queue a request for the client to provide it.
+		CWsWindowRedraw& redrawWin = *(aWin->Redraw());
+		if(!redrawWin.InvalidArea().IsEmpty())
+			{
+			redrawWin.QueueRedraw();
+			}
+			
+		//Schedule all we got for now
+		const TBool scheduledWindowContent = DoWindow(*aWin);
+		const TBool scheduledSpriteContent = DoSprites(*aWin);
+		return (scheduledWindowContent || scheduledSpriteContent);
+		}
+	return EFalse;
+	}
+
+TBool TWalkWindowListSchedule::DoWindow(CWsWindow& aWin)
+	{
+	if (!aWin.DirtyWindowRegion().IsEmpty())
+		{
+		//Schedule
+		aWin.ScheduleDirtyWindowRegion();
+		//And ensure this part of the screen is updated
+		iScreenUpdateRegion.Union(aWin.ScheduledRegion());
+		return ETrue;
+		}
+	return EFalse;
+	} 
+
+TBool TWalkWindowListSchedule::DoSprites(CWsWindow& aWin)
+	{
+	if (!aWin.DirtySpriteRegion().IsEmpty())
+		{
+		//Schedule
+		aWin.ScheduleDirtySpriteRegion();
+		//And ensure this part of the screen is updated
+		iScreenUpdateRegion.Union(aWin.ScheduledSpriteRegion());
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+const TRegion& TWalkWindowListSchedule::WindowRegion(const CWsWindow& aWin) const
+	{
+	return aWin.ScheduledRegion();
+	}
+
+const TRegion& TWalkWindowListSchedule::SpriteRegion(const CWsWindow& aWin) const
+	{
+	return aWin.ScheduledSpriteRegion();
+	}
+
+TWalkWindowTreeScheduleRegions::TWalkWindowTreeScheduleRegions(TRegion& aRegion, const TRegion& aTopElement) :
+	TWalkWindowTreeSchedule(),
+	iRegion(aRegion),
+	iTopElement(aTopElement),
+	iScheduledRegionsOk(ETrue)
+	{
+	}
+
+// This is similar to TWalkWindowTreeRegionBase::DoIt
+TBool TWalkWindowTreeScheduleRegions::DoIt(CWsWindow *aWin)
+	{
+	WS_ASSERT_DEBUG((aWin != iHead), EWsPanicScheduledRedraw);
+	if (aWin->IsVisible())
+		{
+		// Calculate the region we care about for this window:
+		STACK_REGION region;
+		if (aWin->WinType()==EWinTypeRoot)
+			{
+			region.Copy(iRegion);
+			}
+		else
+			{
+			static_cast<CWsClientWindow *>(aWin)->GetClippedBaseArea(region);
+			region.Intersect(iRegion);
+			}
+		// If there is a region we care about, remember the window:
+		// NOTE: Even if there are no redraw segments (ReadyToDraw is false) the window should
+		//       be scheduled if it has a element so that the background surface is made visible
+		//  or if it has some animations which should be redrawn via the PostDrawWindow method (cf def131912)
+		if (!region.IsEmpty() && (aWin->ReadyToDraw() || aWin->HasElement() || aWin->HasAnimation() || aWin->HasSprite()) )
+			{
+			// Add window to linked list:
+			aWin->SetNextScheduled(iHead);
+			iHead = aWin;
+			// Set the window scheduled region to something appropriate:
+			if (iScheduledRegionsOk)
+				{
+				if (region.CheckError())
+					{
+					iScheduledRegionsOk = EFalse;
+					}
+				else
+					{
+					iScheduledRegionsOk = aWin->SetScheduledRegion(region);
+					}
+				}
+			}
+		if (aWin->WinType()!=EWinTypeRoot)
+			{
+			// Remove the opaque part from our working region:
+			STACK_REGION opaqueRegion;
+			static_cast<CWsClientWindow *>(aWin)->GetOpaqueClippedBaseArea(opaqueRegion);
+			iRegion.SubRegion(opaqueRegion);
+			opaqueRegion.Close();
+			
+			// Where we were drawing transparent and doing top element only, remove
+			// that bit too:
+			if (!iTopElement.IsEmpty())
+				{
+				region.Intersect(iTopElement);
+				iRegion.SubRegion(region);
+				}
+			}
+		region.Close();
+		}
+
+	return(iRegion.IsEmpty() || !iScheduledRegionsOk);
+	}
+
+const TRegion& TWalkWindowTreeScheduleRegions::WindowRegion(const CWsWindow& aWin) const
+	{
+	WS_ASSERT_DEBUG(iScheduledRegionsOk, EWsPanicScheduledRedraw);
+	return aWin.ScheduledRegion();
+	}
+
+const TRegion& TWalkWindowTreeScheduleRegions::SpriteRegion(const CWsWindow& aWin) const
+	{
+	//Intentionally returning WindowRegion as TWalkWindowTreeScheduleRegions do not
+	//make use of ScheduledSpriteRegion
+	return aWin.ScheduledRegion();
+	}
+
+TBool TWalkWindowTreeScheduleRegions::ScheduledRegionsOk() const
+	{
+	return iScheduledRegionsOk;
+	}
+
+TWalkWindowTreeScheduleFallback::TWalkWindowTreeScheduleFallback(CScreen::CFallbackMap * aFallbackMap) :
+	TWalkWindowTreeSchedule(),
+	iFallbackMap(aFallbackMap)
+	{
+	}
+
+// This is similar to TWalkWindowTreeRegionBase::DoIt
+TBool TWalkWindowTreeScheduleFallback::DoIt(CWsWindow *aWin)
+	{
+	WS_ASSERT_DEBUG((aWin != iHead), EWsPanicScheduledRedraw);
+	if (aWin->IsVisible())
+		{
+		if (aWin == aWin->RootWindow())
+			{
+			aWin->SetNextScheduled(iHead);
+			return ETrue;
+			}
+		else
+			{
+			TBool addWindow = EFalse;
+			CWsClientWindow* cliWin = static_cast<CWsClientWindow *>(aWin);
+			if (cliWin->IsTranslucent())
+				{
+				addWindow = ETrue; // costs more to work out than it is worth
+				const TRegion * opaque = cliWin->GetUserOpaqueRegion();
+				if (opaque && !opaque->CheckError())
+					iFallbackMap->FillRegion(*opaque);
+				}
+			else
+				{
+				addWindow = iFallbackMap->FillRegion(*cliWin->BaseArea());
+				}
+			if (addWindow)
+				{
+				aWin->SetNextScheduled(iHead);
+				iHead = aWin;
+				}
+			}
+		}
+
+	return(iFallbackMap->Count() < 1);
+	}
+
+const TRegion& TWalkWindowTreeScheduleFallback::WindowRegion(const CWsWindow& aWin) const
+	{
+	if (&aWin == aWin.RootWindow())
+		return *(iFallbackMap->Region());
+	else
+		{
+		const CWsClientWindow& win = static_cast<const CWsClientWindow&>(aWin);
+		const TRegion* region = win.VisibleRegionIfValid();
+		if (!region)
+			region = win.BaseArea();
+		return *region;
+		}
+	}
+
+const TRegion& TWalkWindowTreeScheduleFallback::SpriteRegion(const CWsWindow& aWin) const
+	{
+	return WindowRegion(aWin);
+	}
+
+TWalkWindowTreeIsObscured::TWalkWindowTreeIsObscured(TBool &aResult) :
+	iResult(&aResult)
+	{
+	aResult=ETrue;
+	}
+
+TBool TWalkWindowTreeIsObscured::DoIt(CWsWindow *aWin)
+	{
+	if (!aWin->VisibleRegion().IsEmpty())
+		{
+		*iResult=EFalse;
+		return(ETrue);
+		}
+	return(EFalse);
+	}
+
+TWalkWindowTreeSetupVisibleRegionTracking::TWalkWindowTreeSetupVisibleRegionTracking(TBool aRegister) : iRegister(aRegister)
+	{
+	}
+
+TBool TWalkWindowTreeSetupVisibleRegionTracking::DoIt(CWsWindow *aWin)
+	{
+	ASSERT(aWin->WinType() == EWinTypeClient);
+	if(aWin->WinType() == EWinTypeClient)
+		{
+		aWin->SetupVisibleRegionTracking(iRegister);
+		}
+	return(EFalse);
+	}
+
+TWalkWindowTreeSetNonFading::TWalkWindowTreeSetNonFading(TBool aNonFading) :
+	iNonFading(aNonFading)
+	{}
+TBool TWalkWindowTreeSetNonFading::DoIt(CWsWindow *aWin)
+	{
+	aWin->SetNonFading(iNonFading); 
+	return EFalse;
+	}
+
+TWalkWindowTreeSetFaded::TWalkWindowTreeSetFaded(TBool aFaded,CWsWindowBase* aWin,TUint8 aBlackMap,TUint8 aWhiteMap) :
+	iBlackMap(aBlackMap), iWhiteMap(aWhiteMap), iFaded(aFaded), iGroup(aWin->WinGroup())
+	{
+	}
+	
+TBool TWalkWindowTreeSetFaded::DoIt(CWsWindow *aWin)
+	{
+	if (aWin->WinGroup()!=iGroup)
+		return ETrue;
+	
+	const TBool KNotifyObserver = ETrue;
+	TBool dummy; //not used in this case
+	((CWsClientWindow*)aWin)->SetFaded(iFaded, iBlackMap, iWhiteMap, KNotifyObserver, dummy); 
+	return EFalse;
+	}
+
+TWalkWindowTreeSetSystemFaded::TWalkWindowTreeSetSystemFaded(TBool aFaded, CWsWindowBase* aWin, TUint8 aBlackMap, TUint8 aWhiteMap, TBool& aStateChanged) :
+	TWalkWindowTreeSetFaded(aFaded, aWin, aBlackMap, aWhiteMap), 
+	iStateChanged(aStateChanged)
+	{
+	}
+
+TBool TWalkWindowTreeSetSystemFaded::DoIt(CWsWindow *aWin)
+	{
+	if (aWin->WinGroup()!=iGroup)
+		return ETrue;
+	
+	const TBool KNotifyObserver = EFalse; //don't send fade state change notification
+	
+	TBool stateChanged = EFalse; 
+	((CWsClientWindow*)aWin)->SetFaded(iFaded, iBlackMap, iWhiteMap, KNotifyObserver, stateChanged);
+	iStateChanged = iStateChanged || stateChanged;
+	
+	return EFalse;
+	}
+
+TWalkWindowTreePurgeEvents::TWalkWindowTreePurgeEvents()
+	{}
+
+TBool TWalkWindowTreePurgeEvents::DoIt(CWsWindow *aWin)
+	{
+	aWin->PurgeEvents();
+	return EFalse;
+	}
+
+TWalkWindowTreeCalcInvalidGraphics::TWalkWindowTreeCalcInvalidGraphics(RWsRegion *aRegion,TRegion &aDirty,const TArray<TGraphicDrawerId>& aInvalid):
+	TWalkWindowTreeRegionBase(aRegion, EWalkTranslucent),
+	iDirty(aDirty),
+	iInvalid(aInvalid)
+	{
+	}
+
+void TWalkWindowTreeCalcInvalidGraphics::DestroyRegions()
+	{
+	if(iSubRegion)
+		{
+		iSubRegion->Close();
+		}
+	delete iSubRegion;
+	iSubRegion = NULL;	
+	iDirty.Clear();
+	}	
+
+void TWalkWindowTreeCalcInvalidGraphics::CalcInvalid(CScreen& aScreen)
+	{
+	if(aScreen.RootWindow())
+		{
+		aScreen.RootWindow()->WalkWindowTree(*this,EWalkChildren);
+		if(iRegion->CheckError())
+			{
+			iDirty.ForceError();
+			}
+		}
+	}
+
+TBool TWalkWindowTreeCalcInvalidGraphics::CreateSubRegion()
+	{
+	iSubRegion=new RWsRegion;
+	return iSubRegion!=NULL;
+	}
+
+TBool TWalkWindowTreeCalcInvalidGraphics::DoIt3(CWsWindow *aWin) 
+	{
+	if (!iDirty.CheckError() && aWin->Redraw() && 
+				aWin->Redraw()->Contains(iInvalid,aWin->VisibleRegion()) &&
+				!aWin->Redraw()->RedrawingInProgress())
+		{
+		STACK_REGION intersection;
+		intersection.Intersection(*iSubRegion,aWin->VisibleRegion());
+		iDirty.Union(intersection);
+		intersection.Close();
+		}
+
+	return iDirty.CheckError();	//causes pessimistic full-screen redraw if failed
+	}
+
+#if defined(_DEBUG)
+
+TBool TWalkWindowTreeCheck::DoIt(CWsWindow *aWin)
+	{
+	if (aWin->WinType()==EWinTypeRoot)
+		{
+		WS_ASSERT_DEBUG(aWin->BaseParent()==NULL, EWsPanicWindowCheck);
+		WS_ASSERT_DEBUG(aWin->NextSibling()==NULL, EWsPanicWindowCheck);
+		}
+	else
+		{
+		WS_ASSERT_DEBUG(aWin->WinType()==EWinTypeClient, EWsPanicWindowCheck);
+		}
+	if (aWin->BaseChild())
+		{
+		WS_ASSERT_DEBUG(aWin->BaseChild()->BaseParent()==aWin, EWsPanicWindowCheck);
+		}
+	if (aWin->NextSibling())
+		{
+		WS_ASSERT_DEBUG(aWin->NextSibling()->GetPrevSibling()==aWin, EWsPanicWindowCheck);
+		}
+	return(EFalse);
+	}
+
+TBool TWalkWindowTreeFindWithFlag::DoIt(CWsWindow *aWin)
+	{
+	if (aWin->iFlags & iFlag)
+		{
+		iFound = aWin;
+		return ETrue;
+		}
+	return EFalse;
+	}
+	
+#endif
+
+#include "wnredraw.h"	
+TWalkWindowTreeRedrawStoreSize::TWalkWindowTreeRedrawStoreSize() : iTotalSize(0)
+	{
+	}
+
+TBool TWalkWindowTreeRedrawStoreSize::DoIt(CWsWindow *aWin)
+	{
+	iTotalSize += aWin->Redraw()->SizeInBytes();
+	return EFalse;
+	}
+
+
+TBool TWalkWindowTreeFindByHandle::DoIt(CWsWindow *aWin)
+	{
+	if (aWin->ClientHandle() == iHandle)
+		{
+		iFound = aWin;
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+TWalkWindowTreeUpdateRegions::TWalkWindowTreeUpdateRegions(CScreen & aScreen) :
+	iScreen(aScreen)
+	{
+	}
+
+void TWalkWindowTreeUpdateRegions::Walk()
+	{
+	STACK_REGION floatingSpriteRgn;
+	iScreen.SpriteManager()->CalcFloatingSpriteRgn( floatingSpriteRgn, iScreen.RootWindow()->AbsRect() );
+	iVisible.AddRect(iScreen.RootWindow()->AbsRect());
+	iTop.AddRect(iScreen.RootWindow()->AbsRect());
+	iRemainsOfFadableScreen.AddRect( iScreen.RootWindow()->AbsRect() );
+	iTop.SubRegion(floatingSpriteRgn);
+	iScreen.RootWindow()->WalkWindowTree(*this, EWalkChildren);
+	iTop.Close();
+	iVisible.Close();	
+	iRemainsOfFadableScreen.Close();
+	floatingSpriteRgn.Close();
+	}
+
+TBool TWalkWindowTreeUpdateRegions::DoIt(CWsWindow * aWin)
+	{	
+	if (aWin->IsVisible() && !iVisible.IsEmpty())
+		{
+		// Calculate the region we care about for this window:
+		STACK_REGION newVisibleRegion;
+		STACK_REGION newFadableRegion;
+		if (aWin->WinType()==EWinTypeRoot)
+			{
+			newVisibleRegion.Copy(iVisible);
+			}
+		else
+			{
+			static_cast<CWsClientWindow *>(aWin)->GetClippedBaseArea(newVisibleRegion);
+			newVisibleRegion.Intersect(iVisible);
+			if (!aWin->IsTranslucent())
+				{
+				iVisible.SubRegion(newVisibleRegion);
+				}
+			else
+				{
+				STACK_REGION opaque;
+				static_cast<CWsClientWindow *>(aWin)->GetOpaqueClippedBaseArea(opaque);
+				iVisible.SubRegion(opaque);				
+				opaque.Close();
+				}
+			//If the window has been faded calculate what region actually needs fading 
+			//(i.e. subtract what has already been faded)
+			if ( aWin->FadeCount() && !aWin->IsNonFading() && aWin->IsVisible()  && !iRemainsOfFadableScreen.IsEmpty() )
+				{
+				newFadableRegion.Copy( newVisibleRegion );
+				newFadableRegion.Intersect( iRemainsOfFadableScreen );
+				}
+			}
+		aWin->SetVisibleRegion(newVisibleRegion, &iTop);
+		aWin->SetFadeableRegion(newFadableRegion, iTop);
+		
+		iRemainsOfFadableScreen.SubRegion( newFadableRegion );
+		newFadableRegion.Close();
+		
+		iTop.SubRegion(newVisibleRegion);
+		newVisibleRegion.Close();
+		}
+	else
+		{
+		if (!aWin->VisibleRegion().IsEmpty())
+			{
+			aWin->ClearVisibleRegion();
+			}
+		}	
+	return(EFalse);
+	}
+
+TWalkWindowTreeScheduleRedraws::TWalkWindowTreeScheduleRedraws():
+	iScheduleRedrawFilter( ERedrawFilterNoFilter )
+	{
+	}
+
+TWalkWindowTreeScheduleRedraws::TWalkWindowTreeScheduleRedraws( TUint32 aFilter ):
+	iScheduleRedrawFilter( aFilter )
+	{
+	}
+
+TBool TWalkWindowTreeScheduleRedraws::DoIt(CWsWindow * aWin)
+	{
+	if (aWin->WinType() != EWinTypeClient || static_cast<CWsClientWindow *>(aWin)->HasBeenDrawnToScreen())
+		{
+		TBool ban = (iScheduleRedrawFilter & ERedrawFilterOmitDSA) && ( aWin->IsDSAHost() );
+		if ( !ban )
+			{
+			aWin->Screen()->AddRedrawRegion(aWin->VisibleRegion());
+			}
+		}
+	return EFalse;
+	}
+
+TWalkWindowTreeOffsetTransparentRegions::TWalkWindowTreeOffsetTransparentRegions(const TPoint& aOffset) :
+	iOffset(aOffset)
+	{
+	}
+
+TBool TWalkWindowTreeOffsetTransparentRegions::DoIt(CWsWindow * aWin)
+	{
+	if (aWin != aWin->RootWindow())
+		static_cast<CWsClientWindow *>(aWin)->OffsetUserTransparentRegion(iOffset);
+	return EFalse;
+	}
+
+TWalkWindowTreeRecalcOpaque::TWalkWindowTreeRecalcOpaque()
+	{
+	}
+
+TBool TWalkWindowTreeRecalcOpaque::DoIt(CWsWindow * aWin)
+	{
+	if (aWin != aWin->RootWindow())
+		static_cast<CWsClientWindow *>(aWin)->SetUserOpaqueRegion();
+	return EFalse;
+	}
+
+TWalkWindowTreeSendState::TWalkWindowTreeSendState(MWsWindowTreeObserver& aWindowTreeObserver)
+	: iWindowTreeObserver(aWindowTreeObserver)
+	{
+	}
+
+TBool TWalkWindowTreeSendState::DoIt(CWsWindow * aWin)
+	{
+	aWin->SendState(iWindowTreeObserver);
+	return EFalse;
+	}