windowing/windowserver/TClick/LOGWIN.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/TClick/LOGWIN.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,304 @@
+// Copyright (c) 2003-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:
+// Extracted from DEBLOGWN.CPP
+// Code to run the WIN32 windows with the output
+// 
+//
+
+#include <e32std.h>
+#include <e32base.h>
+#include <emulator.h>
+#include "LOGWIN.H"
+
+GLDEF_D struct TSharedMemory GSharedMemory;
+//GLDEF_D struct HWND__ *Hwnd;
+//LOCAL_D RSemaphore Sem;
+
+const TUint KHeapSize=0x8000;
+
+
+TInt numLines(const CArrayVarSeg<TText> &aTextArray, TBool aOutOfMemory)
+	{
+	return (TInt)(aOutOfMemory)?
+				aTextArray.Count():
+				aTextArray.Count()-1;
+	}
+
+TInt numVisibleLines(TInt aHeight, TInt aTextHeight)
+	{
+	return aHeight/aTextHeight;
+	}
+
+TInt32 __stdcall WndProc(struct HWND__ *aHwnd, TUint aMessage, TUint wParam, TInt32 lParam)
+    {
+    HDC hdc;
+    PAINTSTRUCT ps;
+	HFONT hfont;
+    RECT rect;
+	TInt i,
+		paintMin,
+		paintMax;
+	static LOGFONT logFont;
+	static TEXTMETRIC tm;
+	static TInt textHeight,
+		width,
+		height,
+		scrollMin=0,
+		scrollMax,
+		numLinesAbove=scrollMin,
+		prevNumLinesAbove;
+	static CArrayVarSeg<TText> *pmsg;
+	static TBool outOfMemory=EFalse;
+
+    switch (aMessage)
+        {
+    case WM_CREATE:
+		hdc=GetDC(aHwnd);
+
+		pmsg=new(ELeave) CArrayVarSeg<TText>(20);
+		{
+		TBuf<0x20> errorMsg;
+		errorMsg=_L("ERROR: out of memory");
+		errorMsg.ZeroTerminate();
+		TRAPD(err,pmsg->AppendL(*errorMsg.Ptr(), (errorMsg.Length()+1)*sizeof(TText)));
+		if (err!=KErrNone)
+			return(err);
+		}
+		GetTextMetrics(hdc, &tm);
+		textHeight=tm.tmHeight+tm.tmExternalLeading;
+        GetClientRect(aHwnd, &rect);
+		width=rect.right;
+		height=rect.bottom;
+		scrollMax=numLines(*pmsg, outOfMemory);
+		SetScrollPos(aHwnd, SB_VERT, numLinesAbove, TRUE);
+		SetScrollRange(aHwnd, SB_VERT, scrollMin, scrollMax, FALSE);
+		logFont.lfHeight=8;
+		wsprintf(logFont.lfFaceName, (LPCTSTR)_S("courier"));
+
+		ReleaseDC(aHwnd, hdc);
+		return 0;
+	case WM_USER+EAppendText:
+		{
+		TRAPD(err,pmsg->InsertL(pmsg->Count()-1, *(TText *)lParam, wParam));
+		if (err!=KErrNone)
+			{
+			pmsg->Delete(0, Max(0, (TInt)pmsg->Count()-1));
+			numLinesAbove=scrollMax=scrollMin;
+			SetScrollPos(aHwnd, SB_VERT, numLinesAbove, TRUE);
+			SetScrollRange(aHwnd, SB_VERT, scrollMin, scrollMax, FALSE);
+			hdc=GetDC(aHwnd);
+			PatBlt(hdc, 0, 0, width, height, WHITENESS);
+			ReleaseDC(aHwnd, hdc);
+			return(err);
+			}
+		// adjust the scroll position so that the last line added is visible
+		if (numLinesAbove<numLines(*pmsg, outOfMemory)-numVisibleLines(height, textHeight))
+			{
+			prevNumLinesAbove=numLinesAbove;
+			numLinesAbove=numLines(*pmsg, outOfMemory)-numVisibleLines(height, textHeight);
+			scrollMax=numLines(*pmsg, outOfMemory);
+			SendMessage(aHwnd, WM_USER+EScrollToPos, 0, 0L);
+			}
+		else
+			{
+			hdc=GetDC(aHwnd);
+			hfont=(HFONT)SelectObject(hdc, CreateFontIndirect(&logFont));
+			TText *text=&((*pmsg)[scrollMax]);
+			TextOut(hdc, 0, (scrollMax-numLinesAbove)*textHeight, (LPCTSTR)text, User::StringLength(text));
+			scrollMax=numLines(*pmsg, outOfMemory);
+			ReleaseDC(aHwnd, hdc);
+			}
+		return KErrNone;
+		}
+	case WM_USER+EScrollToPos:
+		SetScrollPos(aHwnd, SB_VERT, numLinesAbove, TRUE);
+		SetScrollRange(aHwnd, SB_VERT, scrollMin, scrollMax, FALSE);
+
+		hdc=GetDC(aHwnd);
+		hfont=(HFONT)SelectObject(hdc, CreateFontIndirect(&logFont));
+
+		if (numLinesAbove>prevNumLinesAbove)
+		// scrolling towards end, therefore text moves up on screen
+			{
+			TInt numLinesToDraw=numLinesAbove-prevNumLinesAbove;
+			TInt numLinesToBlt=numVisibleLines(height, textHeight)-numLinesToDraw;
+			if (numLinesToBlt>0)
+				ScrollWindow(aHwnd, 0, -numLinesToDraw*textHeight, NULL, NULL);
+			PatBlt(hdc, 0, numLinesToBlt*textHeight, width, numLinesToDraw*textHeight, WHITENESS);
+			paintMin=Max(Min(numLinesAbove+numLinesToBlt, scrollMax), scrollMin);
+			paintMax=Min(paintMin+numLinesToDraw, scrollMax);
+			for (i=paintMin; i<paintMax; i++)
+				{
+				TText *text=&((*pmsg)[i]);
+				TextOut(hdc, 0, (i-numLinesAbove)*textHeight, (LPCTSTR)text, User::StringLength(text));
+				}
+			}
+		else
+		// scrolling towards beginning, therefore text moves down on screen
+			{
+			TInt numLinesToDraw=prevNumLinesAbove-numLinesAbove;
+			TInt numLinesToBlt=numVisibleLines(height, textHeight)-numLinesToDraw;
+			if (numLinesToBlt>0)
+				ScrollWindow(aHwnd, 0, numLinesToDraw*textHeight, NULL, NULL);
+			PatBlt(hdc, 0, 0, width, numLinesToDraw*textHeight, WHITENESS);
+			paintMin=Max(Min(numLinesAbove, scrollMax), scrollMin);
+			paintMax=Min(paintMin+numLinesToDraw, scrollMax);
+			for (i=paintMin; i<paintMax; i++)
+				{
+				TText *text=&((*pmsg)[i]);
+				TextOut(hdc, 0, (i-numLinesAbove)*textHeight, (LPCTSTR)text, User::StringLength(text));
+				}
+			}
+
+		DeleteObject(hfont);
+		ReleaseDC(aHwnd, hdc);
+		return 0;
+    case WM_PAINT:
+		hdc=BeginPaint(aHwnd, &ps);
+		hfont=(HFONT)SelectObject(hdc, CreateFontIndirect(&logFont));
+
+		paintMin=Max(scrollMin, numLinesAbove);
+		paintMax=Min(numLines(*pmsg, outOfMemory), numLinesAbove+numVisibleLines(height, textHeight));
+		for (i=paintMin; i<paintMax; i++)
+				{
+				TText *text=&((*pmsg)[i]);
+				TextOut(hdc, 0, (i-numLinesAbove)*textHeight, (LPCTSTR)text, User::StringLength(text));
+				}
+
+		DeleteObject(hfont);
+		EndPaint(aHwnd, &ps);
+        return 0;
+    case WM_SIZE:
+        width=LOWORD(lParam);
+        height=HIWORD(lParam);
+		return 0;
+    case WM_VSCROLL:
+		prevNumLinesAbove=numLinesAbove;
+        switch (LOWORD(wParam))
+			{
+		case SB_TOP:
+			numLinesAbove=scrollMin;
+			break;
+		case SB_BOTTOM:
+			numLinesAbove=scrollMax;
+			break;
+		case SB_LINEUP:
+			numLinesAbove--;
+			break;
+		case SB_LINEDOWN:
+			numLinesAbove++;
+			break;
+		case SB_PAGEUP:
+			numLinesAbove-=numVisibleLines(height, textHeight);
+			break;
+		case SB_PAGEDOWN:
+			numLinesAbove+=numVisibleLines(height, textHeight);
+			break;
+		case SB_THUMBTRACK:
+			numLinesAbove=HIWORD(wParam);
+			break;
+			}
+		numLinesAbove=max(scrollMin, min(numLinesAbove, scrollMax));
+
+		if (numLinesAbove!=prevNumLinesAbove)
+			SendMessage(aHwnd, WM_USER+EScrollToPos, 0, 0L);
+		return 0;
+    case WM_KEYDOWN:
+		switch (wParam)
+			{
+		case VK_HOME:
+			SendMessage(aHwnd, WM_VSCROLL, SB_TOP, 0L);
+			break;
+		case VK_END:
+			SendMessage(aHwnd, WM_VSCROLL, SB_BOTTOM, 0L);
+			break;
+		case VK_PRIOR:
+			SendMessage(aHwnd, WM_VSCROLL, SB_PAGEUP, 0L);
+			break;
+		case VK_NEXT:
+			SendMessage(aHwnd, WM_VSCROLL, SB_PAGEDOWN, 0L);
+			break;
+		case VK_UP:
+			SendMessage(aHwnd, WM_VSCROLL, SB_LINEUP, 0L);
+			break;
+		case VK_DOWN:
+			SendMessage(aHwnd, WM_VSCROLL, SB_LINEDOWN, 0L);
+			break;
+			}
+		return 0;
+	case WM_DESTROY:
+		delete pmsg;
+		PostQuitMessage(0);
+		return 0;
+		}
+
+	return DefWindowProc(aHwnd, aMessage, wParam, lParam);
+	}
+
+TInt logWinMain(TAny *)
+    {
+    MSG msg;
+    WNDCLASS wndclass;
+    const TText *szAppName=_S("Window Server Log");
+
+    wndclass.style=CS_HREDRAW|CS_VREDRAW;
+    wndclass.lpfnWndProc=WndProc;
+    wndclass.cbClsExtra=0;
+    wndclass.cbWndExtra=0;
+    wndclass.hInstance=NULL;
+    wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
+    wndclass.hCursor=LoadCursor(NULL, IDC_ARROW);
+	//wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
+	wndclass.hbrBackground=(HBRUSH)GetSysColorBrush(COLOR_BTNFACE);
+    wndclass.lpszMenuName=NULL;
+    wndclass.lpszClassName=(LPCTSTR)szAppName;
+
+    RegisterClass(&wndclass);
+
+	GSharedMemory.iHwnd=CreateWindow((LPCTSTR)szAppName,
+                    (LPCTSTR)szAppName,
+					WS_OVERLAPPEDWINDOW,
+					//WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_MINIMIZE,
+                    CW_USEDEFAULT,
+                    CW_USEDEFAULT,
+                    CW_USEDEFAULT,
+                    CW_USEDEFAULT,
+                    NULL,
+                    NULL,
+                    NULL,
+                    NULL);
+
+	ShowWindow(GSharedMemory.iHwnd, SW_SHOWMINNOACTIVE);
+	//ShowWindow(GSharedMemory.iHwnd, SW_MINIMIZE);
+	UpdateWindow(GSharedMemory.iHwnd);
+	GSharedMemory.iStartSemaphore.Signal(); // allows logging to start now that the window, etc. has been set up
+	Emulator::Escape();
+    while (GetMessage(&msg, NULL, 0, 0))
+        {
+        TranslateMessage(&msg);
+        DispatchMessage(&msg);
+        }
+	Emulator::Reenter();
+    return msg.wParam;
+    }
+
+GLDEF_C void CreateLogWinThreadL()
+	{
+	_LIT(KLogWin,"LogingWindow");
+	RThread wsThread;
+	GSharedMemory.iStartSemaphore.CreateLocal(0);
+	User::LeaveIfError(wsThread.Create(KLogWin,logWinMain,KDefaultStackSize,KHeapSize,KHeapSize,NULL));
+	wsThread.Resume();
+	GSharedMemory.iStartSemaphore.Wait();
+	}