sl@0: // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Window virtual base class, windows and window groups are derived from this sl@0: // sl@0: // sl@0: sl@0: #include sl@0: #include "server.h" sl@0: #include "winbase.h" sl@0: #include "rootwin.h" sl@0: #include "windowgroup.h" sl@0: #include "walkwindowtree.h" sl@0: #include "wstop.h" sl@0: #include "EVQUEUE.H" sl@0: #include "EVENT.H" sl@0: #include "panics.h" sl@0: #include "pointer.h" sl@0: sl@0: CWsWindowBase::CWsWindowBase(CWsClient* aOwner,WH_HANDLES aType, CScreen* aScreen) : CWsScreenObject(aOwner,aType,aScreen) sl@0: { sl@0: } sl@0: sl@0: void CWsWindowBase::ConstructL(CWsWindowBase *parent) sl@0: { sl@0: iParent=parent; sl@0: iSibling=parent->iChild; sl@0: parent->iChild=this; sl@0: SetOrdinalPosition(0); sl@0: iFadeCount = iParent->iFadeCount; sl@0: } sl@0: sl@0: CWsWindowBase *CWsWindowBase::GetPrevSibling() const sl@0: { sl@0: CWsWindowBase **prev= &iParent->iChild; sl@0: CWsWindowBase *ret=NULL; sl@0: while ((*prev)!=this) sl@0: { sl@0: ret=*prev; sl@0: prev= &(*prev)->iSibling; sl@0: } sl@0: return(ret); sl@0: } sl@0: sl@0: CWsWindowBase *CWsWindowBase::LastSibling() const sl@0: { sl@0: const CWsWindowBase *win; sl@0: for(win=this;win->iSibling;win=win->iSibling) sl@0: {} sl@0: return (CWsWindowBase*)win; sl@0: } sl@0: sl@0: CWsWindowBase *CWsWindowBase::PrevSiblingMultiParent() const sl@0: { sl@0: CWsWindowBase *win=GetPrevSibling(); sl@0: if (win) sl@0: return(win); sl@0: for(CWsWindowBase *parent=iParent->GetPrevSibling();parent;parent=parent->GetPrevSibling()) sl@0: if ((win=parent->iChild)!=NULL) sl@0: return(win->LastSibling()); sl@0: return(NULL); sl@0: } sl@0: sl@0: // Andy - this is a kind of "next cousin" function sl@0: CWsWindowBase *CWsWindowBase::NextSiblingMultiParent() const sl@0: { sl@0: if (iSibling) sl@0: return(iSibling); sl@0: for(CWsWindowBase *parent=iParent->iSibling;parent;parent=parent->iSibling) sl@0: { sl@0: if (parent->iChild!=NULL) sl@0: return(parent->iChild); sl@0: } sl@0: return(NULL); sl@0: } sl@0: sl@0: TInt CWsWindowBase::OrdinalPosition(TBool aFull) const sl@0: { sl@0: if (!iParent) sl@0: { sl@0: OwnerPanic(EWservPanicParentDeleted); sl@0: } sl@0: CWsWindowBase *win=iParent->iChild; sl@0: if (!aFull) sl@0: while(iOrdinalPriorityiOrdinalPriority) sl@0: win=win->iSibling; sl@0: TInt count; sl@0: for(count=0;win!=this;count++) sl@0: win=win->iSibling; sl@0: return(count); sl@0: } sl@0: sl@0: /** Removes a window from the list of siblings maintained by its parent window. sl@0: sl@0: The iSibling stored inside the window we remove is kept unchanged as it may be needed later. sl@0: sl@0: @internalComponent sl@0: @released sl@0: */ sl@0: void CWsWindowBase::RemoveFromSiblingList() sl@0: { sl@0: if (iParent!=NULL) sl@0: { sl@0: CWsWindowBase **prev= &iParent->iChild; sl@0: while ((*prev)!=this) sl@0: prev= &(*prev)->iSibling; sl@0: *prev=iSibling; sl@0: } sl@0: } sl@0: sl@0: /* This const casts in this function are horrible and need revisiting. */ sl@0: CWsWindowGroup *CWsWindowBase::WinGroup() const sl@0: { sl@0: switch (iWinType) sl@0: { sl@0: case EWinTypeClient: sl@0: { sl@0: if (iParent) sl@0: { sl@0: CWsWindowBase* win = const_cast(this); sl@0: while(win->WinType()!=EWinTypeGroup) sl@0: win=win->BaseParent(); sl@0: return static_cast(win); sl@0: } sl@0: return 0; sl@0: } sl@0: case EWinTypeGroup: sl@0: return const_cast(static_cast(this)); sl@0: default: sl@0: return 0; sl@0: } sl@0: } sl@0: sl@0: TBool CWsWindowBase::CheckOrdinalPositionChange(TInt aPos) sl@0: // sl@0: // This routine checks to see whether the specified new ordinal position sl@0: // will causes a change, if so returns ETrue else EFalse. sl@0: // sl@0: { sl@0: if (!iParent) sl@0: { sl@0: OwnerPanic(EWservPanicParentDeleted); sl@0: } sl@0: CWsWindowBase *win= iParent->iChild; sl@0: CWsWindowBase *prev= NULL; sl@0: while(win==this || (win!=NULL && iOrdinalPriorityiOrdinalPriority)) sl@0: { sl@0: prev=win; sl@0: win=win->iSibling; sl@0: } sl@0: if (prev==this) sl@0: win=this; sl@0: else if (win==NULL || (win->iSibling==this && iOrdinalPriority>win->iOrdinalPriority)) sl@0: return ETrue; sl@0: while(aPos--!=0 && win->iSibling!=NULL && iOrdinalPriority==win->iSibling->iOrdinalPriority) sl@0: win=win->iSibling; sl@0: return(win!=this); sl@0: } sl@0: sl@0: void CWsWindowBase::ChangeWindowPosition(TInt aPos,CWsWindowBase* aNewParent) sl@0: { sl@0: if (aNewParent != iParent) sl@0: { sl@0: iScreen->ScheduleRegionUpdate(NULL); sl@0: TWalkWindowTreeScheduleRedraws wwt; sl@0: WalkWindowTree(wwt, EWalkChildren); sl@0: } sl@0: else if (WinType() == EWinTypeClient) sl@0: { sl@0: CWsClientWindow * cliwin = static_cast(this); sl@0: if (cliwin->IsVisible()) sl@0: { sl@0: iScreen->ScheduleRegionUpdate(NULL); sl@0: if (cliwin->IsTranslucent()) sl@0: { sl@0: // There is still room for optimization here. These redraws are only required if the window sl@0: // moved through another window and BOTH of them were transparent, otherwise the visible sl@0: // region change will sort out the redraws required. sl@0: TWalkWindowTreeScheduleRedraws wwt; sl@0: WalkWindowTree(wwt, EWalkChildren); sl@0: } sl@0: } sl@0: } sl@0: else if (WinType() == EWinTypeGroup) sl@0: { sl@0: iScreen->ScheduleRegionUpdate(NULL); sl@0: if (static_cast(this)->HasVisibleTranslucentChild()) sl@0: { sl@0: TWalkWindowTreeScheduleRedraws wwt; sl@0: WalkWindowTree(wwt, EWalkChildren); sl@0: } sl@0: } sl@0: sl@0: RemoveFromSiblingList(); sl@0: CWsWindowBase **prevWinPtr= &aNewParent->iChild; sl@0: while((*prevWinPtr)!=NULL && iOrdinalPriority<(*prevWinPtr)->iOrdinalPriority) sl@0: { sl@0: prevWinPtr= &(*prevWinPtr)->iSibling; sl@0: } sl@0: while(aPos--!=0 && *prevWinPtr!=NULL && iOrdinalPriority==(*prevWinPtr)->iOrdinalPriority) sl@0: { sl@0: prevWinPtr= &(*prevWinPtr)->iSibling; sl@0: } sl@0: iSibling=*prevWinPtr; sl@0: iParent=aNewParent; sl@0: *prevWinPtr=this; sl@0: } sl@0: sl@0: void CWsWindowBase::SetOrdinalPosition(TInt aPos) sl@0: { sl@0: if (CheckOrdinalPositionChange(aPos)) sl@0: ChangeWindowPosition(aPos,iParent); sl@0: } sl@0: sl@0: TEventQueueWalkRet EventPurgeFunc(TAny *aPtr, TWsEvent *aEvent) sl@0: // sl@0: // Callback function for event queue walk sl@0: // sl@0: { sl@0: return(((CWsWindowBase *)aPtr)->EventPurgeCheck(aEvent)); sl@0: } sl@0: sl@0: TEventQueueWalkRet CWsWindowBase::EventPurgeCheck(TWsEvent *aEvent) sl@0: { sl@0: if (aEvent->Handle()==ClientHandle()) sl@0: return(EEventQueueWalkDeleteEvent); sl@0: return(EEventQueueWalkOk); sl@0: } sl@0: sl@0: void CWsWindowBase::PurgeEvents() sl@0: { sl@0: iWsOwner->EventQueue()->WalkEventQueue(&EventPurgeFunc,this); sl@0: } sl@0: sl@0: void CWsWindowBase::Shutdown() sl@0: // sl@0: // Destroy a window, disconnects from the window tree and destroys all it's child windows sl@0: // sl@0: { sl@0: if (iWsOwner!=NULL) sl@0: PurgeEvents(); sl@0: if (iParent!=NULL) // Check it's connected to something sl@0: { sl@0: CWsWindowBase *win; sl@0: for(win=this;win && win->iParent!=(CWsWindowBase *)RootWindow();win=win->iParent) sl@0: {} sl@0: RemoveFromSiblingList(); sl@0: TWalkWindowTreeDisconnect wwt2(win ? ((CWsWindowGroup *)win)->TextCursor() : NULL); sl@0: WalkWindowTree(wwt2,EWalkChildren); // Disconnect all child windows sl@0: iChild=NULL; sl@0: } sl@0: TWindowServerEvent::RemoveFromSwitchOnEventList(*this); sl@0: TWindowServerEvent::RemoveFromErrorMessageList(*this); sl@0: TWindowServerEvent::RemoveFromGroupChangeEventEventList(*this); sl@0: TWindowServerEvent::RemoveFromFocusChangeEventEventList(*this); sl@0: TWindowServerEvent::RemoveFromGroupListChangeEventEventList(*this); sl@0: TWindowServerEvent::RemoveFromModifierChangedEventList(*this); sl@0: TWindowServerEvent::RemoveFromScreenDeviceChangeEventList(*this); sl@0: CWsTop::StopWindowGettingOffEvents(this); sl@0: } sl@0: sl@0: TBool CWsWindowBase::CommandL(TInt aOpcode, TWsWinCmdUnion &aCmd) sl@0: // sl@0: // If the command is supported by the window base class process it and return ETrue sl@0: // if it is not supported return EFalse sl@0: // sl@0: { sl@0: switch(aOpcode) sl@0: { sl@0: case EWsWinOpFree: sl@0: delete this; sl@0: break; sl@0: case EWsWinOpSetOrdinalPosition: sl@0: SetOrdinalPosition(*aCmd.Int); sl@0: break; sl@0: case EWsWinOpOrdinalPriority: sl@0: SetReply(iOrdinalPriority); sl@0: break; sl@0: case EWsWinOpOrdinalPosition: sl@0: SetReply(OrdinalPosition(EFalse)); sl@0: break; sl@0: case EWsWinOpFullOrdinalPosition: sl@0: SetReply(OrdinalPosition(ETrue)); sl@0: break; sl@0: case EWsWinOpClientHandle: sl@0: SetReply(iClientHandle); sl@0: break; sl@0: case EWsWinOpParent: sl@0: if (!iParent) sl@0: { sl@0: OwnerPanic(EWservPanicParentDeleted); sl@0: } sl@0: SetReply(iParent->iClientHandle); sl@0: break; sl@0: case EWsWinOpPrevSibling: sl@0: { sl@0: if (!iParent) sl@0: { sl@0: OwnerPanic(EWservPanicParentDeleted); sl@0: } sl@0: TUint32 reply=NULL; sl@0: for(CWsWindowBase *win=this->GetPrevSibling();win;win=win->GetPrevSibling()) sl@0: { sl@0: if (win->iWsOwner==iWsOwner) sl@0: { sl@0: reply=win->iClientHandle; sl@0: break; sl@0: } sl@0: } sl@0: SetReply(reply); sl@0: } sl@0: break; sl@0: case EWsWinOpNextSibling: sl@0: { sl@0: TUint32 reply=NULL; sl@0: for(CWsWindowBase *win=this->iSibling;win;win=win->iSibling) sl@0: { sl@0: if (win->iWsOwner==iWsOwner) sl@0: { sl@0: reply=win->iClientHandle; sl@0: break; sl@0: } sl@0: } sl@0: SetReply(reply); sl@0: } sl@0: break; sl@0: case EWsWinOpChild: sl@0: SetReply(iChild==NULL ? NULL : iChild->iClientHandle); sl@0: break; sl@0: case EWsWinOpScreenNumber: sl@0: SetReply(Screen()->ScreenNumber()); sl@0: break; sl@0: case EWsWinOpWindowGroupId: sl@0: if (!WinGroup()) sl@0: { sl@0: OwnerPanic(EWservPanicParentDeleted); sl@0: } sl@0: SetReply(WinGroup()->Identifier()); sl@0: break; sl@0: case EWsWinOpEnableOnEvents: sl@0: TWindowServerEvent::AddToSwitchOnEventListL(*this, *aCmd.EventControl); sl@0: break; sl@0: case EWsWinOpDisableOnEvents: sl@0: TWindowServerEvent::RemoveFromSwitchOnEventList(*this); sl@0: break; sl@0: case EWsWinOpEnableErrorMessages: sl@0: TWindowServerEvent::AddToErrorMessageListL(*this, *aCmd.EventControl); sl@0: break; sl@0: case EWsWinOpDisableErrorMessages: sl@0: TWindowServerEvent::RemoveFromErrorMessageList(*this); sl@0: break; sl@0: case EWsWinOpEnableModifierChangedEvents: sl@0: TWindowServerEvent::AddToModifierChangedEventListL(*this, aCmd.EnableModifierChangedEvents->modifierMask, sl@0: aCmd.EnableModifierChangedEvents->circumstances); sl@0: break; sl@0: case EWsWinOpDisableModifierChangedEvents: sl@0: TWindowServerEvent::RemoveFromModifierChangedEventList(*this); sl@0: break; sl@0: case EWsWinOpEnableGroupChangeEvents: sl@0: TWindowServerEvent::AddToGroupChangeEventListL(*this); sl@0: break; sl@0: case EWsWinOpDisableGroupChangeEvents: sl@0: TWindowServerEvent::RemoveFromGroupChangeEventEventList(*this); sl@0: break; sl@0: case EWsWinOpEnableFocusChangeEvents: sl@0: TWindowServerEvent::AddToFocusChangeEventListL(*this); sl@0: break; sl@0: case EWsWinOpDisableFocusChangeEvents: sl@0: TWindowServerEvent::RemoveFromFocusChangeEventEventList(*this); sl@0: break; sl@0: case EWsWinOpEnableGroupListChangeEvents: sl@0: TWindowServerEvent::AddToGroupListChangeEventListL(*this); sl@0: break; sl@0: case EWsWinOpDisableGroupListChangeEvents: sl@0: TWindowServerEvent::RemoveFromGroupListChangeEventEventList(*this); sl@0: break; sl@0: case EWsWinOpSetCustomPointerCursor: sl@0: CWsObject *pointercursor; sl@0: if ((pointercursor=iWsOwner->HandleToObj(*aCmd.Int, WS_HANDLE_POINTER_CURSOR))==NULL) sl@0: OwnerPanic(EWservPanicSprite); sl@0: SetPointerCursor((CWsPointerCursor *)pointercursor); sl@0: break; sl@0: case EWsWinOpSetPointerCursor: sl@0: SetPointerCursorByIndex(*aCmd.UInt); sl@0: break; sl@0: case EWsWinOpClearPointerCursor: sl@0: SetPointerCursor(NULL); sl@0: break; sl@0: case EWsWinOpSetNonFading: sl@0: { sl@0: WS_ASSERT_DEBUG(iScreen, EWsPanicNoScreen); sl@0: // No fading will occur from a graphical perspective, but the fade counts sl@0: // are maintained for BC reasons. sl@0: TWalkWindowTreeSetNonFading wwt(*aCmd.Bool); sl@0: WalkWindowTree(wwt,EWalkChildren); sl@0: Screen()->AcceptFadeRequest( reinterpret_cast(this), sl@0: ETrue, sl@0: EFalse, sl@0: ETrue ); sl@0: } sl@0: break; sl@0: case EWsWinOpSetFade: sl@0: { sl@0: if (!iParent) sl@0: { sl@0: OwnerPanic(EWservPanicParentDeleted); sl@0: } sl@0: WS_ASSERT_DEBUG(iScreen, EWsPanicNoScreen); sl@0: sl@0: TUint8 blackMap; sl@0: TUint8 whiteMap; sl@0: if (aCmd.SetFaded->UseDefaultMap()) sl@0: { sl@0: iScreen->GetFadingParams(blackMap,whiteMap); sl@0: } sl@0: else sl@0: { sl@0: aCmd.SetFaded->GetFadingParams(blackMap,whiteMap); sl@0: } sl@0: sl@0: if (aCmd.SetFaded->IncludeChildren()) sl@0: { sl@0: TWalkWindowTreeSetFaded wwt(aCmd.SetFaded->Faded(),this,blackMap,whiteMap); sl@0: WalkWindowTree(wwt,EWalkChildren); sl@0: } sl@0: else sl@0: { sl@0: if (iWinType==EWinTypeGroup) sl@0: OwnerPanic(EWservPanicOpcode); sl@0: static_cast(this)->SetFaded(aCmd.SetFaded->Faded(),blackMap,whiteMap); sl@0: } sl@0: sl@0: if (CWsTop::IsFadeEnabled()) sl@0: { sl@0: Screen()->AcceptFadeRequest( reinterpret_cast (this), sl@0: aCmd.SetFaded->Faded(), sl@0: EFalse, sl@0: aCmd.SetFaded->IncludeChildren() ); sl@0: } sl@0: } sl@0: break; sl@0: default: sl@0: return(EFalse); sl@0: } sl@0: return(ETrue); sl@0: } sl@0: sl@0: TBool CWsWindowBase::QueueEvent(TInt aEvent) const sl@0: { sl@0: if (WsOwner()) sl@0: return(WsOwner()->EventQueue()->QueueEvent(iClientHandle, aEvent)); sl@0: return(EFalse); sl@0: } sl@0: sl@0: void CWsWindowBase::SetPointerCursorByIndex(TInt aIndex) sl@0: { sl@0: SetPointerCursor(CWsClient::SystemPointerCursor(aIndex)); sl@0: } sl@0: sl@0: void CWsWindowBase::SetPointerCursor(CWsPointerCursor *aCursor) sl@0: { sl@0: CWsPointerCursor *old=iPointerCursor; sl@0: iPointerCursor=aCursor; sl@0: if (iPointerCursor) sl@0: iPointerCursor->Open(); sl@0: WsPointer::UpdatePointerCursor(); sl@0: if (old) sl@0: old->Close(); sl@0: } sl@0: sl@0: TBool CWsWindowBase::TreeIsObscured() const sl@0: { sl@0: TBool result; sl@0: TWalkWindowTreeIsObscured wwt(result); sl@0: CONST_CAST(CWsWindowBase *,this)->WalkWindowTree(wwt,EWalkChildren); sl@0: return(result); sl@0: } sl@0: sl@0: CEventQueue *CWsWindowBase::EventQueue() const sl@0: { sl@0: return(iWsOwner->EventQueue()); sl@0: } sl@0: sl@0: void CWsWindowBase::WalkWindowTree(TWalkWindowTreeBase &aWalkClass,TWalkMode aMode) sl@0: // sl@0: // Walks windows in a front to back order sl@0: // sl@0: // If mode is EWalkBehind sl@0: // call DoIt for all windows that are behind 'this' sl@0: // else if mode is EWalkChildren sl@0: // call DoIt for all descendents sl@0: // else if mode is EWalkChildrenAndBehind sl@0: // call DoIt for for all descendents and windows behind sl@0: // sl@0: { sl@0: if (this!=NULL) sl@0: { sl@0: CWsWindowBase *win=this; sl@0: CWsWindowBase *end=RootWindow(); sl@0: CWsWindowBase *sibling=win->iSibling; sl@0: CWsWindowBase *parent=win->iParent; sl@0: if (aMode!=EWalkBehind) sl@0: { sl@0: if (aMode==EWalkChildren) sl@0: end=win; sl@0: goto start; sl@0: } sl@0: do sl@0: { sl@0: if (sibling!=NULL) sl@0: { sl@0: win=sibling; sl@0: start: while(win->iChild!=NULL) sl@0: win=win->iChild; sl@0: } sl@0: else sl@0: win=parent; sl@0: sibling=win->iSibling; // De-reference win so it can be destroyed by 'DoIt' sl@0: parent=win->iParent; sl@0: if (win->iWinType!=EWinTypeGroup && aWalkClass.DoIt((CWsWindow *)win)) sl@0: return; sl@0: } while(win!=end); sl@0: } sl@0: } sl@0: sl@0: /* Walks windows in a front to back order sl@0: sl@0: If aResume is EFalse the walk is identical to above. sl@0: Otherwise iWin is taken as the restart point, (any child windows will have been sl@0: walked previously). sl@0: */ sl@0: void CWsWindowBase::WalkWindowTree(TResumableWalkWindowTreeBase& aWalkClass, TWalkMode aMode, TBool aResume) sl@0: { sl@0: if (this != NULL) sl@0: { // init sl@0: if (!aResume) sl@0: { sl@0: aWalkClass.iWin = this; sl@0: aWalkClass.iEnd = (aMode == EWalkChildren) ? this : RootWindow(); sl@0: aWalkClass.iParent = aWalkClass.iWin->iParent; sl@0: if (aMode == EWalkBehind) sl@0: { sl@0: aWalkClass.iNextChild = aWalkClass.iWin->iSibling; sl@0: } sl@0: else sl@0: { // ensure walk includes this and its child windows sl@0: aWalkClass.iNextChild = this; sl@0: } sl@0: } sl@0: else if (aWalkClass.iWin == aWalkClass.iEnd) sl@0: { sl@0: return; // walk had already reached end sl@0: } sl@0: sl@0: do sl@0: { sl@0: if (aWalkClass.iNextChild != NULL) sl@0: { // walk down tree to a leaf window sl@0: aWalkClass.iWin = aWalkClass.iNextChild; sl@0: while (aWalkClass.iWin->iChild != NULL) sl@0: { sl@0: aWalkClass.iWin = aWalkClass.iWin->iChild; sl@0: } sl@0: } sl@0: else sl@0: { // walk up tree sl@0: aWalkClass.iWin = aWalkClass.iParent; sl@0: } sl@0: // De-reference iWin so it can be destroyed by 'DoIt' sl@0: aWalkClass.iNextChild = aWalkClass.iWin->iSibling; sl@0: aWalkClass.iParent = aWalkClass.iWin->iParent; sl@0: if ( ( aWalkClass.iWin->iWinType != EWinTypeGroup ) && aWalkClass.DoIt(static_cast(aWalkClass.iWin)) ) sl@0: { sl@0: return; sl@0: } sl@0: } sl@0: while (aWalkClass.iWin != aWalkClass.iEnd); sl@0: } sl@0: } sl@0: sl@0: #if defined(_DEBUG) sl@0: sl@0: void CWsWindowBase::CheckTree() sl@0: { sl@0: TWalkWindowTreeCheck wwt1; sl@0: WalkWindowTree(wwt1,EWalkChildren); sl@0: } sl@0: sl@0: enum {ENullWsHandle=0xFFFFFFFF}; // Events delivered to this handle are thrown away sl@0: TBool CWsWindowBase::IsClientHandleInUse(TUint32 aHandle) sl@0: { sl@0: if (aHandle==static_cast(ENullWsHandle)) //This value has a special meaning in test code sl@0: return EFalse; sl@0: CWsObjectIx* index=iWsOwner->ObjectIndex(); sl@0: const CWsObject* obj; sl@0: TInt length=index->Length(); sl@0: TInt ii; sl@0: for (ii=0;iiAt(ii); sl@0: if (obj && (obj->Type()==WS_HANDLE_WINDOW || obj->Type()==WS_HANDLE_GROUP_WINDOW)) sl@0: { sl@0: if (STATIC_CAST(const CWsWindowBase*,obj)->ClientHandle()==aHandle) sl@0: return ETrue; sl@0: } sl@0: } sl@0: return EFalse; sl@0: } sl@0: sl@0: #endif sl@0: sl@0: TBool CWsWindowBase::IsDSAHost() const sl@0: { sl@0: return EFalse; sl@0: } sl@0: