Applied patch 1, to provide a syborg specific minigui oby file.
Need to compare this with the "stripped" version currently in the tree.
This supplied version applies for Nokia builds, but need to repeat the
test for SF builds to see if pruning is needed, or if the file needs to
be device-specific.
// 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();
}