author | Gareth Stockwell <gareth.stockwell@accenture.com> |
Fri, 22 Oct 2010 11:38:29 +0100 | |
branch | bug235_bringup_0 |
changeset 206 | c170e304623f |
parent 0 | 5d03bc08d59c |
permissions | -rw-r--r-- |
// 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: // /** @file @test @internalComponent - Internal Symbian test code */ #include <gdi.h> #include "tcrx.h" #include "wsredir.h" #include "wslisten.h" static TRedirectorInfo TheInfo; class CTwoWindow: public CBase { public: static CTwoWindow* NewL(); ~CTwoWindow(); private: void ConstructL(); private: RWsSession iWs; CWsScreenDevice* iScr; CWindowGc* iGc; RWindowGroup iGroup; RWindow iBg; RWindow iFg; }; CTwoWindow* CTwoWindow::NewL() { CTwoWindow* tw = new(ELeave) CTwoWindow; CleanupStack::PushL(tw); tw->ConstructL(); CleanupStack::Pop(tw); return tw; } CTwoWindow::~CTwoWindow() { iFg.Close(); iBg.Close(); iGroup.Close(); delete iGc; delete iScr; iWs.Close(); } void CTwoWindow::ConstructL() { User::LeaveIfError(iWs.Connect()); iScr = new(ELeave) CWsScreenDevice(iWs); User::LeaveIfError(iScr->Construct()); User::LeaveIfError(iScr->CreateContext(iGc)); iGroup = RWindowGroup(iWs); User::LeaveIfError(iGroup.Construct(0xc0de,ETrue)); iBg = RWindow(iWs); User::LeaveIfError(iBg.Construct(iGroup,0xc0debabe)); iBg.SetRequiredDisplayMode(EColor64K); iBg.Activate(); iWs.Flush(); iBg.BeginRedraw(); iGc->Activate(iBg); iGc->SetBrushColor(KRgbGreen); iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); TRect rect(iScr->SizeInPixels()); iGc->DrawRect(rect); iGc->SetBrushColor(KRgbBlue); iGc->DrawEllipse(rect); iGc->Deactivate(); iBg.EndRedraw(); iWs.Flush(); iFg = RWindow(iWs); User::LeaveIfError(iFg.Construct(iGroup,0xc0decafe)); iFg.SetRequiredDisplayMode(EColor64K); iFg.SetTransparencyAlphaChannel(); iFg.SetBackgroundColor(TRgb(0xff,0x55,0x55,0x80)); iFg.Activate(); iWs.Flush(); } CClient* CClient::NewL() { CClient* self = new(ELeave) CClient; CleanupStack::PushL(self); self->ConstructL(); CleanupStack::Pop(self); return self; } CClient::CClient(): CActive(CActive::EPriorityStandard) { } void CClient::ConstructL() { CActiveScheduler::Add(this); User::LeaveIfError(iWs.Connect()); iScreen = new(ELeave) CWsScreenDevice(iWs); User::LeaveIfError(iScreen->Construct(0)); iGroup = RWindowGroup(iWs); User::LeaveIfError(iGroup.Construct(0xCAFE, ETrue)); iGc = new(ELeave) CWindowGc(iScreen); User::LeaveIfError(iGc->Construct()); iWin = new(ELeave) CWindow(this); iWin->ConstructL(NULL, EFalse); iRedraw = CRedrawHandler::NewL(this); iRedir = CWsRedir::NewL(); iListen = CWsListen::NewL(); MakeRequest(); } void CClient::HandleCommand(TInt aCmd) { switch (aCmd) { case 1: iRedir->Redirect(CWsRedir::EFrontBuffer, ETrue); break; case 2: iRedir->Redirect(CWsRedir::EBackBuffer, ETrue); break; case 3: iRedir->Redirect(CWsRedir::EFrontBuffer, EFalse); break; case 4: iRedir->Redirect(CWsRedir::EBackBuffer, EFalse); break; case 5: iListen->Enable(ETrue); break; case 6: iListen->Enable(EFalse); break; case 7: iRedir->QueryPlugin(TheInfo); break; case 8: iBlank.Close(); iBlank = RBlankWindow(iWs); iBlank.Construct(iGroup, 0xbeef); iBlank.SetRequiredDisplayMode(EColor64K); iBlank.SetColor(KRgbRed); iBlank.SetExtent(TPoint(20,20),TSize(100,100)); iBlank.Activate(); break; case 9: ClearTwoWindow(); DrawTwoWindow(); break; case 10: CActiveScheduler::Stop(); break; } } CClient::~CClient() { Deque(); ClearTwoWindow(); iBlank.Close(); delete iListen; delete iRedir; delete iWin; delete iRedraw; delete iGc; delete iScreen; iGroup.Close(); iWs.Close(); } void CClient::DrawTwoWindow() { TRAP_IGNORE(iTwo = CTwoWindow::NewL()); } void CClient::ClearTwoWindow() { delete iTwo; iTwo = NULL; } void CClient::RunL() { iWs.GetEvent(iEvent); if (iEvent.Type()==EEventKey) HandleCommand(iEvent.Key()->iCode-'0'); MakeRequest(); } void CClient::DoCancel() { iWs.EventReadyCancel(); } void CClient::MakeRequest() { iWs.EventReady(&iStatus); SetActive(); } CRedrawHandler* CRedrawHandler::NewL(CClient* aClient) { CRedrawHandler* self=new(ELeave) CRedrawHandler(aClient); CleanupStack::PushL(self); self->ConstructL(); CleanupStack::Pop(self); return self; } CRedrawHandler::CRedrawHandler(CClient* aClient) : CActive(CActive::EPriorityStandard), iClient(aClient) { } void CRedrawHandler::ConstructL() { CActiveScheduler::Add(this); MakeRequest(); } CRedrawHandler::~CRedrawHandler() { Cancel(); } void CRedrawHandler::RunL() { TWsRedrawEvent event; iClient->Ws().GetRedraw(event); CWindow* win = (CWindow*)event.Handle(); if (win) { TRect rect=event.Rect(); iClient->Gc().Activate(win->Window()); win->Window().BeginRedraw(rect); win->Draw(rect); win->Window().EndRedraw(); iClient->Gc().Deactivate(); } MakeRequest(); } void CRedrawHandler::MakeRequest() { iClient->Ws().RedrawReady(&iStatus); SetActive(); } void CRedrawHandler::DoCancel() { iClient->Ws().RedrawReadyCancel(); } CWindow::CWindow(CClient* aClient) : iClient(aClient) { } CWindow::~CWindow() { iWin.Close(); } void CWindow::ConstructL(CWindow* aParent, TBool aTransparentFlag) { iParent = aParent; iWin = RWindow(iClient->Ws()); RWindowTreeNode* node=iParent? &iParent->Window() : (RWindowTreeNode*)&iClient->Group(); User::LeaveIfError(iWin.Construct(*node, (TUint32)this)); iWin.SetRequiredDisplayMode(EColor64K); if (aTransparentFlag) { iWin.SetBackgroundColor(TRgb(0,0,0,0x80)); iWin.SetTransparencyAlphaChannel(); } iWin.SetExtent(TPoint(0,0),TSize(240,240)); iWin.Activate(); } void CWindow::Draw(const TRect& aRect) const { CWindowGc& gc = iClient->Gc(); gc.SetBrushStyle(CGraphicsContext::ESolidBrush); gc.SetBrushColor(TRgb(0,0,0xff,0xff)); gc.DrawRect(TRect(aRect.iTl.iX,aRect.iTl.iY,aRect.iBr.iX,aRect.iBr.iY/2)); gc.SetBrushColor(TRgb(0,0,0xff,0x80)); gc.DrawRect(TRect(aRect.iTl.iX,aRect.iBr.iY/2,aRect.iBr.iX,aRect.iBr.iY)); DrawMenu(); gc.DrawWsGraphic(iClient->WsRedir()->Id(),TRect(aRect.iTl.iX,aRect.iBr.iY/2,aRect.iBr.iX,aRect.iBr.iY)); } _LIT(KMenu1, "1. Redirect screen"); _LIT(KMenu2, "2. Redirect flickerfree"); _LIT(KMenu3, "3. Restore screen"); _LIT(KMenu4, "4. Restore flickerfree"); _LIT(KMenu5, "5. Register event listener"); _LIT(KMenu6, "6. Unregister listener"); _LIT(KMenu7, "7. Test send receive msg"); _LIT(KMenu8, "8. Test blank window"); _LIT(KMenu9, "9. Test two window"); _LIT(KMenuA, "A. Exit"); const TBufC<32> TheMenu[] = { (const TDesC&)KMenu1, (const TDesC&)KMenu2, (const TDesC&)KMenu3, (const TDesC&)KMenu4, (const TDesC&)KMenu5, (const TDesC&)KMenu6, (const TDesC&)KMenu7, (const TDesC&)KMenu8, (const TDesC&)KMenu9, (const TDesC&)KMenuA }; _LIT(KTypeFace, "DejaVu Sans Condensed"); void CWindow::DrawMenu() const { CWsScreenDevice* scr = iClient->Screen(); CFont* font = NULL; TFontSpec fs(KTypeFace, 15); scr->GetNearestFontInPixels(font, fs); CWindowGc& gc = iClient->Gc(); gc.UseFont(font); TInt h = font->HeightInPixels(); gc.SetPenColor(KRgbYellow); TInt nMenu = sizeof(TheMenu)/sizeof(TheMenu[0]); for (TInt ii=0; ii<nMenu; ++ii) gc.DrawText(TheMenu[ii], TPoint(10,(ii+1)*h)); gc.DiscardFont(); scr->ReleaseFont(font); } void MainL() { CClient* client=CClient::NewL(); CActiveScheduler::Start(); delete client; } GLDEF_C TInt E32Main() { CTrapCleanup* trap=CTrapCleanup::New(); if (!trap) return KErrNoMemory; CActiveScheduler* scheduler = new(ELeave) CActiveScheduler; CActiveScheduler::Install(scheduler); __UHEAP_MARK; TRAPD(err, MainL()); __UHEAP_MARKEND; delete scheduler; delete trap; return err; }