--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tcrx/tcrx.cpp Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,393 @@
+// 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;
+ }