emulator/emulatorbsp/specific/gui.cpp
author hgs
Thu, 14 Oct 2010 15:28:20 +0530
changeset 51 5aa1c6a27c95
parent 15 ac35e54b1f85
permissions -rw-r--r--
201037_03
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
     1
// Copyright (c) 1995-2010 Nokia Corporation and/or its subsidiary(-ies).
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
     2
// All rights reserved.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
     3
// This component and the accompanying materials are made available
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
     5
// which accompanies this distribution, and is available
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
     7
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
     8
// Initial Contributors:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
     9
// Nokia Corporation - initial contribution.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    10
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    11
// Contributors:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    12
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    13
// Description:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    14
// wins\specific\gui.cpp
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    15
// 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    16
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    17
#define WINVER 0x0500
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    18
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    19
#include "gui.h"
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    20
#include <emulator.h>
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    21
#include <assp.h>
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    22
#include <kernel/kern_priv.h>
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    23
#include <kernel/kpower.h>
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    24
#include "variant.h"
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    25
#include "resource.h"
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    26
#include "winsgui.h"
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    27
#include "display_chan.h"
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    28
#include "pixelformats.h"
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    29
#include "multitouch.h"
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    30
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    31
#include "monitors.h"
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    32
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    33
#include <kernel/sproperty.h>
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    34
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    35
//Define these so that emulator generates varying values for gce stride and offset.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    36
//By default in emulator, stride is exactly right for display resolution and offset is zero
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    37
//Setting these will identify code which incorrectly calculates these factors instead of requesting them
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    38
//Note that multiples of 4 bytes are preferred for various reasons.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    39
//[3/5/07 The Secure presentation burffer ignores stride extra because it uses a windows bitmap header to render.]
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    40
// #define TEST_GCE_VARIABLE_STRIDE_EXTRA	16		 	//This constant is added to each mode's scanline length in bytes. It may cause a break if enabled because the iDisplayBufferOffset is not being set
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    41
// #define TEST_GCE_VARIABLE_START_EXTRA	16			//A multiple of this is added to each mode's start address in bytes
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    42
// #define ASSYMETRIC_SQUARE_STRIDE						//If this is defined and the width==height the the stride will not be the same!
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    43
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    44
enum  
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    45
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    46
		KMaskModeNum=0x0FFFFFFF,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    47
		KMaskModeFlag8=0x80000000,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    48
		KMaskModeFlag4=0x40000000,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    49
		KMaskModeFlag2=0x20000000,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    50
		KMaskModeFlag1=0x10000000,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    51
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    52
		KModeFlagFlipped=KMaskModeFlag8,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    53
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    54
	};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    55
enum  
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    56
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    57
		KMaskScreenNum=0x0FFF,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    58
		KMaskScreenFlag8=0x8000,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    59
		KMaskScreenFlag4=0x4000,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    60
		KMaskScreenFlag2=0x2000,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    61
		KMaskScreenFlag1=0x1000,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    62
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    63
		KScreenFlagSecure=KMaskScreenFlag8,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    64
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    65
	};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    66
const TInt KMaxDisplayColors=16777216;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    67
const TInt KMaxDisplayContrast=1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    68
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    69
static TEmulatorFlip* CurrentFlipState=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    70
static TInt CurrentConfiguration = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    71
static TInt SavedFlipMessage = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    72
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    73
DWinsUi *systemIni=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    74
DMasterIni* masterIni;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    75
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    76
DMultiTouch* TheMultiTouch;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    77
static HWND TheControlWin;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    78
static HWND* TheChildWin=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    79
static HWND* TheWin=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    80
static HWND hwndStatus; // To display the X,Y,Z information of each mouse
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    81
static TInt VirtualKeyPressed = EStdKeyNull;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    82
static HBITMAP* TheScreenBitmap=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    83
static TUint LedMask;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    84
static TBool WsSwitchOnScreen;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    85
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    86
const char * DefaultWindowTitle = "Symbian OS Emulator";
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    87
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    88
#ifdef __VC32__
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    89
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    90
#ifdef _DEBUG
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    91
const char * VersionText = " - wins udeb";
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    92
#else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    93
const char * VersionText = " - wins urel";
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    94
#endif
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    95
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    96
#else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    97
#ifdef __CW32__
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    98
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
    99
#ifdef _DEBUG
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   100
const char * VersionText = " - winscw udeb";
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   101
#else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   102
const char * VersionText = " - winscw urel";
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   103
#endif
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   104
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   105
#else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   106
//not winscw or wins!
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   107
#ifdef _DEBUG
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   108
const char * VersionText = " - unknown udeb";
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   109
#else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   110
const char * VersionText = " - unknown urel");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   111
#endif
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   112
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   113
#endif
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   114
#endif
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   115
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   116
void Inactive();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   117
void Active();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   118
void DrawLeds();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   119
void UpdateModifiers(); 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   120
TInt DisplayHalFunction(TAny*, TInt aFunction, TAny* a1, TAny* a2);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   121
LOCAL_C TBool PaintWindowFromBuffer(HWND hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   122
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   123
GLDEF_C const char* skipws(const char* aPtr)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   124
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   125
	while (isspace(*aPtr))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   126
		++aPtr;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   127
	return aPtr;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   128
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   129
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   130
GLDEF_C const char* skiptok(const char* aPtr)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   131
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   132
	while (isalnum(*aPtr))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   133
		++aPtr;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   134
	return aPtr;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   135
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   136
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   137
GLDEF_C TInt CompareI(const TDesC8& aLhs, const TDesC8& aRhs)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   138
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   139
// Case insensitive comparison of descriptors
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   140
// (TDesC::CompareF not available to kernel side code)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   141
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   142
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   143
	TInt ll = aLhs.Length();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   144
	TInt rl = aRhs.Length();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   145
	TInt len = Min(ll, rl);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   146
	TInt k = _strnicmp((const char*)aLhs.Ptr(), (const char*)aRhs.Ptr(), len);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   147
	return k != 0 ? k : ll - rl;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   148
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   149
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   150
GLDEF_C TInt MultiProperty(TInt (*aHandler)(TAny* aObj, const char*), TAny* aPtr, const char* aProperty)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   151
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   152
	const char* value = Property::GetString(aProperty);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   153
	if (!value)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   154
		return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   155
	for (;;)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   156
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   157
		TInt r = aHandler(aPtr, value);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   158
		if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   159
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   160
		const char* ev = strchr(value, ';');
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   161
		if (!ev)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   162
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   163
		value = ev + 1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   164
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   165
	return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   166
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   167
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   168
class DWinsGuiPowerHandler : public DPowerHandler
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   169
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   170
public: // from DPowerHandler
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   171
	void PowerDown(TPowerState);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   172
	void PowerUp();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   173
public:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   174
	static DWinsGuiPowerHandler* New();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   175
	void ScreenOn();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   176
	void ScreenOff();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   177
	void ScreenOn(TInt aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   178
	void ScreenOff(TInt aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   179
public:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   180
	DWinsGuiPowerHandler();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   181
	TBool ProcessEvent(const TRawEvent* aEvent);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   182
	TBool ProcessEventDfc(const TRawEvent* aEvent);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   183
	TBool	iStandby;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   184
	};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   185
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   186
class DWinsGuiRotateHandler
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   187
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   188
public:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   189
	static DWinsGuiRotateHandler* New();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   190
	TBool ProcessEventDfc(const TRawEvent* aEvent);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   191
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   192
private:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   193
	RPropertyRef iOrientationProperty;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   194
	};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   195
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   196
static DWinsGuiPowerHandler* WinsGuiPowerHandler;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   197
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   198
static DWinsGuiRotateHandler* WinsGuiRotateHandler;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   199
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   200
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   201
_LIT(KWinsGuiName, "WinsGui");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   202
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   203
DWinsGuiPowerHandler* DWinsGuiPowerHandler::New()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   204
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   205
	DWinsGuiPowerHandler* self = new DWinsGuiPowerHandler();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   206
	if (!self)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   207
		return NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   208
	self->Add();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   209
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   210
	return self;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   211
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   212
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   213
DWinsGuiPowerHandler::DWinsGuiPowerHandler() : DPowerHandler(KWinsGuiName)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   214
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   215
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   216
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   217
void DWinsGuiPowerHandler::ScreenOff()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   218
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   219
	for(TInt ix=0;ix<systemIni->iScreens.Count();ix++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   220
		ScreenOff(ix);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   221
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   222
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   223
void DWinsGuiPowerHandler::ScreenOn()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   224
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   225
	for(TInt ix=0;ix<systemIni->iScreens.Count();ix++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   226
		ScreenOn(ix);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   227
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   228
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   229
void DWinsGuiPowerHandler::ScreenOff(TInt aScreen)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   230
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   231
	PostMessageA(TheWin[aScreen], WM_EMUL_POWER_ON, FALSE, NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   232
	systemIni->iScreens[aScreen]->iScreenOff = ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   233
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   234
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   235
void DWinsGuiPowerHandler::ScreenOn(TInt aScreen)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   236
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   237
	PostMessageA(TheWin[aScreen], WM_EMUL_POWER_ON, TRUE, NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   238
	systemIni->iScreens[aScreen]->iScreenOff = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   239
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   240
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   241
void DWinsGuiPowerHandler::PowerDown(TPowerState aState)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   242
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   243
	if (aState == EPwStandby)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   244
		iStandby = ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   245
	ScreenOff();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   246
	PowerDownDone();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   247
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   248
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   249
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   250
void DWinsGuiPowerHandler::PowerUp()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   251
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   252
	iStandby = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   253
	ScreenOn();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   254
	PowerUpDone();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   255
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   256
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   257
// called in the interrupt context
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   258
TBool DWinsGuiPowerHandler::ProcessEvent(const TRawEvent* aEvent)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   259
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   260
	if (!iStandby)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   261
		// Pass through 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   262
		return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   263
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   264
	if ((aEvent->Type() == TRawEvent::EKeyDown))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   265
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   266
			Wins::Self() -> AssertWakeupSignal();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   267
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   268
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   269
	// Ignore
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   270
	return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   271
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   272
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   273
// called in DFC
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   274
TBool DWinsGuiPowerHandler::ProcessEventDfc(const TRawEvent* aEvent)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   275
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   276
	if (aEvent->Type() == TRawEvent::EKeyDown)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   277
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   278
		Wins::Self() -> WakeupEvent();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   279
		if (aEvent->ScanCode() == EStdKeyF5)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   280
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   281
			// Simulate a media change interrupt (media removed)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   282
			Wins::MediaChangeCallBack();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   283
			*Wins::MediaDoorOpenPtr()=ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   284
			// Ignore
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   285
			return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   286
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   287
		if (aEvent->ScanCode() == EStdKeyF8)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   288
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   289
			TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   290
			v.Set(TRawEvent::ECaseClose);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   291
			Kern::AddEvent(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   292
			// Ignore
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   293
			return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   294
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   295
		if (aEvent->ScanCode() == EStdKeyF8)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   296
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   297
			TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   298
			v.Set(TRawEvent::ECaseClose);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   299
			Kern::AddEvent(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   300
			// Ignore
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   301
			return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   302
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   303
		if (aEvent->ScanCode() == EStdKeyOff)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   304
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   305
			// Pass through
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   306
			return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   307
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   308
		if (aEvent->ScanCode() == EStdKeyF10)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   309
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   310
			TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   311
			v.Set(TRawEvent::ESwitchOff);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   312
			Kern::AddEvent(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   313
			// Ignore
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   314
			return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   315
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   316
		if (aEvent->ScanCode() == EStdKeyF11)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   317
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   318
			TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   319
			v.Set(TRawEvent::ECaseOpen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   320
			Kern::AddEvent(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   321
			// Ignore
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   322
			return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   323
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   324
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   325
	else if (aEvent->Type() == TRawEvent::EKeyUp)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   326
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   327
		if (aEvent->ScanCode() == EStdKeyF10)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   328
			// Ignore
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   329
			return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   330
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   331
		if (aEvent->ScanCode() == EStdKeyF5)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   332
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   333
			// Simulate a media change interrupt (media Present)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   334
			*Wins::MediaDoorOpenPtr()=EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   335
			return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   336
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   337
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   338
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   339
	// Path through
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   340
	return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   341
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   342
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   343
DWinsGuiRotateHandler* DWinsGuiRotateHandler::New()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   344
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   345
	DWinsGuiRotateHandler* self = new DWinsGuiRotateHandler();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   346
	if (!self)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   347
		{	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   348
		__KTRACE_OPT(KEXTENSION,Kern::Printf("Failed to alloc DWinsGuiRotateHandler"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   349
		return NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   350
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   351
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   352
	// Publish startup mode property
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   353
	_LIT_SECURITY_POLICY_PASS(readPolicy);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   354
	_LIT_SECURITY_POLICY_C1(writePolicy, ECapabilityWriteDeviceData);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   355
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   356
	TInt r = self->iOrientationProperty.Attach(KUidSystemCategory, KSystemEmulatorOrientationKey);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   357
	if (r!=KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   358
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   359
		delete self;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   360
		__KTRACE_OPT(KEXTENSION,Kern::Printf("DWinsGuiRotateHandler RPropertyRef::Attach Failed Err:%d", r));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   361
		return NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   362
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   363
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   364
	r = self->iOrientationProperty.Define(RProperty::EInt, readPolicy, writePolicy);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   365
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   366
	return self;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   367
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   368
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   369
TBool DWinsGuiRotateHandler::ProcessEventDfc(const TRawEvent* aEvent)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   370
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   371
	//Obtain rotation from ScanCode.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   372
	TInt rotation = aEvent->ScanCode() - ESpecialKeyBase;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   373
	TInt r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   374
	//Check this is a valid rotation and publish property.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   375
	if((rotation >= EEmulatorFlipRestore) && (rotation <= EEmulatorFlipRight))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   376
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   377
		if (aEvent->Type() == TRawEvent::EKeyDown)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   378
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   379
			Wins::Self()->WakeupEvent();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   380
			__KTRACE_OPT(KEXTENSION,Kern::Printf("Orientation change (%d) event:%x", rotation, aEvent->ScanCode()));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   381
			r = iOrientationProperty.Set(rotation);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   382
			__KTRACE_OPT(KEXTENSION, if (r != KErrNone) {Kern::Printf("RProperty::Set Failed Err:%d", r);});
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   383
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   384
		// Swallow event
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   385
		return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   386
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   387
	return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   388
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   389
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   390
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   391
class EventQ
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   392
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   393
	enum {ESize = 16};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   394
public:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   395
	EventQ();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   396
	void Add(const TRawEvent& aEvent);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   397
private:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   398
	static void Dfc(TAny* aPtr);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   399
	void Empty();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   400
private:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   401
	TDfc iDfc;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   402
	TRawEvent* iTail;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   403
	TRawEvent iQ[ESize];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   404
	};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   405
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   406
EventQ::EventQ()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   407
	:iDfc(&EventQ::Dfc, this, Kern::DfcQue0(), 6), iTail(iQ)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   408
	{}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   409
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   410
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   411
void EventQ::Add(const TRawEvent& aEvent)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   412
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   413
	StartOfInterrupt();	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   414
	if (WinsGuiPowerHandler->ProcessEvent(&aEvent)) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   415
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   416
		EndOfInterrupt();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   417
		return;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   418
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   419
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   420
	TRawEvent* pE = iTail;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   421
	if (pE != &iQ[ESize])
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   422
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   423
		*pE = aEvent;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   424
		iTail = pE + 1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   425
		if (pE == iQ)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   426
			iDfc.Add();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   427
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   428
	EndOfInterrupt();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   429
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   430
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   431
void EventQ::Dfc(TAny* aPtr)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   432
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   433
	static_cast<EventQ*>(aPtr)->Empty();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   434
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   435
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   436
void EventQ::Empty()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   437
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   438
// Called in the DFC
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   439
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   440
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   441
	TInt irq;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   442
	TRawEvent* pE = iQ;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   443
	for (;;)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   444
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   445
		if (!WinsGuiRotateHandler->ProcessEventDfc(pE))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   446
			if (!WinsGuiPowerHandler->ProcessEventDfc(pE)) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   447
				Kern::AddEvent(*pE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   448
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   449
		++pE;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   450
		irq = NKern::DisableAllInterrupts();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   451
		if (pE == iTail)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   452
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   453
		NKern::RestoreInterrupts(irq);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   454
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   455
	iTail = iQ;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   456
	NKern::RestoreInterrupts(irq);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   457
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   458
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   459
LOCAL_D EventQ TheEventQ;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   460
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   461
// Virtual keys
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   462
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   463
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   464
VirtualKey::VirtualKey(const TInt aCommandData, const TEmulCommand aCommand) : iCommand(aCommand), iData(aCommandData)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   465
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   466
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   467
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   468
TBool VKRect::Contains(TInt aX, TInt aY) const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   469
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   470
	return (aX >= iLeft && aX < iRight && aY >= iTop && aY < iBottom);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   471
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   472
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   473
VKRect::VKRect(const TInt aCommandData, const TEmulCommand aCommand, TInt aX, TInt aY, TInt aWidth, TInt aHeight) :
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   474
	VirtualKey(aCommandData, aCommand)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   475
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   476
	iLeft = aX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   477
	iTop = aY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   478
	iRight = aX + aWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   479
	iBottom = aY + aHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   480
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   481
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   482
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   483
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   484
void VKRect::Draw(HDC aHdc,COLORREF aColor) const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   485
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   486
	HPEN pen;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   487
	pen=CreatePen(PS_SOLID, 2, aColor);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   488
	SelectObject(aHdc, pen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   489
	POINT point;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   490
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   491
	MoveToEx(aHdc, (int)iLeft, (int)iTop, &point);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   492
	LineTo(aHdc, (int)iLeft, (int)iBottom);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   493
	LineTo(aHdc, (int)iRight, (int)iBottom);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   494
	LineTo(aHdc, (int)iRight, (int)iTop);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   495
	LineTo(aHdc, (int)iLeft, (int)iTop);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   496
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   497
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   498
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   499
KeyCombination::KeyCombination(const TInt aCommandData, TEmulCommand aCommand):
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   500
	iData(aCommandData),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   501
	iCommand(aCommand)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   502
{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   503
	for (TInt i=0;i<KMaxHotKeyCombinationLength;i++) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   504
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   505
		iCombination[i]=EStdKeyNull;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   506
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   507
}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   508
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   509
TBool KeyCombination::CheckCombinationPressed()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   510
{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   511
	for (TInt j=0;(j<KMaxHotKeyCombinationLength && iCombination[j]!=0);j++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   512
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   513
		if (GetAsyncKeyState(MapVirtualKey(iCombination[j],1))>=0)//if at least one key is not pressed, we return false
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   514
			return EFalse;				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   515
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   516
	return ETrue;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   517
}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   518
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   519
TBool KeyCombination::AddKey(TStdScanCode aKey)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   520
{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   521
	TInt i;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   522
	for (i=0;i<KMaxHotKeyCombinationLength;i++) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   523
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   524
		if (iCombination[i]==EStdKeyNull) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   525
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   526
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   527
	if (KMaxHotKeyCombinationLength==i)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   528
		return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   529
	else		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   530
		iCombination[i]=aKey;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   531
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   532
	return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   533
}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   534
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   535
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   536
DScreenProperties::DScreenProperties()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   537
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   538
	memset(this,0,sizeof(DScreenProperties));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   539
	iColorDepth=KDefaultColorDepth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   540
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   541
	iViewport = TViewport(this);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   542
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   543
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   544
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   545
LOCAL_C TInt MaskGceOnly(TInt aModeBits)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   546
	{	   //All HAL modes are now reported. The GCE may refuse to register the surfaces.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   547
	return aModeBits&KEmulModes;	//previous useful settings: //(KEmulPixPerLong2|KEmulPixPerLong1);	//|KEmulPixPerLong4;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   548
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   549
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   550
LOCAL_C TInt BitsForSingleMode(TInt aModeColor)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   551
	{	//only 1 bit should be set in aModeColor
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   552
	switch (aModeColor)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   553
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   554
		case KEmulGray2:	return 1;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   555
		case KEmulGray4:	return 2;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   556
		case KEmulGray16:	return 4;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   557
		case KEmulGray256:	return 8;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   558
		case KEmulColor16:	return 4;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   559
		case KEmulColor256:	return 8;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   560
		case KEmulColor4K:	return 12;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   561
		case KEmulColor64K:	return 16;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   562
		case KEmulColor16M:	return 24;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   563
		default:	return 32;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   564
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   565
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   566
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   567
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   568
DScreenProperties::~DScreenProperties() 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   569
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   570
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   571
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   572
TWindowState DScreenProperties::GetWindowState()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   573
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   574
	TWindowState state;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   575
	state.iWinPlace = iWinPlace;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   576
	state.iFlipstate = iScreenRotation;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   577
	state.iXoffset = iViewport.GetViewportOffsetX();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   578
	state.iYoffset = iViewport.GetViewportOffsetY();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   579
	return state;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   580
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   581
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   582
TInt DScreenProperties::SetupProperties(TInt aConf, TInt aScreen)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   583
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   584
	char property[50];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   585
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   586
	// Calculate maximum dimensions
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   587
	TInt configurations = Property::GetInt("ConfigCount", 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   588
	if (configurations == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   589
		return KErrGeneral;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   590
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   591
	TInt count, screenWidth, screenHeight, physicalScreenWidth, physicalScreenHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   592
	for (count = 0; count < configurations; ++count)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   593
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   594
		wsprintfA(property, "Configuration[%d][%d]ScreenWidth", count, aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   595
		screenWidth = Property::GetInt(property, KScreenWidth);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   596
		screenWidth = (screenWidth + 3) & ~3;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   597
		if (screenWidth > iMaxScreenWidth)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   598
			iMaxScreenWidth = screenWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   599
		wsprintfA(property, "Configuration[%d][%d]ScreenHeight", count, aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   600
		screenHeight = Property::GetInt(property, KScreenHeight);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   601
		screenHeight = (screenHeight + 3) & ~3;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   602
		if (screenHeight > iMaxScreenHeight)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   603
			iMaxScreenHeight = screenHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   604
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   605
		wsprintfA(property, "Configuration[%d][%d]PhysicalScreenWidth", count, aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   606
		physicalScreenWidth = Property::GetInt(property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   607
		if (physicalScreenWidth > iMaxPhysicalScreenWidth)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   608
			iMaxPhysicalScreenWidth = physicalScreenWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   609
		wsprintfA(property, "Configuration[%d][%d]PhysicalScreenHeight", count, aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   610
		physicalScreenHeight = Property::GetInt(property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   611
		if (physicalScreenHeight > iMaxPhysicalScreenHeight)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   612
			iMaxPhysicalScreenHeight = physicalScreenHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   613
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   614
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   615
	// Read figures for current configuration
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   616
	TInt givenWidth, givenHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   617
	wsprintfA(property, "Configuration[%d][%d]ScreenWidth",aConf,aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   618
	givenWidth = Property::GetInt(property, KScreenWidth);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   619
	iScreenWidth = (givenWidth + 3) & ~3;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   620
	wsprintfA(property, "Configuration[%d][%d]ScreenHeight",aConf,aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   621
	givenHeight = Property::GetInt(property, KScreenHeight);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   622
	iScreenHeight = (givenHeight + 3) & ~3;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   623
	// Width of screen should be multiple number of 4 pixels.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   624
	if (givenWidth & 3 || givenHeight & 3)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   625
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   626
		Kern::Printf("Width and Height of Screen should be multiple number of 4 pixels.\n"
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   627
				"\tWidth of screen[%d] set to: %d\n\tHeight of screen[%d] set to: %d", 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   628
				aScreen, iScreenWidth, aScreen, iScreenHeight);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   629
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   630
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   631
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   632
	wsprintfA(property, "Configuration[%d][%d]PhysicalScreenWidth",aConf,aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   633
	iPhysicalScreenWidth = Property::GetInt(property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   634
	wsprintfA(property, "Configuration[%d][%d]PhysicalScreenHeight",aConf,aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   635
	iPhysicalScreenHeight = Property::GetInt(property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   636
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   637
	wsprintfA(property, "Configuration[%d][%d]ScreenOffsetX",aConf,aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   638
	iScreenOffsetX = Property::GetInt(property, KScreenOffsetX);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   639
	wsprintfA(property, "Configuration[%d][%d]ScreenOffsetY",aConf,aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   640
	iScreenOffsetY = Property::GetInt(property, KScreenOffsetY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   641
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   642
	wsprintfA(property, "Configuration[%d][%d]CompositionBuffers",aConf,aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   643
	iCompositionBuffers = Property::GetInt(property, KCompositionBuffers);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   644
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   645
	wsprintfA(property, "Configuration[%d][%d]RefreshRateHz",aConf,aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   646
	iRefreshRateHz = Property::GetInt(property, KRefreshRateHz);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   647
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   648
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   649
	wsprintfA(property, "Configuration[%d][%d]ColorDepth",aConf,aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   650
	const char* colors = Property::GetString(property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   651
	if (colors)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   652
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   653
		TUint colorDepth=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   654
		const char* end = colors;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   655
		for (;;)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   656
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   657
			const char* beg = skipws(end);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   658
			if(*beg==';')
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   659
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   660
			if (!*beg)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   661
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   662
			end	= skiptok(beg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   663
			if (_strnicmp("Gray2",beg,end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   664
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   665
				colorDepth|=KEmulGray2|KEmulIsBitMask;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   666
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   667
			else if (_strnicmp("Gray4",beg,end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   668
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   669
				colorDepth|=KEmulGray4|KEmulIsBitMask;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   670
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   671
			else if (_strnicmp("Gray16",beg,end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   672
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   673
				colorDepth|=KEmulGray16|KEmulIsBitMask;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   674
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   675
			else if (_strnicmp("Gray256",beg,end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   676
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   677
				colorDepth|=KEmulGray256|KEmulIsBitMask;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   678
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   679
			else if (_strnicmp("Color16",beg,end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   680
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   681
				colorDepth|=KEmulColor16|KEmulIsBitMask;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   682
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   683
			else if (_strnicmp("Color256",beg,end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   684
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   685
				colorDepth|=KEmulColor256|KEmulIsBitMask;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   686
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   687
			else if (_strnicmp("Color4K",beg,end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   688
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   689
				colorDepth|=KEmulColor4K|KEmulIsBitMask;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   690
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   691
			else if (_strnicmp("Color64K",beg,end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   692
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   693
				colorDepth|=KEmulColor64K|KEmulIsBitMask;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   694
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   695
			else if (_strnicmp("Color16M",beg,end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   696
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   697
				colorDepth|=KEmulColor16M|KEmulIsBitMask;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   698
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   699
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   700
				return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   701
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   702
		iColorDepth = colorDepth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   703
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   704
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   705
	//multiple mode support is currently only for GCE. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   706
	//I fill this array in before knowing if GCE will be instanced.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   707
	if (iColorDepth&KEmulIsBitMask)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   708
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   709
		//iModeDepths is only used by GCE
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   710
		TInt colorDepth=MaskGceOnly(iColorDepth);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   711
		TInt setMode=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   712
		for (TInt i=1;i!=KEmulIsBitMask;i+=i)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   713
			if (colorDepth&i)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   714
				iModeDepths[setMode++]=BitsForSingleMode(i);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   715
		iMaxModes= setMode;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   716
		iModeDepths[setMode++]=0;	//a bit width of 0 is illegal	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   717
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   718
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   719
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   720
		iModeDepths[0]=iColorDepth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   721
		iMaxModes=1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   722
		iModeDepths[1]=0;	//a bit width of 0 is illegal
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   723
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   724
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   725
	wsprintfA(property, "Configuration[%d][%d]FasciaBitmap",aConf,aScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   726
	const char* fascia = Property::GetString(property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   727
	if (fascia)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   728
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   729
		TInt len = strlen(fascia);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   730
		//the path may have quotes at the start and end
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   731
		//need to work out if this is an absolute or relative path
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   732
		if (fascia[0] == '\"')
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   733
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   734
			++fascia;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   735
			--len;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   736
			if (--len > 0 && fascia[len-1] == '\"')
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   737
				--len;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   738
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   739
		char* p = iFasciaFileName;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   740
		if (fascia[0] != '\\' && (len < 3 || fascia[1] != ':'))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   741
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   742
			//relative path
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   743
			strcpy(p, Property::GetString("EmulatorDataPath"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   744
			p += strlen(p);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   745
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   746
		memcpy(p, fascia, len);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   747
		p[len] = '\0';
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   748
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   749
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   750
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   751
		// default to machine name
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   752
		strcpy(iFasciaFileName, Property::GetString("EmulatorDataPath"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   753
		strcat(iFasciaFileName, Property::GetString("MachineName"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   754
		strcat(iFasciaFileName, ".bmp");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   755
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   756
	return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   757
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   758
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   759
TViewport::TViewport() 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   760
	:iScreenProps(NULL),iViewportWidth(0), iViewportHeight(0), iViewportOffsetX(0), iViewportOffsetY(0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   761
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   762
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   763
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   764
TViewport::TViewport(DScreenProperties* aScreenProps)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   765
	:iScreenProps(aScreenProps),iViewportWidth(0), iViewportHeight(0), iViewportOffsetX(0), iViewportOffsetY(0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   766
	{	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   767
	}	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   768
TViewport::~TViewport()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   769
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   770
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   771
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   772
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   773
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   774
Changes the logical position of the viewport within the input area
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   775
of the emulator screen. The method may adjust the position so that
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   776
the viewport stays within the input area.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   777
@param aPosition The new Y position of the top left hand corner of the viewport.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   778
@param aHwnd The window associated with the viewport
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   779
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   780
void TViewport::ScrollToY(TInt aPosition, HWND aHwnd)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   781
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   782
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   783
	SCROLLINFO scrollinfo;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   784
	scrollinfo.cbSize=sizeof(scrollinfo);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   785
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   786
	//save for later
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   787
	scrollinfo.fMask=SIF_POS;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   788
	GetScrollInfo(aHwnd, SB_VERT, &scrollinfo);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   789
	TInt oldY=scrollinfo.nPos;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   790
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   791
	if(aPosition<0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   792
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   793
		scrollinfo.nPos = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   794
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   795
	else if( (aPosition+GetViewportHeight())>GetMaxHeight())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   796
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   797
		scrollinfo.nPos = max(0,GetMaxHeight() - GetViewportHeight() );
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   798
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   799
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   800
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   801
		scrollinfo.nPos=aPosition;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   802
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   803
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   804
	SetViewportOffsetY(scrollinfo.nPos);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   805
	scrollinfo.fMask=SIF_POS;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   806
	SetScrollInfo(aHwnd,SB_VERT, &scrollinfo, TRUE );
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   807
	ScrollWindowEx(aHwnd, 0, oldY-scrollinfo.nPos, 0, 0, NULL, NULL, SW_INVALIDATE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   808
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   809
	UpdateChildPos(aHwnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   810
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   811
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   812
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   813
As for ScrollToY but for the X direction
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   814
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   815
void TViewport::ScrollToX(TInt aPosition, HWND aHwnd)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   816
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   817
	SCROLLINFO scrollinfo;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   818
	scrollinfo.cbSize=sizeof(scrollinfo);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   819
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   820
	//save for later
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   821
	scrollinfo.fMask=SIF_POS;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   822
	GetScrollInfo(aHwnd, SB_HORZ, &scrollinfo);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   823
	TInt oldX=scrollinfo.nPos;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   824
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   825
	if(aPosition<0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   826
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   827
		scrollinfo.nPos = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   828
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   829
	else if( (aPosition+GetViewportWidth())>GetMaxWidth())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   830
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   831
		scrollinfo.nPos = max(0,GetMaxWidth() - GetViewportWidth() );
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   832
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   833
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   834
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   835
		scrollinfo.nPos=aPosition;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   836
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   837
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   838
	SetViewportOffsetX(scrollinfo.nPos);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   839
	scrollinfo.fMask=SIF_POS;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   840
	SetScrollInfo(aHwnd,SB_HORZ, &scrollinfo, TRUE );
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   841
	ScrollWindowEx(aHwnd, oldX-scrollinfo.nPos, 0, 0, 0, NULL, NULL, SW_INVALIDATE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   842
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   843
	UpdateChildPos(aHwnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   844
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   845
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   846
//Forward declaration
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   847
LOCAL_C TInt ScreenFromHWND(HWND aHwnd,HWND* pWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   848
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   849
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   850
Move the child window to it's correct position.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   851
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   852
@param aHwnd The HWND of the parent window
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   853
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   854
void TViewport::UpdateChildPos(HWND aHwnd)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   855
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   856
	TInt screenNumber = ::ScreenFromHWND(aHwnd,TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   857
	HWND childWin = TheChildWin[screenNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   858
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   859
	switch (iScreenProps->iScreenRotation)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   860
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   861
		case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   862
			MoveWindow(
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   863
				childWin,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   864
				iScreenProps->iScreenOffsetX - GetViewportOffsetX(),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   865
				iScreenProps->iScreenOffsetY - GetViewportOffsetY(),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   866
				iScreenProps->iScreenWidth,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   867
				iScreenProps->iScreenHeight,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   868
				TRUE
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   869
				);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   870
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   871
		case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   872
			MoveWindow(
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   873
				childWin,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   874
				iScreenProps->iXYInputWidth-(iScreenProps->iScreenOffsetX+iScreenProps->iScreenWidth) - GetViewportOffsetX(),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   875
				iScreenProps->iXYInputHeight-(iScreenProps->iScreenOffsetY+iScreenProps->iScreenHeight) - GetViewportOffsetY(),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   876
				iScreenProps->iScreenWidth,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   877
				iScreenProps->iScreenHeight,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   878
				TRUE
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   879
				);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   880
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   881
		case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   882
			MoveWindow(
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   883
				childWin,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   884
				iScreenProps->iScreenOffsetY - GetViewportOffsetX(),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   885
				iScreenProps->iXYInputWidth-(iScreenProps->iScreenOffsetX+iScreenProps->iScreenWidth)- GetViewportOffsetY(),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   886
				iScreenProps->iScreenHeight,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   887
				iScreenProps->iScreenWidth,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   888
				TRUE
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   889
				);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   890
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   891
		case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   892
			MoveWindow(
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   893
				childWin,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   894
				iScreenProps->iXYInputHeight-(iScreenProps->iScreenOffsetY+iScreenProps->iScreenHeight) - GetViewportOffsetX(),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   895
				iScreenProps->iScreenOffsetX - GetViewportOffsetY(),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   896
				iScreenProps->iScreenHeight,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   897
				iScreenProps->iScreenWidth,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   898
				TRUE
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   899
				);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   900
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   901
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   902
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   903
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   904
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   905
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   906
Update the range of the horizontal scrollbar,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   907
to take account of the current viewport width.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   908
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   909
@param aHwnd The window to be updated
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   910
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   911
void TViewport::UpdateScrollBarH(HWND aHwnd)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   912
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   913
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   914
	SCROLLINFO scrollinfoHor;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   915
	scrollinfoHor.cbSize=sizeof(scrollinfoHor);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   916
	scrollinfoHor.fMask=SIF_RANGE|SIF_PAGE;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   917
	scrollinfoHor.nMin=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   918
	scrollinfoHor.nMax= GetMaxWidth()-1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   919
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   920
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   921
	TInt newPage = GetViewportWidth() ;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   922
	TBool redraw=EFalse; //redraw window if a resize has caused a scrollbar to disappear and reveal image.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   923
	if ( newPage>= scrollinfoHor.nMax -GetSystemMetrics(SM_CXVSCROLL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   924
		&& newPage < scrollinfoHor.nMax+1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   925
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   926
		redraw=ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   927
		newPage=GetMaxWidth();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   928
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   929
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   930
	scrollinfoHor.nPage= newPage;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   931
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   932
	SetScrollInfo(aHwnd,SB_HORZ, &scrollinfoHor, TRUE );
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   933
	if(redraw)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   934
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   935
		ScrollToX(0, aHwnd); //in case egde of fascia was against edge of vertical scrollbar
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   936
		InvalidateRect(aHwnd, NULL, TRUE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   937
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   938
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   939
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   940
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   941
Update the range of the vertical scrollbar,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   942
to take account of the current viewport width.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   943
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   944
@param aHwnd The window to be updated
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   945
*/	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   946
void TViewport::UpdateScrollBarV(HWND aHwnd)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   947
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   948
	SCROLLINFO scrollinfoVer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   949
	scrollinfoVer.cbSize=sizeof(scrollinfoVer);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   950
	scrollinfoVer.fMask=SIF_RANGE|SIF_PAGE;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   951
	scrollinfoVer.nMin=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   952
	scrollinfoVer.nMax= GetMaxHeight()-1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   953
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   954
	TInt newPage = GetViewportHeight() ;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   955
	TBool redraw=EFalse; //redraw window if a resize has caused a scrollbar to disappear and reveal image.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   956
	if ( newPage>= scrollinfoVer.nMax -GetSystemMetrics(SM_CYHSCROLL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   957
		&& newPage < scrollinfoVer.nMax+1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   958
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   959
		redraw=ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   960
		newPage=GetMaxHeight();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   961
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   962
	scrollinfoVer.nPage= newPage;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   963
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   964
	SetScrollInfo(aHwnd,SB_VERT, &scrollinfoVer, TRUE );
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   965
	if(redraw)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   966
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   967
		ScrollToY(0, aHwnd); //in case egde of fascia was against edge of vertical scrollbar
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   968
		InvalidateRect(aHwnd, NULL, TRUE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   969
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   970
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   971
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   972
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   973
Returns the max width for the viewport window (non-client area) so that it
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   974
may be bounded. Takes account of scrollbar.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   975
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   976
@return Max width
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   977
*/	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   978
TInt TViewport::GetMaxWindowWidth() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   979
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   980
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   981
	RECT rect = {0,0,0,0};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   982
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   983
	switch(iScreenProps->iScreenRotation)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   984
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   985
		case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   986
		case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   987
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   988
			rect.right=iScreenProps->iXYInputWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   989
			rect.bottom=iScreenProps->iXYInputHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   990
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   991
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   992
		case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   993
		case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   994
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   995
			rect.right=iScreenProps->iXYInputHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   996
			rect.bottom=iScreenProps->iXYInputWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   997
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   998
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
   999
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1000
	AdjustWindowRect(//take account of window decorations
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1001
		&rect,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1002
		KWinStyle,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1003
		FALSE
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1004
		);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1005
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1006
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1007
	return (rect.right-rect.left);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1008
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1009
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1010
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1011
Returns the max height for the viewport window (non-client area) so that it
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1012
may be bounded. Takes account of scrollbar.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1013
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1014
@return Max height
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1015
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1016
TInt TViewport::GetMaxWindowHeight() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1017
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1018
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1019
	RECT rect ={0,0,0,0};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1020
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1021
	switch(iScreenProps->iScreenRotation)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1022
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1023
		case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1024
		case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1025
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1026
			rect.right=iScreenProps->iXYInputWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1027
			rect.bottom=iScreenProps->iXYInputHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1028
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1029
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1030
		case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1031
		case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1032
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1033
			rect.right=iScreenProps->iXYInputHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1034
			rect.bottom=iScreenProps->iXYInputWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1035
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1036
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1037
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1038
	AdjustWindowRect(//take account of window decorations
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1039
		&rect,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1040
		KWinStyle,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1041
		FALSE
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1042
		);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1043
	return (rect.bottom-rect.top);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1044
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1045
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1046
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1047
Returns the maximum width for the viewport (client area only).
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1048
Allowing for the orientation of the emulator.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1049
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1050
@return Max width
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1051
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1052
TInt TViewport::GetMaxWidth() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1053
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1054
	TInt width=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1055
	switch(iScreenProps->iScreenRotation)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1056
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1057
		case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1058
		case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1059
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1060
			width = iScreenProps->iXYInputWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1061
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1062
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1063
		case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1064
		case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1065
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1066
			width = iScreenProps->iXYInputHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1067
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1068
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1069
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1070
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1071
	return width;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1072
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1073
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1074
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1075
Returns the maximum height for the viewport (client area only).
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1076
Allowing for the orientation of the emulator.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1077
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1078
@return Max height
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1079
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1080
TInt TViewport::GetMaxHeight() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1081
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1082
	TInt height=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1083
	switch(iScreenProps->iScreenRotation)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1084
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1085
		case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1086
		case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1087
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1088
			height = iScreenProps->iXYInputHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1089
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1090
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1091
		case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1092
		case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1093
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1094
			height =  iScreenProps->iXYInputWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1095
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1096
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1097
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1098
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1099
	return height;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1100
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1101
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1102
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1103
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1104
Sets the X offset of the viewport from the edge of the input area
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1105
@param aOffset The X offset
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1106
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1107
void TViewport::SetViewportOffsetX(TInt aOffset)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1108
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1109
	iViewportOffsetX = aOffset;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1110
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1111
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1112
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1113
Sets the Y offset of the viewport from the edge of the input area
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1114
@param aOffset The Y offset
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1115
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1116
void TViewport::SetViewportOffsetY(TInt aOffset)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1117
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1118
	iViewportOffsetY = aOffset;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1119
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1120
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1121
TInt TViewport::GetViewportOffsetX() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1122
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1123
	return iViewportOffsetX;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1124
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1125
TInt TViewport::GetViewportOffsetY() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1126
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1127
	return iViewportOffsetY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1128
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1129
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1130
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1131
Sets the viewport width, this is equal to the width
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1132
of the window's client area
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1133
@param aWidth The width
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1134
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1135
void TViewport::SetViewportWidth(TInt aWidth)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1136
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1137
	iViewportWidth=aWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1138
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1139
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1140
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1141
Sets the viewport height, this is equal to the height
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1142
of the window's client area
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1143
@param aHeight The height
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1144
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1145
void TViewport::SetViewportHeight(TInt aHeight)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1146
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1147
	iViewportHeight=aHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1148
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1149
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1150
TInt TViewport::GetViewportWidth() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1151
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1152
	return iViewportWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1153
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1154
TInt TViewport::GetViewportHeight() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1155
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1156
	return iViewportHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1157
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1158
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1159
// the UI class
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1160
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1161
DWinsUi::DWinsUi()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1162
	:iVirtualKeys(10),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1163
	iControlHotKeys(10)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1164
	{}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1165
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1166
/// Returns the current mode's depth. Remember current mode is never set!
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1167
TUint DWinsUi::ColorDepth(TInt aScreenNumber)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1168
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1169
	TVideoInfoV01 info;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1170
	VideoInfo(aScreenNumber, info);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1171
	return info.iBitsPerPixel;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1172
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1173
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1174
TInt DWinsUi::SetFlip(TEmulatorFlip aFlip, TInt aScreenNumber)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1175
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1176
	if(TUint(aScreenNumber)>=TUint(systemIni->iScreens.Count()))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1177
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1178
	int r1 = PostMessageA(TheChildWin[aScreenNumber],WM_FLIP_MESSAGE,(TUint)aFlip,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1179
	return r1 ? KErrNone : KErrGeneral;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1180
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1181
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1182
void DWinsUi::Info(TVariantInfoV01& aInfo)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1183
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1184
	aInfo.iLedCapabilities=0x3;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1185
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1186
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1187
HWND DWinsUi::HWnd()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1188
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1189
	return TheControlWin;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1190
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1191
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1192
TInt DWinsUi::SetupProperties(TInt aId)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1193
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1194
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1195
// load UI settings from the emulator properties
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1196
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1197
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1198
	//setup the screens
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1199
	TInt screens = Property::GetInt("[screens]", 1);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1200
 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1201
 	for (TInt x = 0; x < screens; ++x)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1202
 		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1203
 		DScreenProperties * pScr = new DScreenProperties();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1204
 		if (!pScr)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1205
 			return KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1206
 		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1207
 		TInt ret = pScr->SetupProperties(aId,x);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1208
 		if (KErrNone == ret)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1209
 			ret = iScreens.Append(pScr);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1210
 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1211
 		if (KErrNone != ret)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1212
 			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1213
 			delete pScr;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1214
 			return ret;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1215
 			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1216
 		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1217
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1218
	char property[50];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1219
	wsprintfA(property, "Configuration[%d]LedSize",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1220
	iLedSize = Property::GetInt(property, KLedSize);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1221
	wsprintfA(property, "Configuration[%d]LedArrangeVertically",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1222
	iLedVertical = Property::GetBool(property, KLedVertical);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1223
	wsprintfA(property, "Configuration[%d]LedArrangeHorizontally",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1224
	if (Property::GetBool(property))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1225
		iLedVertical = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1226
	wsprintfA(property, "Configuration[%d]LedOffsetX",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1227
	iLedOffsetX = Property::GetInt(property, KLedLeft);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1228
	wsprintfA(property, "Configuration[%d]LedOffsetY",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1229
	iLedOffsetY = Property::GetInt(property, KLedTop);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1230
	wsprintfA(property, "Configuration[%d]LedGap",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1231
	iLedGap = Property::GetInt(property, KLedGap);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1232
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1233
	wsprintfA(property, "Configuration[%d]PointerType",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1234
	const char* pointer = Property::GetString(property, "Pen");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1235
	if (_stricmp(pointer, "None") == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1236
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1237
		iPointerType=_S8("NONE");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1238
		iXYInputType=EXYInputNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1239
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1240
	else if (_stricmp(pointer,"Pen") == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1241
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1242
		iPointerType=_S8("PEN");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1243
		iXYInputType=EXYInputPointer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1244
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1245
	else if (_stricmp(pointer,"Mouse") == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1246
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1247
		iPointerType=_S8("MOUSE");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1248
		iXYInputType=EXYInputMouse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1249
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1250
	else if (_stricmp(pointer,"Delta-Mouse") == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1251
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1252
		iPointerType=_S8("MOUSE");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1253
		iXYInputType=EXYInputDeltaMouse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1254
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1255
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1256
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1257
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1258
	wsprintfA(property, "Configuration[%d]DigitizerOffsetX",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1259
	iDigitizerOffsetX = Property::GetInt(property, -iScreens[0]->iScreenOffsetX);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1260
	wsprintfA(property, "Configuration[%d]DigitizerOffsetY",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1261
	iDigitizerOffsetY = Property::GetInt(property, -iScreens[0]->iScreenOffsetY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1262
	wsprintfA(property, "Configuration[%d]DigitizerWidth",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1263
	iDigitizerWidth = Property::GetInt(property,-1);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1264
	wsprintfA(property, "Configuration[%d]DigitizerHeight",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1265
	iDigitizerHeight = Property::GetInt(property,-1);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1266
	wsprintfA(property, "Configuration[%d]DisableDigitizer",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1267
	iDigitizerEnabled = !Property::GetBool(property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1268
//	To enable the multitouch 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1269
	wsprintfA(property, "EnableMultiTouch");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1270
	iMultiTouchEnabled = Property::GetBool(property,EFalse);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1271
	wsprintfA(property, "SYMBIAN_BASE_USE_GCE");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1272
	iGCEEnabled = Property::GetBool(property,EFalse);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1273
	wsprintfA(property, "MultiTouchProximityStep");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1274
	iMultiTouchProximityStep = Property::GetInt(property,-1);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1275
	wsprintfA(property, "MultiTouchPressureStep");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1276
	iMultiTouchPressureStep = Property::GetInt(property,-1);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1277
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1278
	strcpy(iSysIniFileName, Property::GetString("EmulatorDataPath"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1279
	strcat(iSysIniFileName, "emulator\\");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1280
	if (!Emulator::CreateAllDirectories(iSysIniFileName))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1281
		return Emulator::LastError();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1282
	strcat(iSysIniFileName, Property::GetString("MachineName"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1283
	strcat(iSysIniFileName, ".sys.ini");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1284
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1285
	TInt r = iKeyboard.Init(aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1286
	if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1287
		return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1288
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1289
	wsprintfA(property, "Configuration[%d]VirtualKey",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1290
	r = MultiProperty(&DWinsUi::DoDefineVirtualKey, this, property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1291
	if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1292
		return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1293
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1294
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1295
	wsprintfA(property, "Configuration[%d]NoVersionInfo",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1296
	iDisplayVersionInfo = !Property::GetBool(property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1297
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1298
	wsprintfA(property, "Configuration[%d]WindowTitle",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1299
	const char * p = Property::GetString(property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1300
	if (p && (strlen(p) <= KMaxNameSize))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1301
		strcpy(iWindowTitle, p);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1302
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1303
		strcpy(iWindowTitle, DefaultWindowTitle);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1304
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1305
	if (iDisplayVersionInfo)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1306
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1307
		TInt wtLen = strlen(iWindowTitle);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1308
		TInt vtLen = strlen(VersionText);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1309
		if ((wtLen + vtLen) > KMaxNameSize)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1310
			iWindowTitle[KMaxNameSize-vtLen] = '\0';
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1311
		strcat(iWindowTitle, VersionText);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1312
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1313
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1314
	wsprintfA(property, "Configuration[%d]OnActivation",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1315
	pointer = Property::GetString(property);	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1316
	//example	OnActivation 270 EKeyScreenDimension1
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1317
	//params are rotation(int) and key(string)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1318
	if (pointer)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1319
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1320
		TInt i;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1321
		char * next;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1322
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1323
		//skip any white space
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1324
		const char* beg = skipws(pointer);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1325
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1326
		//get the number
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1327
		long rotation = strtol(beg, &next, 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1328
		if (next == beg)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1329
			return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1330
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1331
		switch (rotation)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1332
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1333
			case 0:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1334
				for (i = 0; i < screens; ++i)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1335
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1336
					iScreens[i]->iScreenRotation = EEmulatorFlipRestore;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1337
					iScreens[i]->iRotateBuffer = NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1338
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1339
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1340
			case 90:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1341
				for (i = 0; i < screens; ++i)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1342
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1343
					iScreens[i]->iScreenRotation = EEmulatorFlipRight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1344
					iScreens[i]->iRotateBuffer = (DWORD*)malloc(iScreens[i]->iScreenWidth*iScreens[i]->iScreenHeight*4);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1345
					if(!iScreens[i]->iRotateBuffer)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1346
						return KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1347
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1348
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1349
			case 180:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1350
				for (i = 0; i < screens; ++i)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1351
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1352
					iScreens[i]->iScreenRotation = EEmulatorFlipInvert;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1353
					iScreens[i]->iRotateBuffer = (DWORD*)malloc(iScreens[i]->iScreenWidth*iScreens[i]->iScreenHeight*4);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1354
					if(!iScreens[i]->iRotateBuffer)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1355
						return KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1356
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1357
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1358
			case 270:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1359
				for (i = 0; i < screens; ++i)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1360
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1361
					iScreens[i]->iScreenRotation = EEmulatorFlipLeft;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1362
					iScreens[i]->iRotateBuffer = (DWORD*)malloc(iScreens[i]->iScreenWidth*iScreens[i]->iScreenHeight*4);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1363
					if(!iScreens[i]->iRotateBuffer)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1364
						return KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1365
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1366
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1367
			default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1368
				r = KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1369
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1370
		if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1371
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1372
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1373
		iInitialFlipMsg = TStdScanCode(ESpecialKeyBase + iScreens[0]->iScreenRotation);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1374
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1375
		beg = skipws(next);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1376
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1377
		//beg should now point to the keycode
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1378
		TInt key = iKeyboard.GetEPOCKeyCode(TPtrC8((const TUint8*)beg, strlen(beg)));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1379
		if (key == KErrNotFound)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1380
			return key;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1381
		//Currently no use for key
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1382
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1383
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1384
	//EmulatorControl messages are a bit like virtual keys
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1385
	wsprintfA(property, "Configuration[%d]EmulatorControl",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1386
	r = MultiProperty(&DWinsUi::DoDefineEmulatorControl, this, property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1387
	if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1388
		return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1389
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1390
	wsprintfA(property, "Configuration[%d]EmulatorControlHotKey",aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1391
	r = MultiProperty(&DWinsUi::DoDefineEmulatorControlHotKey, this, property);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1392
	if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1393
		return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1394
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1395
	return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1396
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1397
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1398
TInt DWinsUi::NumberOfScreens()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1399
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1400
	return iScreens.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1401
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1402
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1403
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1404
Return the highest bit depth from an emulator mode mask.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1405
@param aModeMask	A bitwise combination of KEmul... display mode mask values.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1406
@return A color depth in bits per pixel.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1407
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1408
LOCAL_C TInt MaximumBitDepthFromMask(TInt aModeMask)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1409
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1410
	// Choose the highest bits per pixel based on the display mode mask.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1411
	if (aModeMask & KEmulColor16M)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1412
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1413
		return 24;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1414
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1415
	if (aModeMask & KEmulColor64K)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1416
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1417
		return 16;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1418
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1419
	if (aModeMask & KEmulColor4K)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1420
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1421
		return 12;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1422
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1423
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1424
	// Lower bit depths are not supported, so use the default
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1425
	return 24;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1426
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1427
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1428
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1429
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1430
Return the TDisplayRotation corresponding to the given TEmulatorFlip.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1431
@param aFlip	A screen rotation as a TEmulatorFlip.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1432
@return The screen rotation as a TDisplayRotation.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1433
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1434
LOCAL_C RDisplayChannel::TDisplayRotation FlipToDisplayRotation(TEmulatorFlip aFlip)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1435
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1436
	switch (aFlip)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1437
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1438
		case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1439
			return RDisplayChannel::ERotation90CW;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1440
		case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1441
			return RDisplayChannel::ERotation180;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1442
		case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1443
			return RDisplayChannel::ERotation270CW;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1444
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1445
	return RDisplayChannel::ERotationNormal;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1446
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1447
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1448
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1449
TInt DWinsUi::SetDisplayChannel(TInt aScreenNumber, DDisplayChannel* aDisplay)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1450
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1451
	return systemIni->SetDisplayChannelImpl(aScreenNumber,aDisplay);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1452
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1453
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1454
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1455
TInt DWinsUi::SetDisplayChannelImpl(TInt aScreenNumber, DDisplayChannel* aDisplay)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1456
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1457
	if (TUint(aScreenNumber) >= TUint(NumberOfScreens()))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1458
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1459
		// Screen number is either negative or too big.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1460
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1461
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1462
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1463
	TInt r = KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1464
	HWND hWnd = TheChildWin[aScreenNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1465
	TBufferSet& buffer = masterIni->iBufferSet[aScreenNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1466
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1467
	if (aDisplay)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1468
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1469
		// Display driver connecting
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1470
		DScreenProperties* screen = iScreens[aScreenNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1471
		RDisplayChannel::TDisplayInfo info;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1472
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1473
		TInt pixelBytes = 2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1474
		info.iBitsPerPixel = MaximumBitDepthFromMask(screen->iColorDepth);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1475
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1476
		switch (info.iBitsPerPixel)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1477
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1478
			case 12:	// XRGB4444
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1479
				info.iPixelFormat = EUidPixelFormatXRGB_4444;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1480
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1481
			case 16:	// RGB565
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1482
				info.iPixelFormat = EUidPixelFormatRGB_565;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1483
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1484
			default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1485
				// Force anything else to packed RGB888
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1486
				pixelBytes = 4;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1487
				info.iBitsPerPixel = 24;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1488
				info.iPixelFormat = EUidPixelFormatXRGB_8888;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1489
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1490
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1491
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1492
		TInt width = screen->iMaxScreenWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1493
		TInt height = screen->iMaxScreenHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1494
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1495
		info.iRefreshRateHz = screen->iRefreshRateHz;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1496
		info.iAvailableRotations = RDisplayChannel::ERotationNormal | RDisplayChannel::ERotation90CW |
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1497
									RDisplayChannel::ERotation180 | RDisplayChannel::ERotation270CW;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1498
		info.iNormal.iWidth = width;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1499
		info.iNormal.iHeight = height;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1500
		// Windows requires rounding up to 4-bytes words
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1501
		info.iNormal.iOffsetBetweenLines = _ALIGN_UP(width * pixelBytes, 4);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1502
		info.iFlipped.iWidth = height;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1503
		info.iFlipped.iHeight = width;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1504
		// Windows requires rounding up to 4-bytes words
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1505
		info.iFlipped.iOffsetBetweenLines = _ALIGN_UP(height * pixelBytes, 4);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1506
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1507
		TInt maxSize=0;	 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1508
		//ensure legacy buffer is large enough for all supported modes.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1509
		//It would be a very strange setup for the max size to not be the max bpp,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1510
		//but we don't know which mode is max bpp anyway!
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1511
		TVideoInfoV01 videoInfo;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1512
		for (TInt mode=0,maxMode=screen->iMaxModes;mode<maxMode;mode++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1513
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1514
			if (systemIni->VideoInfoForDisplayDriver(aScreenNumber,mode, videoInfo))	//can't actually fail currently
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1515
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1516
				TInt dwSize=videoInfo.iOffsetToFirstPixel+videoInfo.iOffsetBetweenLines*videoInfo.iSizeInPixels.iHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1517
				if (dwSize>maxSize)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1518
					maxSize=dwSize;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1519
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1520
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1521
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1522
				Fault(EGuiVideoInfoUnavailable);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1523
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1524
			//rotated mode may use more RAM?? Height may be >Width or may not be a multiple of stride quantum
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1525
			if (systemIni->VideoInfoForDisplayDriver(aScreenNumber,mode|KModeFlagFlipped, videoInfo))	//can't actually fail currently
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1526
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1527
				TInt dwSize=videoInfo.iOffsetToFirstPixel+videoInfo.iOffsetBetweenLines*videoInfo.iSizeInPixels.iWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1528
				if (dwSize>maxSize)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1529
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1530
					maxSize=dwSize;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1531
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1532
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1533
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1534
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1535
				Fault(EGuiVideoInfoUnavailable);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1536
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1537
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1538
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1539
		masterIni->iMaxSizeInBytes = maxSize;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1540
		if (__e32_atomic_add_ord32(&buffer.iDisplayDriverCount, 1) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1541
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1542
			// First driver to connect, allocate frame buffers.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1543
			// +1 frame buffer is ui legacy buffer at [0], so does need to take account of stride and offset
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1544
			r = masterIni->AllocateFrameBuffers(aScreenNumber, screen->iCompositionBuffers + 1, maxSize);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1545
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1546
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1547
		if (r == KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1548
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1549
			buffer.iScreenBuffer.iDisplayBufferOffset = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1550
			masterIni->iBufferSet[aScreenNumber].iDisplayChannel = aDisplay;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1551
			masterIni->InitBitmapHeader(*screen, &buffer.iInfo);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1552
			masterIni->InitBufferFormat(*screen, buffer.iBufferFormat);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1553
			if(systemIni->VideoInfoForDisplayDriver(aScreenNumber,screen->iCurrentMode, videoInfo, ETrue))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1554
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1555
					r = aDisplay->Initialize(info,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1556
											 FlipToDisplayRotation(screen->iScreenRotation),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1557
											 hWnd, buffer.iScreenBuffer.iFrameBuffers,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1558
											 buffer.iScreenBuffer.iMemChunks,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1559
											 buffer.iDsaBuffer,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1560
						                     videoInfo.iSizeInPixels,videoInfo.iSizeInTwips,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1561
						                     masterIni->iSupportedPixelFormatTable,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1562
						                     masterIni->iSupportedPixelFormatTableSize,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1563
						                     buffer.iBufferFormat);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1564
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1565
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1566
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1567
				Fault(EGuiVideoInfoUnavailable);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1568
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1569
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1570
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1571
		if (r != KErrNone && __e32_atomic_tas_ord32(&buffer.iDisplayDriverCount, 1, -1, 0) == 1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1572
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1573
			// Release any that were allocated
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1574
			masterIni->ReleaseFrameBuffers(aScreenNumber);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1575
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1576
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1577
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1578
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1579
		// Display driver disconnected
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1580
		if (__e32_atomic_tas_ord32(&buffer.iDisplayDriverCount, 1, -1, 0) == 1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1581
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1582
			// All drivers disconnected, deallocate memory.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1583
			masterIni->ReleaseFrameBuffers(aScreenNumber);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1584
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1585
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1586
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1587
	return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1588
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1589
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1590
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1591
void DWinsUi::SetVirtualKey(const TBool aProcessing, const TInt aCommandData, const TEmulCommand aCommand)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1592
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1593
	iProcessingVirtualKey = aProcessing;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1594
	iFakedVirtualKey = aCommandData;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1595
	iVirtualKeyCommand = aCommand;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1596
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1597
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1598
TBool DWinsUi::WasVirtualKey(TInt& aCommandData, TEmulCommand& aCommand)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1599
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1600
	if (iProcessingVirtualKey)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1601
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1602
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1603
		aCommandData = iFakedVirtualKey;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1604
		aCommand = iVirtualKeyCommand;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1605
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1606
	return iProcessingVirtualKey;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1607
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1608
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1609
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1610
TInt DWinsUi::DoDefineEmulatorControl(TAny* aPtr, const char* aValue)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1611
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1612
	return static_cast<DWinsUi*>(aPtr)->DefineEmulatorControl(aValue);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1613
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1614
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1615
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1616
TInt DWinsUi::DefineEmulatorControl(const char* aValue)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1617
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1618
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1619
	//example EmulatorControl SelectConfig 2 rect 223,640 29,22
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1620
	//example EmulatorControl NextConfig rect 223,640 29,22
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1621
	const char* beg = skipws(aValue);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1622
	const char* end = skiptok(beg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1623
	TInt err = KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1624
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1625
	TEmulCommand command = ENoCommand;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1626
	TInt data = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1627
	if (_strnicmp(beg, "SelectConfig", end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1628
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1629
		//get the int param which is the config to switch to
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1630
		beg = end;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1631
		char * e;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1632
		data = strtol(beg, &e,0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1633
		if (beg == e)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1634
			err = KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1635
		end = e;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1636
		command = ESelectConfig;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1637
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1638
	else if(_strnicmp(beg, "NextConfig", end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1639
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1640
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1641
		command = ENextConfig;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1642
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1643
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1644
		err = KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1645
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1646
	if (err != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1647
		return err;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1648
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1649
	//get the shape
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1650
	beg = skipws(end);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1651
	end = skiptok(beg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1652
	if (end - beg != 4 || _strnicmp(beg, "rect", 4) != 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1653
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1654
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1655
	// get the parameters
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1656
	beg = skipws(end);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1657
	char* end2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1658
	TInt x = strtol(beg, &end2, 10);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1659
	if (beg == end2 || *end2++ != ',')
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1660
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1661
	beg = end2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1662
	TInt y = strtol(beg, &end2, 10);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1663
	if (beg == end2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1664
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1665
	beg = skipws(end2);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1666
	TInt w = strtol(beg, &end2, 10);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1667
	if (beg == end2 || *end2++ != ',')
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1668
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1669
	beg = end2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1670
	TInt h = strtol(beg, &end2, 10);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1671
	if (beg == end2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1672
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1673
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1674
	VKRect* pRect = new VKRect(data, command, x, y, w, h);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1675
	if (!pRect)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1676
		return KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1677
	return iVirtualKeys.Append(pRect);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1678
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1679
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1680
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1681
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1682
TInt DWinsUi::DoDefineVirtualKey(TAny* aPtr, const char* aValue)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1683
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1684
	return static_cast<DWinsUi*>(aPtr)->DefineVirtualKey(aValue);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1685
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1686
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1687
TInt DWinsUi::DefineVirtualKey(const char* aValue)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1688
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1689
	// Get the key to map
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1690
	const char* beg = skipws(aValue);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1691
	const char* end = skiptok(beg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1692
	TInt key = iKeyboard.GetEPOCKeyCode(TPtrC8((const TUint8*)beg, end-beg));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1693
	if (key == KErrNotFound)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1694
		return key;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1695
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1696
	//get the shape
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1697
	beg = skipws(end);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1698
	end = skiptok(beg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1699
	if (end - beg != 4 || _strnicmp(beg, "rect", 4) != 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1700
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1701
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1702
	// get the parameters
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1703
	beg = skipws(end);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1704
	char* end2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1705
	TInt x = strtol(beg, &end2, 10);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1706
	if (beg == end2 || *end2++ != ',')
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1707
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1708
	beg = end2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1709
	TInt y = strtol(beg, &end2, 10);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1710
	if (beg == end2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1711
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1712
	beg = skipws(end2);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1713
	TInt w = strtol(beg, &end2, 10);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1714
	if (beg == end2 || *end2++ != ',')
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1715
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1716
	beg = end2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1717
	TInt h = strtol(beg, &end2, 10);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1718
	if (beg == end2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1719
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1720
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1721
	VKRect* pRect = new VKRect(key, EKey, x, y, w, h);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1722
	if (!pRect)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1723
		return KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1724
	return iVirtualKeys.Append(pRect);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1725
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1726
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1727
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1728
LOCAL_C TInt readBitmapInfo(PBITMAPINFOHEADER aHeader, const char* aFileName)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1729
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1730
	PBITMAPFILEHEADER pbmfh=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1731
	PBITMAPINFOHEADER pbmih=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1732
	TInt bfOffBits;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1733
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1734
	HANDLE fh=CreateFileA(aFileName,GENERIC_READ,NULL,NULL,OPEN_EXISTING,NULL,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1735
	if (!fh || fh==INVALID_HANDLE_VALUE)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1736
		return KErrNotFound;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1737
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1738
	TInt r=KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1739
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1740
	// read in the bitmap file header.  save the offset to bits.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1741
	pbmfh = (PBITMAPFILEHEADER)LocalAlloc(LPTR, sizeof(BITMAPFILEHEADER));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1742
	if (pbmfh==NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1743
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1744
		r=KErrNotFound;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1745
        goto exit;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1746
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1747
	DWORD bytesRead;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1748
	ReadFile(fh, (LPVOID)pbmfh, sizeof(BITMAPFILEHEADER), &bytesRead, NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1749
	bfOffBits=pbmfh->bfOffBits;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1750
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1751
	// read in the bitmap info header and the color table right after it.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1752
	pbmih = (PBITMAPINFOHEADER)LocalAlloc(LPTR, bfOffBits- sizeof(BITMAPFILEHEADER));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1753
	if (pbmih==NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1754
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1755
		r=KErrNotFound;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1756
        goto exit;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1757
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1758
	ReadFile(fh, (LPVOID)pbmih, bfOffBits-sizeof(BITMAPFILEHEADER),&bytesRead,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1759
	*aHeader=*pbmih;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1760
exit:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1761
	LocalFree(LocalHandle ((LPSTR)pbmih));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1762
	LocalFree(LocalHandle ((LPSTR)pbmfh));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1763
	CloseHandle(fh);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1764
	return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1765
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1766
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1767
HBITMAP readBitmap(HDC aHdc, const char* aFileName)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1768
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1769
// reads a BMP file from disk and returns a HBITMAP
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1770
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1771
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1772
	HBITMAP hbm=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1773
	PBITMAPFILEHEADER pbmfh=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1774
	PBITMAPINFOHEADER pbmih=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1775
	TUint8 *pBits=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1776
	TInt bfOffBits;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1777
	TInt nbytes;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1778
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1779
	HANDLE fh=CreateFileA(aFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1780
	if (!fh || fh==INVALID_HANDLE_VALUE)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1781
		return NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1782
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1783
	nbytes=GetFileSize((HANDLE)fh, NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1784
	// read in the bitmap file header.  save the offset to bits.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1785
	pbmfh = (PBITMAPFILEHEADER)LocalAlloc(LPTR, sizeof(BITMAPFILEHEADER));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1786
	if (pbmfh==NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1787
        goto exit;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1788
	DWORD bytesRead;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1789
	ReadFile(fh, (LPVOID)pbmfh, sizeof(BITMAPFILEHEADER),&bytesRead,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1790
	bfOffBits=pbmfh->bfOffBits;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1791
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1792
	// read in the bitmap info header and the color table right after it.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1793
	pbmih = (PBITMAPINFOHEADER)LocalAlloc(LPTR, bfOffBits- sizeof(BITMAPFILEHEADER));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1794
	if (pbmih==NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1795
        goto exit;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1796
	ReadFile(fh, (LPVOID)pbmih, bfOffBits-sizeof(BITMAPFILEHEADER),&bytesRead,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1797
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1798
	// finally read in the bit data.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1799
	pBits = (PBYTE)LocalAlloc (LPTR, (nbytes - bfOffBits));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1800
	if (pBits==NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1801
        goto exit;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1802
	ReadFile(fh, (LPVOID)pBits, nbytes-bfOffBits,&bytesRead,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1803
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1804
	hbm=CreateDIBitmap(aHdc, pbmih, CBM_INIT, pBits,(PBITMAPINFO) pbmih, DIB_RGB_COLORS);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1805
exit:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1806
	LocalFree(LocalHandle ((LPSTR)pBits));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1807
	LocalFree(LocalHandle ((LPSTR)pbmih));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1808
	LocalFree(LocalHandle ((LPSTR)pbmfh));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1809
	CloseHandle(fh);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1810
	return hbm;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1811
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1812
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1813
void LoadFasciaBitmap(TInt aScreen)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1814
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1815
	HDC hdc=GetDC(TheWin[aScreen]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1816
	RECT windowRect = {0};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1817
	windowRect.right=systemIni->iScreens[aScreen]->iXYInputWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1818
	windowRect.bottom=systemIni->iScreens[aScreen]->iXYInputHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1819
	HBITMAP screenBitmap=readBitmap(hdc, systemIni->iScreens[aScreen]->iFasciaFileName);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1820
	if (screenBitmap==NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1821
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1822
		screenBitmap=CreateCompatibleBitmap(hdc, windowRect.right-windowRect.left, windowRect.bottom-windowRect.top);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1823
		HDC hdcMem=CreateCompatibleDC(hdc);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1824
		SelectObject(hdcMem, screenBitmap);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1825
		PatBlt(hdcMem, 0, 0, windowRect.right-windowRect.left, windowRect.bottom-windowRect.top, BLACKNESS);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1826
		DeleteDC(hdcMem);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1827
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1828
	__ASSERT_ALWAYS(screenBitmap!=NULL,Fault(EGuiCreateBitmap));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1829
	TheScreenBitmap[aScreen]=screenBitmap;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1830
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1831
	DrawLeds();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1832
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1833
	ReleaseDC(TheWin[aScreen], hdc);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1834
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1835
TBool DWinsUi::MultiTouchEnabled() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1836
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1837
	return iMultiTouchEnabled;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1838
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1839
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1840
TBool DWinsUi::GCEEnabled() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1841
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1842
	return iGCEEnabled;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1843
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1844
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1845
TInt DWinsUi::MultiTouchProximityStep() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1846
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1847
	return iMultiTouchProximityStep;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1848
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1849
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1850
TInt DWinsUi::MultiTouchPressureStep() const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1851
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1852
	return iMultiTouchPressureStep;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1853
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1854
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1855
TBool DWinsUi::OnDigitizer(TInt aX, TInt aY) const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1856
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1857
	if (!iDigitizerEnabled)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1858
		return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1859
	aX -= iDigitizerOffsetX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1860
	aY -= iDigitizerOffsetY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1861
	return (TUint(aX) < TUint(iDigitizerWidth) && TUint(aY) < TUint(iDigitizerHeight));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1862
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1863
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1864
LOCAL_C void addMouseEvent(TRawEvent::TType aType,TInt aXpos,TInt aYpos)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1865
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1866
// Add a mouse event.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1867
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1868
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1869
	if (systemIni->OnDigitizer(aXpos, aYpos))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1870
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1871
		TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1872
		v.Set(aType,aXpos,aYpos);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1873
		TheEventQ.Add(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1874
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1875
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1876
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1877
LOCAL_C void addMouseEvent(TRawEvent::TType aType,TInt aXpos,TInt aYpos,TInt aZpos, TInt aPointerId=0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1878
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1879
// Add a multitouch mouse event.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1880
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1881
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1882
	if (systemIni->OnDigitizer(aXpos, aYpos))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1883
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1884
		TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1885
		v.Set(aType,aXpos,aYpos, aZpos);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1886
		v.SetPointerNumber(static_cast<const TUint8>(aPointerId));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1887
		TheEventQ.Add(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1888
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1889
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1890
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1891
LOCAL_C void addKeyEvent(TRawEvent::TType aType,TInt aKey)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1892
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1893
	TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1894
	v.Set(aType, aKey);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1895
	TheEventQ.Add(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1896
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1897
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1898
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1899
LOCAL_C void SwitchConfiguration(TInt aData, TBool aSendFlipKey = ETrue)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1900
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1901
	if (aData < 0 || aData >= masterIni->iSystemInis.Count())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1902
		return;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1903
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1904
	CurrentConfiguration = aData;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1905
	systemIni = masterIni->iSystemInis[aData];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1906
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1907
	//get the correct fascia bitmaps
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1908
	TInt screens=systemIni->iScreens.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1909
	TInt i;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1910
	TUint disabledWinType=ENormalResolution;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1911
	for(i=0;i<screens;i++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1912
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1913
		DeleteObject(TheScreenBitmap[i]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1914
		LoadFasciaBitmap(i);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1915
		if (masterIni->iBufferSet[i].iDisplayState!=ENormalResolution)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1916
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1917
			disabledWinType=masterIni->iBufferSet[i].iDisplayState;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1918
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1919
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1920
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1921
	//update the window title
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1922
	if (disabledWinType!=ENormalResolution && disabledWinType < 4)	//hardwired 4 because the code below is hardwired
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1923
		{	//string may be multi-part indexed by disable type, or it may not
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1924
		CHAR* firstsemi=strchr(systemIni->iWindowTitle,';');
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1925
		CHAR* secondsemi=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1926
		if (firstsemi)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1927
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1928
			secondsemi=strchr(firstsemi+1,';');
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1929
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1930
		if (firstsemi&&secondsemi)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1931
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1932
			*firstsemi='\0';
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1933
			*secondsemi='\0';
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1934
			char* ptr[4]={0,systemIni->iWindowTitle,firstsemi+1,secondsemi+1};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1935
			SetWindowTextA(TheControlWin, ptr[disabledWinType]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1936
			*firstsemi=';';
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1937
			*secondsemi=';';
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1938
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1939
		else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1940
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1941
			SetWindowTextA(TheControlWin, systemIni->iWindowTitle);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1942
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1943
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1944
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1945
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1946
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1947
		SetWindowTextA(TheControlWin, systemIni->iWindowTitle);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1948
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1949
	//resize and repaint the current window anyway.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1950
	//the text window server doesn't respond to orientation messages
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1951
	for(i=0;i<screens;i++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1952
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1953
		InvalidateRect(TheWin[i], NULL, false);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1954
		SendMessage(TheWin[i], WM_FLIP_MESSAGE, systemIni->iScreens[i]->iScreenRotation,0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1955
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1956
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1957
	//Broadcast new orientation to Symbian OS
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1958
	if (aSendFlipKey)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1959
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1960
		if (!WinsGuiPowerHandler->iStandby)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1961
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1962
			addKeyEvent(TRawEvent::EKeyDown, systemIni->iInitialFlipMsg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1963
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1964
		else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1965
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1966
			//remember so we can broadcast new orientation to Symbian OS
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1967
			SavedFlipMessage = systemIni->iInitialFlipMsg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1968
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1969
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1970
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1971
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1972
Sets the specified screen to the given width and height, if available.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1973
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1974
The configurations are searched to find a match, taking the display state into
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1975
account. If no configuration is available, the request is ignored.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1976
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1977
@param aScreenNumber	the screen index
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1978
@param aWidth 			the desired width
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1979
@param aHeight			the desired height
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1980
**/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1981
void DMasterIni::SetDisplaySize(TInt aDisplayNumber, TInt aWidth, TInt aHeight)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1982
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1983
	TInt displayCount = iBufferSet.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1984
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1985
	if (aDisplayNumber < 0 || aDisplayNumber >= displayCount)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1986
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1987
		// Invalid screen number, discard.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1988
		return;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1989
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1990
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1991
	if (iBufferSet[aDisplayNumber].iDisplayState != ENormalResolution)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1992
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1993
		// No (non-zero) resolutions available, discard.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1994
		return;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1995
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1996
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1997
	TInt count = iSystemInis.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1998
	TInt index;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  1999
	for (index = 0; index < count; index++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2000
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2001
		DWinsUi* newIni = masterIni->iSystemInis[index];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2002
		DScreenProperties* newProps = newIni->iScreens[aDisplayNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2003
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2004
		if (newProps->iScreenWidth == aWidth && newProps->iScreenHeight == aHeight)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2005
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2006
			// Found a potential match. Check other screens match their current size.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2007
			if (newIni == systemIni)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2008
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2009
				// Current configuration, already in use. Nothing to do.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2010
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2011
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2012
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2013
			TInt display;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2014
			for (display = 0; display < displayCount; display++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2015
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2016
				if (display == aDisplayNumber)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2017
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2018
					// No need to check the display we are changing
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2019
					continue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2020
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2021
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2022
				DScreenProperties* currentPropsN = systemIni->iScreens[display];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2023
				DScreenProperties* newPropsN = newIni->iScreens[display];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2024
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2025
				if (newPropsN->iScreenWidth != currentPropsN->iScreenWidth ||
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2026
						newPropsN->iScreenHeight != currentPropsN->iScreenHeight)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2027
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2028
					// Resolution mismatch, try next configuration.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2029
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2030
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2031
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2032
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2033
			if (display == displayCount)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2034
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2035
				// Match found, switch to this configuration and stop. Force
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2036
				// rotation to the same as the current rotation.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2037
				newProps->iScreenRotation = systemIni->iScreens[aDisplayNumber]->iScreenRotation;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2038
				SwitchConfiguration(index);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2039
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2040
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2041
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2042
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2043
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2044
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2045
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2046
void DMasterIni::SetBufferFormat(TInt aDisplayNumber, TUint aAggregateSize, RDisplayChannel::TPixelFormat aPixelFormat)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2047
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2048
	TInt displayCount = iBufferSet.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2049
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2050
	if (aDisplayNumber < 0 || aDisplayNumber >= displayCount)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2051
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2052
		// Invalid screen number, discard.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2053
		return;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2054
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2055
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2056
	LPBITMAPV4HEADER info = &iBufferSet[aDisplayNumber].iInfo;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2057
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2058
	// update the bitmap header taking in consideration the new pixel format
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2059
	switch (aPixelFormat)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2060
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2061
		case EUidPixelFormatXRGB_4444:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2062
		case EUidPixelFormatARGB_4444:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2063
			info->bV4BitCount=16;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2064
			info->bV4V4Compression = BI_BITFIELDS;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2065
			info->bV4RedMask   = 0x0F00;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2066
			info->bV4GreenMask = 0x00F0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2067
			info->bV4BlueMask  = 0x000F;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2068
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2069
		case EUidPixelFormatRGB_565:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2070
			info->bV4BitCount=16;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2071
			info->bV4V4Compression = BI_BITFIELDS;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2072
			info->bV4RedMask   = 0xF800;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2073
			info->bV4GreenMask = 0x07E0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2074
			info->bV4BlueMask  = 0x001F;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2075
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2076
		case EUidPixelFormatXRGB_8888:	// Really 32bpp, but top 8 unused
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2077
		case EUidPixelFormatARGB_8888:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2078
		case EUidPixelFormatARGB_8888_PRE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2079
			info->bV4BitCount=32;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2080
			info->bV4V4Compression = BI_RGB;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2081
			// Mask is implicit for BI_RGB compression
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2082
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2083
		default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2084
			// We got an error, it seems. Let's ignore the message
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2085
			return;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2086
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2087
	iBufferSet[aDisplayNumber].iBufferFormat.iPixelFormat = aPixelFormat;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2088
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2089
	// taking advantage of limiting the width and size to KMaxTInt16
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2090
	TInt width = aAggregateSize & 0x0000ffff;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2091
	TInt height = (aAggregateSize >> 16) & 0x0000ffff;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2092
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2093
	// let's deal with the new size just received
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2094
	iBufferSet[aDisplayNumber].iBufferFormat.iSize.iWidth = width;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2095
	iBufferSet[aDisplayNumber].iBufferFormat.iSize.iHeight = height;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2096
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2097
	// update the bitmap header, taking in consideration the rotation
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2098
	switch (CurrentFlipState[aDisplayNumber])
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2099
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2100
		case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2101
		case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2102
			info->bV4Width = width;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2103
			info->bV4Height = -height;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2104
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2105
		case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2106
		case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2107
			info->bV4Width = height;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2108
			info->bV4Height = -width;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2109
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2110
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2111
	// finally, update the image size
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2112
	SetImageSize(aDisplayNumber);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2113
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2114
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2115
void DMasterIni::SetImageSize(TInt aScreenNumber)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2116
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2117
	TInt displayCount = iBufferSet.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2118
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2119
	if (aScreenNumber >= 0 && aScreenNumber < displayCount)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2120
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2121
		LPBITMAPV4HEADER info = &iBufferSet[aScreenNumber].iInfo;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2122
		TInt bpp = _ALIGN_UP(info->bV4BitCount, 16); //12 & 16 --> 16 ; 24 & 32 --> 32
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2123
		TInt widthInBpp = info->bV4Width * bpp;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2124
		//rounding to 32 bits (4 octets) and converting, then, bits to octets;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2125
		TInt scanLineInBytes = _ALIGN_UP(widthInBpp, 32) >> 3;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2126
		// info->bV4Height is negative or zero
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2127
		info->bV4SizeImage = -info->bV4Height * scanLineInBytes;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2128
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2129
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2130
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2131
LOCAL_C void NextConfiguration()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2132
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2133
	TInt config = CurrentConfiguration;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2134
	if (++config == masterIni->iSystemInis.Count())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2135
		config = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2136
	SwitchConfiguration(config);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2137
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2138
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2139
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2140
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2141
LOCAL_C TBool ProcessedByEmulatorKey(TInt aScanCode, HWND hWnd,TUint message,TUint wParam,TUint lParam)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2142
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2143
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2144
	TBool rVal = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2145
	rVal = ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2146
	for (TInt i=0;i<systemIni->iControlHotKeys.Count();i++)//check key combinations
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2147
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2148
		if (systemIni->iControlHotKeys[i]->CheckCombinationPressed()) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2149
			{				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2150
			switch (systemIni->iControlHotKeys[i]->iCommand)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2151
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2152
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2153
				case ENextConfig:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2154
					NextConfiguration();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2155
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2156
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2157
				case ESelectConfig:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2158
					SwitchConfiguration(systemIni->iControlHotKeys[i]->iData);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2159
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2160
							
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2161
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2162
			return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2163
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2164
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2165
	switch (aScanCode)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2166
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2167
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2168
	case EStdKeyF4:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2169
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2170
		// Simulate a change of media card
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2171
		TInt irq = NKern::DisableAllInterrupts();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2172
		if (*Wins::MediaDoorOpenPtr())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2173
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2174
			*Wins::CurrentPBusDevicePtr() += 1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2175
			if (*Wins::CurrentPBusDevicePtr() == 2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2176
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2177
				*Wins::CurrentPBusDevicePtr() = -1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2178
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2179
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2180
		NKern::RestoreInterrupts(irq);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2181
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2182
		// pass on to the windows system so that if
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2183
		// Alt-F4 is pressed the window will close
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2184
		if (hWnd)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2185
			DefWindowProcA(hWnd,message,wParam,lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2186
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2187
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2188
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2189
	default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2190
		rVal = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2191
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2192
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2193
	return rVal;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2194
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2195
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2196
LOCAL_C void MultiChildWndPointer(TUint aMessage,TInt aXpos,TInt aYpos, TInt aZ, TInt aPointerId)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2197
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2198
// Handle a multi-touch pointer event in the Symbian OS screen window 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2199
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2200
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2201
	TInt phoneX, phoneY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2202
	TRawEvent::TType eventType=TRawEvent::ENone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2203
	CHAR buf[50];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2204
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2205
	systemIni->TranslateMouseCoords(CurrentFlipState[0], aXpos, aYpos, systemIni->iScreens[0]->iScreenWidth, systemIni->iScreens[0]->iScreenHeight, phoneX, phoneY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2206
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2207
	if (aZ <= TheMultiTouch->iZMaxRange) //negative
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2208
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2209
		eventType = TRawEvent::EPointer3DOutOfRange;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2210
		wsprintf((LPTSTR)buf, (LPCTSTR)TEXT("Out Of Range"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2211
		SendMessage(hwndStatus, SB_SETTEXT, aPointerId , (LPARAM)(buf));					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2212
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2213
	else 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2214
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2215
		wsprintf((LPTSTR)buf, (LPCTSTR)TEXT("%d: %d,%d,%d"), aPointerId, phoneX,phoneY,aZ);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2216
		SendMessage(hwndStatus, SB_SETTEXT, aPointerId , (LPARAM)(buf));					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2217
		switch (aMessage)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2218
	    	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2219
			case WM_MOUSEMOVE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2220
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2221
				eventType=TRawEvent::EPointerMove;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2222
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2223
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2224
			case WM_LBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2225
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2226
				SetCapture(TheChildWin[0]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2227
				eventType = TRawEvent::EButton1Down;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2228
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2229
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2230
			case WM_LBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2231
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2232
				ReleaseCapture();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2233
				eventType = TRawEvent::EButton1Up;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2234
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2235
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2236
			case WM_RBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2237
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2238
				eventType = TRawEvent::EButton3Down;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2239
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2240
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2241
			case WM_RBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2242
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2243
				eventType = TRawEvent::EButton3Up;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2244
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2245
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2246
			case WM_MOUSEWHEEL:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2247
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2248
				eventType = TRawEvent::EPointerMove;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2249
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2250
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2251
			default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2252
				return;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2253
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2254
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2255
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2256
	if (!WinsGuiPowerHandler->iStandby)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2257
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2258
		addMouseEvent(eventType, phoneX, phoneY, aZ, aPointerId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2259
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2260
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2261
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2262
LOCAL_C void ChildWndPointer(TUint message,TInt aXpos,TInt aYpos)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2263
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2264
// Handle a pointer event in the Symbian OS screen window
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2265
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2266
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2267
	// Enable the multitouch if the cursor is inside the main client window
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2268
	if (DMultiTouch::iMultiTouchCreated)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2269
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2270
		RECT client;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2271
		WINDOWINFO info;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2272
		GetWindowInfo(TheChildWin[0], &info);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2273
		POINT pt = {aXpos+(TInt)info.rcClient.left, aYpos+(TInt)info.rcClient.top};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2274
		if (GetWindowRect(TheChildWin[0], &client) &&
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2275
				(PtInRect(&client,pt)!=NULL) && !DMultiTouch::iMultiTouchTempEnabled)	// within the window
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2276
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2277
			if (systemIni->MultiTouchEnabled() && systemIni->GCEEnabled())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2278
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2279
				if(TheMultiTouch->Register())	// Register successfully
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2280
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2281
					DMultiTouch::iMultiTouchTempEnabled = TRUE;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2282
					//Show the status bars at the bottom of the emulator
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2283
					SetWindowPos(hwndStatus,0,0,0,0,0,SWP_SHOWWINDOW);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2284
					SetFocus(TheWin[0]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2285
					SetCursor(LoadCursorA(NULL,MAKEINTRESOURCEA(32512)));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2286
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2287
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2288
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2289
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2290
	TRawEvent::TType eventType=TRawEvent::ENone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2291
	switch (message)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2292
    	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2293
	case WM_MOUSEMOVE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2294
		eventType=TRawEvent::EPointerMove;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2295
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2296
	case WM_LBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2297
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2298
		SetCapture(TheChildWin[0]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2299
		eventType=TRawEvent::EButton1Down;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2300
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2301
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2302
	case WM_LBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2303
		ReleaseCapture();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2304
		eventType=TRawEvent::EButton1Up;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2305
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2306
	case WM_RBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2307
		eventType=TRawEvent::EButton3Down;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2308
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2309
	case WM_RBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2310
		eventType=TRawEvent::EButton3Up;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2311
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2312
	case WM_MBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2313
		eventType=TRawEvent::EButton2Down;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2314
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2315
	case WM_MBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2316
		eventType=TRawEvent::EButton2Up;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2317
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2318
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2319
	if (!WinsGuiPowerHandler->iStandby)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2320
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2321
		TInt newX, newY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2322
		systemIni->TranslateMouseCoords(CurrentFlipState[0], aXpos, aYpos, systemIni->iScreens[0]->iScreenWidth, systemIni->iScreens[0]->iScreenHeight, newX, newY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2323
		addMouseEvent(eventType, newX, newY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2324
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2325
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2326
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2327
LOCAL_C void FrameWndPointer(TUint message,TInt aXpos,TInt aYpos, TInt aScreenNumber, TInt aPointerId = 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2328
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2329
// Handle a frame wnd pointer event.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2330
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2331
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2332
	static bool	processingScreenOn=FALSE;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2333
	TEmulCommand command = ENoCommand;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2334
	TInt commandData = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2335
	TBool mouseEvent = ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2336
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2337
	TRawEvent::TType eventType=TRawEvent::ENone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2338
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2339
	TViewport& viewport = systemIni->iScreens[aScreenNumber]->iViewport;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2340
	aXpos += viewport.GetViewportOffsetX(); // make mouse-coords relative to fascia edge even if window is scrolled
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2341
	aYpos += viewport.GetViewportOffsetY();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2342
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2343
	switch (message)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2344
    	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2345
	case WM_MOUSEMOVE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2346
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2347
		TInt newX, newY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2348
		systemIni->TranslateMouseCoords(CurrentFlipState[0], aXpos, aYpos, systemIni->iScreens[0]->iXYInputWidth, systemIni->iScreens[0]->iXYInputHeight, newX, newY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2349
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2350
		if (aPointerId == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2351
			{ // only system pointer changes shape
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2352
		if (systemIni->GetVirtualKey(command, newX, newY) >= 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2353
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2354
			HMODULE hmodule = GetModuleHandleA("winsgui.dll");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2355
			SetCursor(LoadCursorA((HINSTANCE)hmodule,MAKEINTRESOURCEA(OVERKEY)));		//hand cursor
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2356
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2357
		else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2358
			SetCursor(LoadCursorA(NULL,MAKEINTRESOURCEA(32512))); //ICD_ARROW
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2359
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2360
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2361
		eventType=TRawEvent::EPointerMove;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2362
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2363
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2364
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2365
	case WM_LBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2366
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2367
		SetCapture(TheWin[0]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2368
		//check the configuration
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2369
		TInt newX, newY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2370
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2371
		//if the emulator screen is rotated, rotate/flip the current mouse cursor position
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2372
		//so it can be checked to see if it is in a key region.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2373
		systemIni->TranslateMouseCoords(CurrentFlipState[0], aXpos, aYpos, systemIni->iScreens[0]->iXYInputWidth, systemIni->iScreens[0]->iXYInputHeight, newX, newY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2374
		commandData = systemIni->GetVirtualKey(command, newX, newY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2375
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2376
		if (commandData >= 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2377
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2378
			eventType=TRawEvent::EKeyDown;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2379
			mouseEvent = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2380
			systemIni->SetVirtualKey(ETrue, commandData, command);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2381
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2382
		else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2383
			eventType=TRawEvent::EButton1Down;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2384
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2385
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2386
	case WM_LBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2387
		ReleaseCapture();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2388
		if (processingScreenOn)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2389
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2390
			// ignore button up - button down was switching things on
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2391
			processingScreenOn=FALSE;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2392
			return;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2393
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2394
		if (systemIni->WasVirtualKey(commandData, command))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2395
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2396
			eventType=TRawEvent::EKeyUp;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2397
			mouseEvent = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2398
			systemIni->SetVirtualKey(EFalse, EStdKeyNull, ENoCommand);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2399
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2400
		else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2401
			eventType=TRawEvent::EButton1Up;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2402
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2403
	case WM_RBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2404
		eventType=TRawEvent::EButton3Down;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2405
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2406
	case WM_RBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2407
		eventType=TRawEvent::EButton3Up;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2408
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2409
	case WM_MBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2410
		eventType=TRawEvent::EButton2Down;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2411
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2412
	case WM_MBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2413
		eventType=TRawEvent::EButton2Up;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2414
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2415
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2416
	if (mouseEvent)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2417
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2418
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2419
		if (!WinsGuiPowerHandler->iStandby)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2420
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2421
			/*
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2422
			mouse events are relative to the child window position
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2423
			and are clipped to the digitzer region in addMouseEvent
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2424
			so all the mouse clicks are passed on here after being translated 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2425
			to the child window coordinate system (under the current rotation)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2426
			*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2427
			TInt newX, newY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2428
			switch (CurrentFlipState[0])
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2429
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2430
				case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2431
				default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2432
					newX = aXpos - systemIni->iScreens[0]->iScreenOffsetX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2433
					newY = aYpos - systemIni->iScreens[0]->iScreenOffsetY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2434
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2435
				case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2436
					newX = aXpos - (systemIni->iScreens[0]->iXYInputWidth - systemIni->iScreens[0]->iScreenWidth - systemIni->iScreens[0]->iScreenOffsetX);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2437
					newY = aYpos - (systemIni->iScreens[0]->iXYInputHeight - systemIni->iScreens[0]->iScreenHeight - systemIni->iScreens[0]->iScreenOffsetY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2438
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2439
				case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2440
					newX = aXpos - systemIni->iScreens[0]->iScreenOffsetY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2441
					newY = aYpos - (systemIni->iScreens[0]->iXYInputWidth - systemIni->iScreens[0]->iScreenWidth - systemIni->iScreens[0]->iScreenOffsetX);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2442
					break;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2443
				case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2444
					newX = aXpos - (systemIni->iScreens[0]->iXYInputHeight - systemIni->iScreens[0]->iScreenHeight - systemIni->iScreens[0]->iScreenOffsetY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2445
					newY = aYpos - systemIni->iScreens[0]->iScreenOffsetX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2446
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2447
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2448
			addMouseEvent(eventType, newX, newY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2449
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2450
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2451
	else if ((((message == WM_LBUTTONDOWN && command == EKey) && !ProcessedByEmulatorKey((TUint8)commandData,0,0,0,0)))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2452
			|| (message == WM_LBUTTONUP))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2453
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2454
			switch (command)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2455
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2456
			case EKey:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2457
				if (!WinsGuiPowerHandler->iStandby)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2458
					addKeyEvent(eventType, (TUint8)commandData);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2459
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2460
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2461
			case ENextConfig:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2462
				NextConfiguration();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2463
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2464
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2465
			case ESelectConfig:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2466
				SwitchConfiguration(commandData);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2467
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2468
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2469
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2470
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2471
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2472
LOCAL_C TInt ScreenFromHWND(HWND aHwnd,HWND* pWin)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2473
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2474
	TInt screens=systemIni->iScreens.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2475
	TInt r=-1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2476
	for(TInt i=0;i<screens;i++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2477
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2478
		if(pWin[i]==aHwnd)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2479
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2480
			r=i;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2481
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2482
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2483
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2484
	return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2485
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2486
void MultiTouchWndPointer(TUint message,TInt aXpos,TInt aYpos, TInt aZ, TInt aPointerId)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2487
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2488
	WINDOWINFO info;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2489
	info.cbSize = sizeof(WINDOWINFO);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2490
	if (GetWindowInfo(TheWin[0], &info))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2491
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2492
		POINT pt = {aXpos,aYpos};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2493
		if (PtInRect(&info.rcWindow,pt))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2494
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2495
			RECT client;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2496
			if (GetWindowRect(TheChildWin[0], &client) && PtInRect(&client,pt))	// within the window
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2497
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2498
				MultiChildWndPointer(message, aXpos-client.left, aYpos-client.top, aZ, aPointerId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2499
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2500
			else  
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2501
				{		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2502
				//	Disable the multitouch if the cursor is outside the application window
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2503
				if (DMultiTouch::iMultiTouchTempEnabled)	// within the window
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2504
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2505
					DMultiTouch::iMultiTouchTempEnabled = FALSE;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2506
					if(TheMultiTouch->UnRegister())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2507
						{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2508
						SetWindowPos(hwndStatus,0,0,0,0,0,SWP_HIDEWINDOW);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2509
						}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2510
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2511
				FrameWndPointer(message, aXpos-info.rcClient.left, aYpos-info.rcClient.top, 0, aPointerId);	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2512
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2513
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2514
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2515
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2516
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2517
LOCAL_C DScreenProperties* ScreenPropsFromHWND(HWND aHwnd, HWND* pWin)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2518
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2519
	TInt screenNumber =  ScreenFromHWND(aHwnd, pWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2520
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2521
	if(screenNumber >=0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2522
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2523
		return systemIni->iScreens[screenNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2524
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2525
	return NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2526
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2527
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2528
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2529
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2530
TInt APIENTRY childWinProc(HWND hWnd,TUint message,TUint wParam,TUint lParam)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2531
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2532
// The child window function.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2533
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2534
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2535
	TInt screenNumber = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2536
	TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2537
    switch (message)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2538
    	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2539
	case WM_FLIP_MESSAGE: // pass the flip message onto the parent window
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2540
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2541
		screenNumber =ScreenFromHWND(hWnd,TheChildWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2542
		if(TUint(screenNumber) < TUint(systemIni->iScreens.Count()))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2543
			PostMessageA(TheWin[screenNumber],WM_FLIP_MESSAGE,wParam,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2544
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2545
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2546
	case WM_LBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2547
	case WM_LBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2548
	case WM_MOUSEMOVE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2549
	case WM_RBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2550
	case WM_RBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2551
	case WM_MBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2552
	case WM_MBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2553
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2554
		if (DMultiTouch::iMultiTouchTempEnabled)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2555
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2556
			DMultiTouch::iMultiTouchTempEnabled = FALSE;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2557
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2558
		screenNumber=ScreenFromHWND(hWnd,TheChildWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2559
		if(screenNumber==0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2560
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2561
			ChildWndPointer(message,(TInt16)(lParam&0xFFFF),(TInt16)((lParam>>16)&0xFFFF));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2562
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2563
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2564
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2565
    case WM_PAINT:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2566
		if (!PaintWindowFromBuffer(hWnd))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2567
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2568
			// Original behaviour
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2569
			ValidateRect(hWnd,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2570
			v.Set(TRawEvent::ERedraw);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2571
			TheEventQ.Add(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2572
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2573
        break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2574
    case WM_ACTIVATE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2575
	case WM_SYSKEYDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2576
	case WM_KEYDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2577
	case WM_SYSKEYUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2578
	case WM_KEYUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2579
		Fault(EGuiChildWinProc);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2580
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2581
    case WM_DESTROY:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2582
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2583
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2584
	case WM_CHAR:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2585
	case WM_SYSCHAR:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2586
	case WM_DEADCHAR:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2587
	case WM_SYSDEADCHAR:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2588
        break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2589
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2590
	case WMU_SET_DISPLAY_BUFFER:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2591
		screenNumber = ScreenFromHWND(hWnd, TheChildWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2592
		if (TUint(screenNumber) < TUint(systemIni->iScreens.Count()))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2593
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2594
			masterIni->iBufferSet[screenNumber].iDisplayBuffer = (LPVOID)lParam;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2595
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2596
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2597
	case WMU_SET_DISPLAY_SIZE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2598
		screenNumber = ScreenFromHWND(hWnd, TheChildWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2599
		masterIni->SetDisplaySize(screenNumber, wParam, lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2600
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2601
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2602
	case WMU_SET_BUFFER_FORMAT:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2603
		screenNumber = ScreenFromHWND(hWnd, TheChildWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2604
		masterIni->SetBufferFormat(screenNumber, wParam, (RDisplayChannel::TPixelFormat) lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2605
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2606
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2607
 	default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2608
        return(DefWindowProcA(hWnd,message,wParam,lParam));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2609
	    }
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2610
    return(FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2611
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2612
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2613
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2614
LOCAL_C TBool PaintWindowFromBuffer(HWND hWnd)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2615
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2616
	TInt screenNumber = ScreenFromHWND(hWnd,TheChildWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2617
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2618
	if (TUint(screenNumber) >= TUint(masterIni->iBufferSet.Count()))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2619
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2620
		return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2621
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2622
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2623
	LPVOID displayBuffer = masterIni->iBufferSet[screenNumber].iDisplayBuffer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2624
	if (!displayBuffer)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2625
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2626
		return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2627
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2628
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2629
	TInt   frameOffset = masterIni->iBufferSet[screenNumber].iScreenBuffer.iDisplayBufferOffset;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2630
	displayBuffer=LPVOID(frameOffset+(char*)displayBuffer);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2631
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2632
	LPBITMAPINFO info = (LPBITMAPINFO)&masterIni->iBufferSet[screenNumber].iInfo;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2633
	WORD width = (WORD)info->bmiHeader.biWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2634
	WORD height = (WORD)-info->bmiHeader.biHeight;	// stored -ve in info
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2635
	LPVOID pDisplayBuffer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2636
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2637
	switch(CurrentFlipState[screenNumber])
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2638
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2639
	case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2640
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2641
		//No rotation to do.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2642
		pDisplayBuffer = displayBuffer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2643
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2644
	break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2645
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2646
	case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2647
		{	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2648
		//rotate display buffer: Map phone display onto window buffer which has been rotated
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2649
		DWORD* pRotatedPtr = systemIni->iScreens[screenNumber]->iRotateBuffer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2650
		for (int y = 0; y < height; y++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2651
			for (int x = 0; x < width; x++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2652
				*pRotatedPtr++ = *((DWORD*)(displayBuffer) + ((height - y - 1) * (width)) + (width - x -1));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2653
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2654
		pDisplayBuffer = systemIni->iScreens[screenNumber]->iRotateBuffer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2655
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2656
	break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2657
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2658
	case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2659
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2660
		//rotate display buffer: Map phone display onto window buffer which has been rotated
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2661
		DWORD* pRotatedPtr = systemIni->iScreens[screenNumber]->iRotateBuffer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2662
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2663
		for (int y = 0; y < height; y++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2664
			for (int x = 0; x < width; x++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2665
				*pRotatedPtr++ = *((DWORD*)(displayBuffer) + (x * height) + (height - y -1));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2666
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2667
		pDisplayBuffer = systemIni->iScreens[screenNumber]->iRotateBuffer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2668
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2669
	break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2670
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2671
	case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2672
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2673
		//rotate display buffer: Map phone display onto window buffer which has been rotated
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2674
		DWORD* pRotatedPtr = systemIni->iScreens[screenNumber]->iRotateBuffer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2675
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2676
		for (int y = 0; y < height; y++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2677
			for (int x = 0; x < width; x++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2678
				*pRotatedPtr++ = *((DWORD*)(displayBuffer) + ((width - x - 1) * (height)) + y);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2679
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2680
		pDisplayBuffer = systemIni->iScreens[screenNumber]->iRotateBuffer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2681
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2682
	break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2683
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2684
	default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2685
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2686
		Kern::Printf("Error PaintWindowFromBuffer - unknown orientation");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2687
		return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2688
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2689
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2690
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2691
	PAINTSTRUCT ps;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2692
	BeginPaint(hWnd, &ps);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2693
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2694
	SetDIBitsToDevice(	ps.hdc,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2695
						0, 0, 			// Dst X, Y
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2696
						width, height,	// Src W, H
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2697
						0, 0,			// Src X, Y
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2698
						0,				// Src offset to first line
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2699
						height,			// Src lines available
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2700
						pDisplayBuffer,	// Src pointer to pixels
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2701
						info,			// Src info
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2702
						DIB_RGB_COLORS);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2703
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2704
	EndPaint(hWnd, &ps);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2705
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2706
	return ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2707
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2708
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2709
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2710
LOCAL_C void CalcTextPos(TInt aScreen, TInt& aX, TInt& aY)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2711
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2712
	switch (CurrentFlipState[aScreen])
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2713
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2714
	case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2715
		aX = systemIni->iScreens[aScreen]->iXYInputWidth-(systemIni->iScreens[aScreen]->iScreenOffsetX+systemIni->iScreens[aScreen]->iScreenWidth);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2716
		aY = systemIni->iScreens[aScreen]->iXYInputHeight-(systemIni->iScreens[aScreen]->iScreenOffsetY+systemIni->iScreens[aScreen]->iScreenHeight);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2717
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2718
	case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2719
		aX = systemIni->iScreens[aScreen]->iScreenOffsetY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2720
		aY = systemIni->iScreens[aScreen]->iXYInputWidth-(systemIni->iScreens[aScreen]->iScreenOffsetX+systemIni->iScreens[aScreen]->iScreenWidth);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2721
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2722
	case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2723
		aX = systemIni->iScreens[aScreen]->iXYInputHeight-(systemIni->iScreens[aScreen]->iScreenOffsetY+systemIni->iScreens[aScreen]->iScreenHeight);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2724
		aY = systemIni->iScreens[aScreen]->iScreenOffsetX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2725
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2726
	case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2727
	default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2728
		aX = systemIni->iScreens[aScreen]->iScreenOffsetX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2729
		aY = systemIni->iScreens[aScreen]->iScreenOffsetY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2730
	break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2731
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2732
	//subtract viewport offset here
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2733
	aX -= systemIni->iScreens[aScreen]->iViewport.GetViewportOffsetX();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2734
	aY -= systemIni->iScreens[aScreen]->iViewport.GetViewportOffsetY();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2735
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2736
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2737
TInt APIENTRY ctrlwinProc(HWND hWnd,TUint message,TUint wParam,TUint lParam)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2738
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2739
// The control window function
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2740
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2741
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2742
	switch(message)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2743
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2744
		case WM_SYSCOMMAND:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2745
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2746
				switch(wParam)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2747
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2748
					case 1:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2749
						{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2750
						NextConfiguration();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2751
						return 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2752
						}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2753
					case SC_MINIMIZE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2754
					case SC_RESTORE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2755
						{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2756
						if (wParam == SC_RESTORE) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2757
							Active();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2758
						for(TInt ix=0;ix<systemIni->iScreens.Count();ix++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2759
							{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2760
							SendMessage(TheWin[ix],message,wParam,lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2761
							}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2762
						if (wParam == SC_MINIMIZE) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2763
							Inactive();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2764
						}			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2765
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2766
				return(DefWindowProcA(hWnd,message,wParam,lParam));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2767
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2768
		case WM_CLOSE: // tell all emulator screen windows to close
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2769
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2770
			for(TInt i=0;i<systemIni->iScreens.Count();i++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2771
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2772
				DestroyWindow(TheWin[i]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2773
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2774
			DestroyWindow(hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2775
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2776
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2777
		case WM_DESTROY:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2778
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2779
			// save the main window position information
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2780
			HANDLE hSysIni;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2781
			hSysIni = CreateFileA(systemIni->iSysIniFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2782
			DScreenProperties* screenProps;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2783
			if (hSysIni != INVALID_HANDLE_VALUE)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2784
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2785
				DWORD numWritten;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2786
				//write an identifier into file so that program can avoid loading old version
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2787
				WriteFile(hSysIni, &KDatFileVersion, sizeof(TInt), &numWritten, 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2788
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2789
				//record current configuration at start of file.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2790
				WriteFile(hSysIni, &CurrentConfiguration, sizeof(TInt), &numWritten, 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2791
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2792
				//Write out the state for each window.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2793
				for(TInt i=0;i<systemIni->iScreens.Count();i++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2794
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2795
					screenProps= systemIni->iScreens[i];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2796
					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2797
					TWindowState winState= screenProps->GetWindowState();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2798
					WriteFile(hSysIni, &winState, sizeof(TWindowState), &numWritten, 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2799
					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2800
					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2801
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2802
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2803
			CloseHandle(hSysIni);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2804
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2805
			PostQuitMessage(KErrNone);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2806
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2807
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2808
		case WM_INPUT:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2809
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2810
			if (!DMultiTouch::iMultiTouchTempEnabled)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2811
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2812
				for(TInt ix=0;ix<systemIni->iScreens.Count();ix++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2813
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2814
					DMultiTouch::iMultiTouchTempEnabled = TRUE;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2815
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2816
					SendMessage(TheWin[ix],message,wParam,lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2817
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2818
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2819
			else if (systemIni->MultiTouchEnabled() && DMultiTouch::iMultiTouchSupported && systemIni->GCEEnabled())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2820
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2821
			   	TheMultiTouch->OnWmInput(hWnd, message, wParam, lParam,TheChildWin[0]);	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2822
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2823
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2824
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2825
				Fault(EGuiInvalidMultiTouch);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2826
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2827
		   	break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2828
			}	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2829
		default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2830
			return(DefWindowProcA(hWnd,message,wParam,lParam));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2831
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2832
	return(FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2833
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2834
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2835
TInt APIENTRY winProc(HWND hWnd,TUint message,TUint wParam,TUint lParam)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2836
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2837
// The border window function.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2838
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2839
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2840
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2841
	TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2842
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2843
	switch (message)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2844
    	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2845
		case WM_GETMINMAXINFO:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2846
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2847
			DScreenProperties* screenProps = ScreenPropsFromHWND(hWnd, TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2848
			if(screenProps == NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2849
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2850
				return DefWindowProcA(hWnd, message, wParam, lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2851
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2852
						
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2853
			MINMAXINFO* minMaxInfo = reinterpret_cast<MINMAXINFO*>(lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2854
			minMaxInfo->ptMaxTrackSize.x = screenProps->iViewport.GetMaxWindowWidth();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2855
			minMaxInfo->ptMaxTrackSize.y = screenProps->iViewport.GetMaxWindowHeight();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2856
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2857
			minMaxInfo->ptMaxSize.x = minMaxInfo->ptMaxTrackSize.x;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2858
			minMaxInfo->ptMaxSize.y = minMaxInfo->ptMaxTrackSize.y;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2859
			DefWindowProcA(hWnd, message, wParam, lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2860
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2861
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2862
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2863
	   
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2864
    	    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2865
 	    	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2866
    	case WM_SIZE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2867
    		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2868
    		DScreenProperties* screenProps = ScreenPropsFromHWND(hWnd, TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2869
			if(screenProps == NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2870
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2871
				return DefWindowProcA(hWnd, message, wParam, lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2872
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2873
    		TViewport& viewport = screenProps->iViewport;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2874
    		//update size of viewport
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2875
    		viewport.SetViewportWidth(LOWORD(lParam));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2876
    		viewport.SetViewportHeight(HIWORD(lParam));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2877
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2878
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2879
			//If resize goes beyond boundary of emulator then scroll to compensate
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2880
			TInt ox = viewport.GetViewportOffsetX();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2881
    		TInt xs = ox + LOWORD(lParam) - viewport.GetMaxWidth();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2882
    		if (xs>0) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2883
    			{    			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2884
    			viewport.ScrollToX(ox-xs, hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2885
    			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2886
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2887
    		TInt oy = viewport.GetViewportOffsetY();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2888
    		TInt ys = oy + HIWORD(lParam) - viewport.GetMaxHeight();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2889
    		if (ys>0) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2890
    			{    			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2891
    			viewport.ScrollToY(oy-ys, hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2892
    			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2893
    	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2894
    		//Adjust ranges of scroll bars
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2895
    	   	viewport.UpdateScrollBarH(hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2896
    		viewport.UpdateScrollBarV(hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2897
    		    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2898
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2899
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2900
    		break;    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2901
    		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2902
    	case WM_HSCROLL:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2903
    		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2904
    		DScreenProperties* screenProps = ScreenPropsFromHWND(hWnd, TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2905
			if(screenProps == NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2906
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2907
				return DefWindowProcA(hWnd, message, wParam, lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2908
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2909
    		TViewport& viewport = screenProps->iViewport;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2910
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2911
    		switch (LOWORD(wParam)) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2912
    			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2913
    			case SB_THUMBTRACK:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2914
    				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2915
    				viewport.ScrollToX(HIWORD(wParam),hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2916
    				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2917
    				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2918
				case SB_PAGELEFT:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2919
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2920
					viewport.ScrollToX(viewport.GetViewportOffsetX() - viewport.GetViewportWidth(), hWnd );
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2921
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2922
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2923
				case SB_PAGERIGHT:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2924
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2925
					viewport.ScrollToX(viewport.GetViewportOffsetX() + viewport.GetViewportWidth() , hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2926
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2927
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2928
				case SB_LINEUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2929
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2930
					viewport.ScrollToX(viewport.GetViewportOffsetX() - 1, hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2931
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2932
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2933
				case SB_LINEDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2934
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2935
					viewport.ScrollToX(viewport.GetViewportOffsetX() + 1, hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2936
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2937
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2938
    			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2939
    			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2940
    		   		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2941
   
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2942
    		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2943
    		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2944
    	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2945
    	case WM_VSCROLL:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2946
    		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2947
    		DScreenProperties* screenProps = ScreenPropsFromHWND(hWnd, TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2948
			if(screenProps == NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2949
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2950
				return DefWindowProcA(hWnd, message, wParam, lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2951
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2952
    		TViewport& viewport = screenProps->iViewport;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2953
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2954
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2955
			switch (LOWORD(wParam)) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2956
    			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2957
    			case SB_THUMBTRACK:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2958
    				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2959
    				viewport.ScrollToY(HIWORD(wParam), hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2960
    				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2961
    				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2962
				case SB_PAGELEFT:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2963
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2964
					viewport.ScrollToY(viewport.GetViewportOffsetY() - viewport.GetViewportHeight() , hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2965
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2966
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2967
				case SB_PAGERIGHT:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2968
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2969
					viewport.ScrollToY(viewport.GetViewportOffsetY() + viewport.GetViewportHeight(), hWnd );
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2970
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2971
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2972
				case SB_LINEUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2973
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2974
					viewport.ScrollToY(viewport.GetViewportOffsetY() - 1, hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2975
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2976
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2977
				case SB_LINEDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2978
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2979
					viewport.ScrollToY(viewport.GetViewportOffsetY() + 1, hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2980
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2981
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2982
    			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2983
    			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2984
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2985
    		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2986
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2987
    		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2988
    	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2989
    	 		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2990
		case WM_FLIP_MESSAGE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2991
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2992
			DScreenProperties* screenProps = ScreenPropsFromHWND(hWnd, TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2993
			if(screenProps == NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2994
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2995
				return DefWindowProcA(hWnd, message, wParam, lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2996
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2997
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2998
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  2999
			TViewport& viewport = screenProps->iViewport;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3000
			RECT windowRect={0,0,0,0};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3001
			GetClientRect(hWnd, &windowRect);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3002
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3003
			TInt screenNumber=ScreenFromHWND(hWnd,TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3004
			if(TUint(screenNumber) >= TUint(systemIni->iScreens.Count()))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3005
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3006
			PBITMAPV4HEADER info = &masterIni->iBufferSet[screenNumber].iInfo;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3007
			CurrentFlipState[screenNumber]=(TEmulatorFlip)wParam;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3008
			TBufferSet* bufferSet = &masterIni->iBufferSet[screenNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3009
			switch (CurrentFlipState[screenNumber])
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3010
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3011
				case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3012
				case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3013
					windowRect.right=systemIni->iScreens[screenNumber]->iXYInputWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3014
					windowRect.bottom=systemIni->iScreens[screenNumber]->iXYInputHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3015
					info->bV4Width = bufferSet->iBufferFormat.iSize.iWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3016
					info->bV4Height = -bufferSet->iBufferFormat.iSize.iHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3017
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3018
				case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3019
				case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3020
					windowRect.right=systemIni->iScreens[screenNumber]->iXYInputHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3021
					windowRect.bottom=systemIni->iScreens[screenNumber]->iXYInputWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3022
					info->bV4Width = bufferSet->iBufferFormat.iSize.iHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3023
					info->bV4Height = -bufferSet->iBufferFormat.iSize.iWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3024
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3025
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3026
			AdjustWindowRect(&windowRect,KWinStyle,FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3027
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3028
    		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3029
			viewport.ScrollToX(0, hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3030
			viewport.ScrollToY(0, hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3031
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3032
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3033
			screenProps->iScreenRotation = (TEmulatorFlip)wParam; 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3034
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3035
						
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3036
			RECT currentWindowRect;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3037
			GetWindowRect(hWnd,&currentWindowRect);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3038
			InvalidateRect(hWnd,NULL,FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3039
			MoveWindow(
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3040
				TheWin[screenNumber],
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3041
				max(currentWindowRect.left,0), // so the window doesn't disappear off the screen
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3042
				max(currentWindowRect.top,0),
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3043
				windowRect.right-windowRect.left,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3044
				windowRect.bottom-windowRect.top,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3045
				TRUE
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3046
				);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3047
			// move the child window
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3048
			screenProps->iViewport.UpdateChildPos(hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3049
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3050
			viewport.UpdateScrollBarH(hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3051
    		viewport.UpdateScrollBarV(hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3052
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3053
			InvalidateRect(hWnd,NULL,TRUE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3054
			UpdateWindow(hWnd);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3055
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3056
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3057
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3058
		case WM_SYSKEYDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3059
		case WM_KEYDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3060
			if (!(HIWORD(lParam)&KF_REPEAT))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3061
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3062
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3063
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3064
				TUint scanCode=DWinsKeyboard::ScanCodeToStandardKey(HIWORD(lParam));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3065
				TUint newScanCode = systemIni->iKeyboard.ScanCodeToRemappedKey(HIWORD(lParam));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3066
				MSG msg={hWnd,message,wParam,lParam,GetMessageTime(),GetMessagePos()};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3067
				TranslateMessage(&msg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3068
				TUint charCode=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3069
				// look in the message queue to get character associated with keypress
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3070
				// so long as the control, shift and alt keys aren't depressed
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3071
				if (!(HIBYTE(GetKeyState(VK_CONTROL)) && HIBYTE(GetKeyState(VK_MENU)) && HIBYTE(GetKeyState(VK_SHIFT))))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3072
					if (PeekMessageA(&msg,hWnd,WM_CHAR,WM_CHAR,PM_NOREMOVE) &&
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3073
						scanCode == newScanCode) //no remapping
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3074
						charCode=msg.wParam;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3075
				// Pass the character as the HIWORD of the Epoc scan code
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3076
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3077
				scanCode = newScanCode;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3078
				v.Set(TRawEvent::EKeyDown,(charCode<<16)|scanCode);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3079
				if (!ProcessedByEmulatorKey(scanCode,hWnd,message,wParam,lParam))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3080
   					TheEventQ.Add(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3081
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3082
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3083
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3084
		case WM_TIMER:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3085
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3086
		case WM_EMUL_POWER_ON:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3087
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3088
			TInt screenNumber=ScreenFromHWND(hWnd,TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3089
			if(TUint(screenNumber) >= TUint(systemIni->iScreens.Count()))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3090
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3091
//			HWND win = systemIni->iSecureDisplay ? TheSecureChildWin : TheChildWin;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3092
			HWND win = TheChildWin[screenNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3093
			if (wParam==TRUE)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3094
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3095
				ShowWindow(win, SW_HIDE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3096
				ShowWindow(win, SW_SHOWNORMAL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3097
				if (SavedFlipMessage)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3098
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3099
					addKeyEvent(TRawEvent::EKeyDown, SavedFlipMessage);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3100
					SavedFlipMessage = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3101
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3102
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3103
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3104
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3105
				ShowWindow(win, SW_SHOWNORMAL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3106
				ShowWindow(win, SW_HIDE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3107
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3108
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3109
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3110
		case WM_SYSKEYUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3111
		case WM_KEYUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3112
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3113
			//get the key code, this will pick up if it has been remapped or not.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3114
			TUint scanCode = systemIni->iKeyboard.ScanCodeToRemappedKey(HIWORD(lParam));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3115
	   /*
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3116
		* We could do this to support generation of special characters using Alt+KeyPadNum
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3117
		* combinations, but we would need to find a way to suppress the generation of
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3118
		* home/end scancodes etc., so leave it for the moment.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3119
					MSG msg={hWnd,message,wParam,lParam,GetMessageTime(),GetMessagePos()};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3120
					TranslateMessage(&msg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3121
					TUint charCode=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3122
					// look in the message queue to get character associated with keypress
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3123
					if (PeekMessageU()(&msg,hWnd,WM_CHAR,WM_CHAR,PM_NOREMOVE))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3124
						charCode=msg.wParam;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3125
					// Pass the character as the HIWORD of the Epoc scan code
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3126
					v.Set(TRawEvent::EKeyUp,(charCode<<16)|scanCode);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3127
		*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3128
					v.Set(TRawEvent::EKeyUp,scanCode);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3129
	    			TheEventQ.Add(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3130
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3131
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3132
		case WM_MOUSEMOVE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3133
		case WM_LBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3134
		case WM_LBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3135
		case WM_RBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3136
		case WM_RBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3137
		case WM_MBUTTONDOWN:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3138
		case WM_MBUTTONUP:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3139
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3140
				//only handle mouse clicks on screen 0
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3141
				TInt xpos=((TInt16)(lParam&0xffff));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3142
				TInt ypos = (TInt16)((lParam>>16)&0xFFFF);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3143
				if (DMultiTouch::iMultiTouchTempEnabled)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3144
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3145
					MultiChildWndPointer(message,xpos,ypos,0,0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3146
					DMultiTouch::iMultiTouchTempEnabled = FALSE;				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3147
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3148
				else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3149
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3150
					TInt screenNumber=ScreenFromHWND(hWnd,TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3151
					if(screenNumber!=0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3152
						break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3153
					FrameWndPointer(message,xpos,ypos,screenNumber);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3154
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3155
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3156
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3157
		case WM_PAINT:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3158
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3159
			DScreenProperties* screenProps = ScreenPropsFromHWND(hWnd, TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3160
			if(screenProps == NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3161
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3162
				return DefWindowProcA(hWnd, message, wParam, lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3163
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3164
    		TViewport& viewport = screenProps->iViewport;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3165
    		TInt screenNumber=ScreenFromHWND(hWnd,TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3166
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3167
			PAINTSTRUCT p;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3168
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3169
			BeginPaint(hWnd,&p);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3170
	   		HDC hdcBits;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3171
			BITMAP bm;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3172
    		hdcBits=CreateCompatibleDC(p.hdc);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3173
			GetObjectA(TheScreenBitmap[screenNumber],sizeof(BITMAP),&bm);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3174
    		SelectObject(hdcBits,TheScreenBitmap[screenNumber]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3175
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3176
			RECT windowRect;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3177
			GetClientRect(TheWin[screenNumber],&windowRect);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3178
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3179
			viewport.SetViewportHeight(windowRect.bottom);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3180
			viewport.SetViewportWidth(windowRect.right);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3181
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3182
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3183
			switch (CurrentFlipState[screenNumber])
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3184
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3185
				case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3186
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3187
					BitBlt(p.hdc,0,0,windowRect.right,windowRect.bottom,hdcBits,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3188
						viewport.GetViewportOffsetX(),viewport.GetViewportOffsetY(),SRCCOPY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3189
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3190
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3191
				case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3192
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3193
					TInt sourceX = screenProps->iXYInputWidth - viewport.GetViewportWidth() - viewport.GetViewportOffsetX();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3194
					if(sourceX<0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3195
						sourceX=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3196
					TInt sourceY = screenProps->iXYInputHeight - viewport.GetViewportHeight() - viewport.GetViewportOffsetY();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3197
					if(sourceY<0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3198
						sourceY=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3199
					TInt sourceWidth = viewport.GetMaxWidth()-sourceX - viewport.GetViewportOffsetX();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3200
					TInt sourceHeight = viewport.GetMaxHeight()-sourceY - viewport.GetViewportOffsetY();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3201
					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3202
					//when inverted it is necessary to translate the image by 1 pixel up and to the left,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3203
					//to avoid a glitch when scrolling using ScrollWindowEx()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3204
					POINT arrayPoints[3]={
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3205
						{sourceWidth-1,sourceHeight-1},
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3206
						{-1,sourceHeight-1},
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3207
						{sourceWidth-1,-1}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3208
						};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3209
					PlgBlt(p.hdc,arrayPoints,hdcBits,sourceX,sourceY,sourceWidth,sourceHeight,NULL,NULL,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3210
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3211
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3212
				case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3213
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3214
					TInt offsetX = screenProps->iXYInputWidth- viewport.GetViewportHeight()  - viewport.GetViewportOffsetY(); 	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3215
					TInt offsetY = viewport.GetViewportOffsetX(); 	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3216
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3217
					POINT arrayPoints[3]={{0,windowRect.bottom},{0,0},{windowRect.right,windowRect.bottom}};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3218
					PlgBlt(p.hdc,arrayPoints,hdcBits,offsetX,offsetY,viewport.GetViewportHeight(),viewport.GetViewportWidth(),NULL,NULL,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3219
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3220
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3221
				case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3222
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3223
					TInt offsetX = viewport.GetViewportOffsetY(); 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3224
					TInt offsetY = screenProps->iXYInputHeight - viewport.GetViewportWidth() - viewport.GetViewportOffsetX(); 	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3225
									
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3226
					POINT arrayPoints[3]={{windowRect.right,0},{windowRect.right,windowRect.bottom},{0,0}};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3227
					PlgBlt(p.hdc,arrayPoints,hdcBits,offsetX,offsetY,viewport.GetViewportHeight(),viewport.GetViewportWidth(),NULL,NULL,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3228
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3229
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3230
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3231
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3232
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3233
			DeleteDC(hdcBits);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3234
			if (WinsGuiPowerHandler->iStandby)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3235
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3236
				TInt x,y;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3237
				CalcTextPos(screenNumber, x, y);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3238
				TextOutA(p.hdc, x, y, "Standby", 7);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3239
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3240
			else if (systemIni->iScreens[screenNumber]->iScreenOff)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3241
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3242
				TInt x,y;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3243
				CalcTextPos(screenNumber, x, y);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3244
				TextOutA(p.hdc, x, y, "Screen Off", 10);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3245
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3246
 			EndPaint(hWnd,&p);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3247
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3248
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3249
		case WM_ACTIVATE:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3250
			//Added so that change in modifier keys can be detected without sending
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3251
			//EActive/EInActive to wserv as it results in switching the timers
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3252
   			if((wParam & 0xffff)!= WA_INACTIVE)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3253
   				UpdateModifiers();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3254
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3255
		case WM_CHAR:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3256
		case WM_SYSCHAR:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3257
		case WM_DEADCHAR:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3258
		case WM_SYSDEADCHAR:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3259
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3260
		case WM_CLOSE: //pass on message to control window, it will then destroy all e,ulator windows
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3261
			SendMessage(TheControlWin,WM_CLOSE, NULL, NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3262
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3263
		case WM_DESTROY:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3264
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3265
			DScreenProperties* screenProps = ScreenPropsFromHWND(hWnd, TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3266
			if(screenProps == NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3267
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3268
				return DefWindowProcA(hWnd, message, wParam, lParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3269
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3270
    					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3271
			// save window's position information
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3272
			screenProps->iWinPlace.length = sizeof(WINDOWPLACEMENT);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3273
			GetWindowPlacement(hWnd, &screenProps->iWinPlace);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3274
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3275
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3276
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3277
		case WM_INPUT:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3278
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3279
			if (systemIni->MultiTouchEnabled() && DMultiTouch::iMultiTouchSupported && systemIni->GCEEnabled())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3280
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3281
				TInt screenNumber=ScreenFromHWND(hWnd,TheWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3282
				if(screenNumber==0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3283
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3284
					TheMultiTouch->OnWmInput(hWnd, message, wParam, lParam,TheChildWin[screenNumber]);	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3285
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3286
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3287
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3288
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3289
				Fault(EGuiInvalidMultiTouch);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3290
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3291
		   	break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3292
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3293
		default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3294
	        return(DefWindowProcA(hWnd,message,wParam,lParam));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3295
	    }
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3296
    return(FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3297
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3298
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3299
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3300
void SetStatusBarFont(HWND& aStatusBar)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3301
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3302
	int statwidths[] = {100,200,300,400,500,600,700,800};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3303
	SendMessage(aStatusBar, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3304
	HFONT hOrigFont = (HFONT) SendMessage(aStatusBar, WM_GETFONT, 0, 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3305
	SetProp(aStatusBar, TEXT("PROP_ORIGINAL_FONT"), (HANDLE) hOrigFont);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3306
	LOGFONT lf;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3307
	GetObject(hOrigFont, sizeof(lf), &lf);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3308
	lf.lfHeight = (long)(lf.lfHeight / 1.5);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3309
	lf.lfWeight = FW_NORMAL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3310
	HFONT hFont = CreateFontIndirect(&lf);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3311
	SetProp(aStatusBar, TEXT("PROP_ITALIC_FONT"), (HANDLE) hFont);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3312
	hFont = (HFONT) GetProp(hwndStatus, TEXT("PROP_ITALIC_FONT"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3313
	SendMessage(aStatusBar, WM_SETFONT, (WPARAM) hFont, FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3314
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3315
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3316
DWORD WINAPI KernelWindowThread(LPVOID aArg)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3317
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3318
// The kernel window thread.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3319
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3320
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3321
	HMODULE hmodule = GetModuleHandleA("winsgui.dll");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3322
	__ASSERT_ALWAYS(hmodule!=NULL,Fault(EGuiGetModuleHandle));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3323
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3324
	WNDCLASSA w;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3325
	memclr(&w, sizeof(WNDCLASSA));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3326
   	w.style=CS_OWNDC|CS_VREDRAW|CS_HREDRAW;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3327
   	w.lpfnWndProc=(WNDPROC)ctrlwinProc;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3328
   	w.hInstance=(HINSTANCE)aArg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3329
   	w.hIcon=LoadIconA((HINSTANCE)hmodule,MAKEINTRESOURCEA(EPOC_ICON));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3330
   	w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3331
   	w.lpszClassName="E32KernelControlWindow";
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3332
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3333
	ATOM a=RegisterClassA(&w);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3334
	__ASSERT_ALWAYS(a!=0,Fault(EGuiRegisterWindow));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3335
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3336
	RECT ctlrwindowRect={0,0,270,0};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3337
	AdjustWindowRect(&ctlrwindowRect,KControlWinStyle,FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3338
	TInt ctrlwindowWidth=ctlrwindowRect.right-ctlrwindowRect.left;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3339
	TInt ctrlwindowHeight=ctlrwindowRect.bottom-ctlrwindowRect.top;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3340
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3341
    TheControlWin=CreateWindowA(
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3342
		"E32KernelControlWindow",
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3343
		systemIni->iWindowTitle,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3344
		KInvisibleControlWinStyle,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3345
		KWinPosX,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3346
		KWinPosY,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3347
		ctrlwindowWidth,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3348
		ctrlwindowHeight,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3349
		(HWND)NULL,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3350
		NULL,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3351
		(HINSTANCE)aArg,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3352
		(LPSTR)NULL
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3353
		);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3354
	__ASSERT_ALWAYS(TheControlWin!=NULL,Fault(EGuiKernelWindowCreate));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3355
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3356
	memclr(&w, sizeof(WNDCLASSA));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3357
   	w.style=CS_OWNDC;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3358
   	w.lpfnWndProc=(WNDPROC)winProc;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3359
   	w.hInstance=(HINSTANCE)aArg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3360
   	w.hIcon=LoadIconA((HINSTANCE)hmodule,MAKEINTRESOURCEA(EPOC_ICON));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3361
   	w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3362
   	w.lpszClassName="E32KernelWindow";
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3363
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3364
	a=RegisterClassA(&w);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3365
	__ASSERT_ALWAYS(a!=0,Fault(EGuiRegisterWindow));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3366
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3367
	memclr(&w, sizeof(WNDCLASSA));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3368
	w.style=CS_OWNDC;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3369
	w.lpfnWndProc=(WNDPROC)childWinProc;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3370
	w.hInstance=(HINSTANCE)aArg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3371
	w.hCursor=LoadCursorA(NULL,MAKEINTRESOURCEA(32512)); //ICD_ARROW
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3372
	w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3373
	w.lpszMenuName=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3374
	w.lpszClassName="E32KernelChildWindow";
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3375
	a=RegisterClassA(&w);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3376
	__ASSERT_ALWAYS(a!=0,Fault(EGuiRegisterChildWindow));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3377
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3378
	if (masterIni && masterIni->iSystemInis.Count() > 1)	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3379
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3380
		//add Configuration Items to the system menu if there's > 1 config
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3381
		HMENU hMenu = GetSystemMenu(TheControlWin, FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3382
		InsertMenu(hMenu,5, MF_BYPOSITION|MF_SEPARATOR,0,NULL);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3383
		InsertMenuA(hMenu,6, MF_BYPOSITION|MF_STRING, 1, "Next Config...");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3384
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3385
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3386
	ShowWindow(TheControlWin,SW_SHOWDEFAULT);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3387
	UpdateWindow(TheControlWin);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3388
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3389
	//Create frame windows and child windows
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3390
	for(TInt screen=0;screen<systemIni->iScreens.Count();screen++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3391
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3392
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3393
		RECT windowRect={0,0,systemIni->iScreens[screen]->iXYInputWidth,systemIni->iScreens[screen]->iXYInputHeight};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3394
		AdjustWindowRect(&windowRect,KWinStyle,FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3395
		TInt windowWidth=windowRect.right-windowRect.left;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3396
		TInt windowHeight=windowRect.bottom-windowRect.top;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3397
    
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3398
		CHAR title[20];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3399
		wsprintfA(title, "Screen %d", screen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3400
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3401
		TheWin[screen]=CreateWindowA(
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3402
			"E32KernelWindow",
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3403
			title,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3404
			KInvisibleWinStyle,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3405
			KWinPosX,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3406
			KWinPosY,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3407
			windowWidth,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3408
			windowHeight,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3409
			(HWND)NULL,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3410
			NULL,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3411
			(HINSTANCE)aArg,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3412
			(LPSTR)NULL
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3413
			);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3414
		__ASSERT_ALWAYS(TheWin[screen]!=NULL,Fault(EGuiKernelWindowCreate));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3415
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3416
		LoadFasciaBitmap(screen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3417
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3418
		TheChildWin[screen]=CreateWindowA(
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3419
			"E32KernelChildWindow",
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3420
			"",
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3421
			WS_CHILDWINDOW|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3422
			systemIni->iScreens[screen]->iScreenOffsetX,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3423
			systemIni->iScreens[screen]->iScreenOffsetY,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3424
			systemIni->iScreens[screen]->iScreenWidth,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3425
			systemIni->iScreens[screen]->iScreenHeight,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3426
			TheWin[screen],
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3427
			NULL,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3428
			(HINSTANCE)aArg,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3429
			(LPSTR)NULL
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3430
			);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3431
		__ASSERT_ALWAYS(TheChildWin[screen]!=NULL,Fault(EGuiKernelChildWindowCreate));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3432
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3433
		// Create status bars
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3434
		if (systemIni->MultiTouchEnabled() && systemIni->GCEEnabled())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3435
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3436
			HMODULE hmodComCtl = LoadLibrary(TEXT("comctl32.dll"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3437
			typedef int (WINAPI* FNINITCC)();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3438
			FNINITCC pfnInitCommonControls = GetProcAddress(hmodComCtl, "InitCommonControls");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3439
			pfnInitCommonControls();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3440
			hwndStatus = CreateWindowExA(0, STATUSCLASSNAMEA, NULL,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3441
								WS_CHILD | WS_VISIBLE | CCS_BOTTOM ,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3442
									0,0,0,0,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3443
									TheWin[0], NULL, GetModuleHandle(NULL), NULL);                 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3444
			SetStatusBarFont(hwndStatus);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3445
			SetWindowPos(hwndStatus,NULL, 0,0,0,0,SWP_HIDEWINDOW);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3446
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3447
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3448
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3449
	//Restore window data from ini file if it exists. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3450
	HANDLE hSysIni = CreateFileA(systemIni->iSysIniFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3451
	TBool success=(hSysIni != INVALID_HANDLE_VALUE) ? ETrue : EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3452
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3453
	DWORD numRead;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3454
	TInt fileVersion=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3455
	if(success) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3456
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3457
		ReadFile(hSysIni, &fileVersion, sizeof(TInt), &numRead, 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3458
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3459
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3460
	//Check we are using a dat file created by this version of the program.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3461
	if(success && (fileVersion==KDatFileVersion) )
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3462
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3463
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3464
		TInt savedConfiguration=0; //set this to default configuration
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3465
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3466
		if(ReadFile(hSysIni, &savedConfiguration, sizeof(TInt), &numRead, 0) && (numRead>0) )
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3467
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3468
			//Don't restore the saved configuration, see INC114502.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3469
			//This could be reenabled in future as an optional operation
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3470
			//dependent on an entry in the epoc.ini file.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3471
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3472
			//SwitchConfiguration(savedConfiguration);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3473
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3474
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3475
		//restore each window to saved state
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3476
		for(TInt screen=0;screen<systemIni->iScreens.Count();screen++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3477
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3478
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3479
			//	If the .ini file was opened, get the saved settings for the windows position the last time
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3480
			//	this emulator was run, if any, and move the window accordingly.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3481
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3482
			TWindowState savedState;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3483
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3484
			TBool stateLoaded = ReadFile(hSysIni, &savedState, sizeof(TWindowState), &numRead, 0) && (numRead>0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3485
			 			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3486
			if (stateLoaded)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3487
				{				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3488
				//only allow window to be restored to 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3489
				//maximized or normal mode,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3490
				//this prevents it being restored in minimized mode
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3491
				//or others.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3492
				if(savedState.iWinPlace.showCmd != SW_MAXIMIZE)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3493
						savedState.iWinPlace.showCmd= SW_NORMAL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3494
				
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3495
				//if starting in same configuration and/or rotation as last time emulator was run
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3496
				//it makes sense to restore scroll offset, window position,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3497
				//and dimensions, if not, only restore position and window (ie. maximized/normal) state.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3498
				if(savedConfiguration == CurrentConfiguration &&
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3499
					savedState.iFlipstate == CurrentFlipState[screen])
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3500
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3501
					//Restore window placement
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3502
					SetWindowPlacement(TheWin[screen], &savedState.iWinPlace);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3503
					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3504
					TViewport& viewport = systemIni->iScreens[screen]->iViewport;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3505
								
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3506
					viewport.ScrollToX(savedState.iXoffset, TheWin[screen]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3507
					viewport.ScrollToY(savedState.iYoffset, TheWin[screen]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3508
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3509
				else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3510
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3511
					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3512
					RECT oldRect;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3513
					GetWindowRect(TheWin[screen], &oldRect);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3514
					//save default window dimensions
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3515
					TInt width=oldRect.right-oldRect.left;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3516
					TInt height=oldRect.bottom - oldRect.top;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3517
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3518
					//restore position and window state from file
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3519
					SetWindowPlacement(TheWin[screen], &savedState.iWinPlace);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3520
					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3521
					RECT currentRect;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3522
					GetWindowRect(TheWin[screen], &currentRect);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3523
					//keep default size.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3524
					MoveWindow(TheWin[screen],currentRect.left, currentRect.top, width, height, TRUE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3525
					
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3526
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3527
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3528
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3529
				// Check that enough of the recorded window position is visible on the screen
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3530
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3531
				TBool enoughVisible = false;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3532
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3533
				// vague values for ensuring we have enough of the window title bar to grab
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3534
				// if the window is partly off screen 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3535
				const TInt KTitleBarGrabX=80;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3536
				const TInt KTitleBarGrabY=50;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3537
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3538
				//inspect dimensions of the window to be restored.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3539
				RECT savedRect;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3540
				GetWindowRect(TheWin[screen], &savedRect);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3541
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3542
				SystemMonitors monitors;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3543
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3544
				if (monitors.Count() == 1)		/* Original algorithm */
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3545
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3546
					RECT rcIntersect, rcScreen;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3547
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3548
					SetRect(&rcScreen, KTitleBarGrabX, savedRect.bottom-savedRect.top,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3549
						GetSystemMetrics(SM_CXSCREEN)-KTitleBarGrabX, GetSystemMetrics(SM_CYSCREEN)-KTitleBarGrabY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3550
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3551
					enoughVisible = IntersectRect(&rcIntersect, &savedRect, &rcScreen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3552
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3553
				else							/* > 1 monitor; do it differently */
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3554
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3555
					RECT cornerBox1, cornerBox2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3556
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3557
					// The top-left corner box
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3558
					SetRect(&cornerBox1, savedRect.left, savedRect.top,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3559
						savedRect.left + KTitleBarGrabX, savedRect.top + KTitleBarGrabY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3560
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3561
					// The top-right corner box
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3562
					SetRect(&cornerBox2, savedRect.right - KTitleBarGrabX, savedRect.top,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3563
						savedRect.right, savedRect.top + KTitleBarGrabY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3564
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3565
					// Require one of these rectangles to be all on one monitor
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3566
					enoughVisible = monitors.RectAllOnOne(cornerBox1) || monitors.RectAllOnOne(cornerBox2);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3567
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3568
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3569
				if (!enoughVisible)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3570
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3571
					SetWindowPos(TheWin[screen], HWND_TOP, 0,0,0,0, SWP_NOSIZE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3572
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3573
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3574
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3575
			else //if there was no stored info for this screen
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3576
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3577
				ShowWindow(TheWin[screen],SW_MAXIMIZE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3578
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3579
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3580
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3581
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3582
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3583
		//use default configuration and make windows visible
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3584
		SwitchConfiguration(CurrentConfiguration);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3585
		for(TInt screen=0;screen<systemIni->iScreens.Count();screen++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3586
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3587
			ShowWindow(TheWin[screen],SW_MAXIMIZE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3588
			UpdateWindow(TheWin[screen]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3589
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3590
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3591
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3592
	//close file if it was opened	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3593
	if(success) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3594
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3595
		CloseHandle(hSysIni);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3596
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3597
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3598
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3599
	if (systemIni->iInitialFlipMsg != 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3600
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3601
		addKeyEvent(TRawEvent::EKeyDown,systemIni->iInitialFlipMsg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3602
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3603
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3604
	SetFocus(TheWin[0]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3605
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3606
	MSG m;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3607
	while (GetMessageA(&m,NULL,0,0))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3608
    	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3609
        DispatchMessageA(&m);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3610
	    }
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3611
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3612
	ExitProcess(m.wParam);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3613
	return 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3614
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3615
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3616
SystemMonitors::SystemMonitors(void)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3617
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3618
	TInt n;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3619
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3620
	iCount = 1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3621
	iHaveMultiMonFunctions = false;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3622
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3623
	if ((n = GetSystemMetrics(SM_CMONITORS)) <= 1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3624
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3625
		return;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3626
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3627
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3628
	HMODULE huser32 = GetModuleHandleA("user32.dll");
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3629
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3630
	// Get pointers to the APIs we want
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3631
	if (huser32 == NULL ||
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3632
		(ipMonitorFromRect =
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3633
		(HMONITOR (WINAPI *)(LPCRECT lprcScreenCoords, UINT uFlags))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3634
		GetProcAddress(huser32, "MonitorFromRect")) == NULL ||
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3635
		(ipGetMonitorInfo =
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3636
		(BOOL (WINAPI *)(HMONITOR hMonitor, LPMONITORINFO lpMonitorInfo))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3637
		GetProcAddress(huser32, "GetMonitorInfoA")) == NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3638
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3639
		return;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3640
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3641
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3642
	iCount = n;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3643
	iHaveMultiMonFunctions = true;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3644
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3645
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3646
TBool SystemMonitors::RectAllOnOne(RECT& rect)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3647
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3648
	HMONITOR monitor = MonitorFromRect(rect);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3649
	if (monitor == NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3650
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3651
		return false;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3652
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3653
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3654
	MONITORINFO monInfo;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3655
	monInfo.cbSize = sizeof(MONITORINFO);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3656
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3657
	if (! GetMonitorInfo(monitor, &monInfo))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3658
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3659
		return false;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3660
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3661
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3662
	RECT overlap;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3663
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3664
	if (IntersectRect(&overlap, &rect, &monInfo.rcWork) &&
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3665
		EqualRect(&overlap, &rect))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3666
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3667
		return true;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3668
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3669
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3670
	return false;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3671
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3672
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3673
HMONITOR SystemMonitors::MonitorFromRect(const RECT& rect, UINT flags)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3674
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3675
	if (! iHaveMultiMonFunctions)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3676
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3677
		return NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3678
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3679
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3680
	return (*ipMonitorFromRect)(&rect, flags);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3681
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3682
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3683
TBool SystemMonitors::GetMonitorInfo(HMONITOR monitor, LPMONITORINFO pMonInfo)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3684
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3685
	if (! iHaveMultiMonFunctions)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3686
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3687
		return false;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3688
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3689
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3690
	return (*ipGetMonitorInfo)(monitor, pMonInfo);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3691
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3692
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3693
void DrawLeds()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3694
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3695
	HDC winDC = GetDC(TheWin[0]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3696
	HDC hdcBits;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3697
	hdcBits=CreateCompatibleDC(winDC);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3698
	SelectObject(hdcBits,TheScreenBitmap[0]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3699
	HPEN pen=CreatePen(PS_SOLID,0,RGB(0,0,0));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3700
	SelectObject(hdcBits,pen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3701
	HBRUSH brush;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3702
	LOGBRUSH redbrush={BS_SOLID, RGB(0xff,0,0)};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3703
	LOGBRUSH greenbrush={BS_SOLID, RGB(0,0xff,0)};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3704
	LOGBRUSH blackbrush={BS_SOLID, RGB(0,0,0)};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3705
	// red
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3706
	if (LedMask & KLedMaskRed1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3707
		brush=CreateBrushIndirect(&redbrush);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3708
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3709
		brush=CreateBrushIndirect(&blackbrush);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3710
	SelectObject(hdcBits,brush);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3711
	DWinsUi *ini=systemIni;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3712
	Ellipse(hdcBits, ini->iLedOffsetX, ini->iLedOffsetY, ini->iLedOffsetX+ini->iLedSize, ini->iLedOffsetY+ini->iLedSize);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3713
	DeleteObject(brush);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3714
	// green
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3715
	if (LedMask & KLedMaskGreen1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3716
		brush=CreateBrushIndirect(&greenbrush);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3717
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3718
		brush=CreateBrushIndirect(&blackbrush);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3719
	SelectObject(hdcBits,brush);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3720
	if (ini->iLedVertical)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3721
		Ellipse(hdcBits, ini->iLedOffsetX, ini->iLedOffsetY+ini->iLedSize+ini->iLedGap,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3722
		ini->iLedOffsetX+ini->iLedSize, ini->iLedOffsetY+ini->iLedSize+ini->iLedGap+ini->iLedSize);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3723
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3724
		Ellipse(hdcBits, ini->iLedOffsetX+ini->iLedSize+ini->iLedGap, ini->iLedOffsetY,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3725
		ini->iLedOffsetX+ini->iLedSize+ini->iLedGap+ini->iLedSize, ini->iLedOffsetY+ini->iLedSize);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3726
	DeleteObject(brush);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3727
	DeleteObject(pen);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3728
	DeleteDC(hdcBits);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3729
	ReleaseDC(TheWin[0], winDC);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3730
	if (ini->iLedVertical)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3731
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3732
		RECT r={ini->iLedOffsetX,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3733
			ini->iLedOffsetY,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3734
			ini->iLedOffsetX+ini->iLedSize,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3735
			ini->iLedOffsetY+ini->iLedSize+ini->iLedGap+ini->iLedSize};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3736
		InvalidateRect(TheWin[0], &r, FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3737
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3738
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3739
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3740
		RECT r={ini->iLedOffsetX,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3741
			ini->iLedOffsetY,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3742
			ini->iLedOffsetX+ini->iLedSize+ini->iLedGap+ini->iLedSize,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3743
			ini->iLedOffsetY+ini->iLedSize};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3744
		InvalidateRect(TheWin[0], &r, FALSE);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3745
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3746
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3747
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3748
void DWinsUi::ScreenInfo(TScreenInfoV01& aInfo)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3749
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3750
// Return screen 0 info to the window server.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3751
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3752
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3753
	aInfo.iWindowHandleValid=ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3754
	aInfo.iWindowHandle=TheChildWin[0];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3755
	aInfo.iScreenAddressValid=EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3756
	aInfo.iScreenAddress=NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3757
	aInfo.iScreenSize.iWidth = iScreens[0]->iMaxScreenWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3758
	aInfo.iScreenSize.iHeight = iScreens[0]->iMaxScreenHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3759
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3760
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3761
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3762
TBool DWinsUi::VideoInfo(TInt aScreenNumber, TVideoInfoV01& aInfo)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3763
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3764
	return VideoInfo(aScreenNumber,iScreens[aScreenNumber&KMaskScreenNum]->iCurrentMode,aInfo);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3765
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3766
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3767
/// Could fail if flip mode is not supported
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3768
TBool DWinsUi::VideoInfo(TInt aScreenNumber,TInt aModeNumber, TVideoInfoV01& aInfo)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3769
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3770
	aScreenNumber &= KMaskScreenNum;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3771
	if (aScreenNumber>=iScreens.Count())
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3772
		return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3773
	if (masterIni->iBufferSet.Count() && masterIni->iBufferSet[aScreenNumber].iDisplayDriverCount > 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3774
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3775
			return VideoInfoForDisplayDriver(aScreenNumber,aModeNumber,aInfo);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3776
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3777
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3778
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3779
		if ((aModeNumber&KMaskModeNum)>=1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3780
			return EFalse;	//non-gce emulator doesn't support changing the mode number.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3781
		DScreenProperties* screenProperties=iScreens[aScreenNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3782
		aInfo.iSizeInPixels.iWidth = screenProperties->iMaxScreenWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3783
		aInfo.iSizeInPixels.iHeight = screenProperties->iMaxScreenHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3784
		aInfo.iSizeInTwips.iWidth = screenProperties->iMaxPhysicalScreenWidth ? screenProperties->iMaxPhysicalScreenWidth : TInt(screenProperties->iScreenWidth*KDefaultPixelsToTwipsX);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3785
		aInfo.iSizeInTwips.iHeight = screenProperties->iMaxPhysicalScreenHeight ? screenProperties->iMaxPhysicalScreenHeight : TInt(screenProperties->iScreenHeight*KDefaultPixelsToTwipsY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3786
		aInfo.iIsMono = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3787
		aInfo.iIsPalettized = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3788
		aInfo.iDisplayMode=screenProperties->iCurrentMode;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3789
		aInfo.iIsPixelOrderRGB = ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3790
		aInfo.iIsPixelOrderLandscape=ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3791
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3792
		aInfo.iVideoAddress =  (TInt)TheChildWin[aScreenNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3793
		aInfo.iBitsPerPixel = screenProperties->iColorDepth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3794
		aInfo.iOffsetToFirstPixel=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3795
		aInfo.iOffsetBetweenLines=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3796
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3797
	return ETrue;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3798
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3799
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3800
/** Could fail if flip mode is not supported.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3801
 Note that this method is inteneded to be called directly to parameterise the setting up of the display driver,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3802
 so it must survive absense of the display driver installation!
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3803
**/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3804
 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3805
TBool DWinsUi::VideoInfoForDisplayDriver(TInt aScreenNumber,TInt aModeNumber, TVideoInfoV01& aInfo,  TBool aRealWidthAndHeight)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3806
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3807
	aScreenNumber &= KMaskScreenNum;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3808
	DScreenProperties* screenProperties = iScreens[aScreenNumber];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3809
	if ((aModeNumber&KMaskModeNum) >= screenProperties->iMaxModes)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3810
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3811
		return EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3812
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3813
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3814
	aInfo.iSizeInPixels.iWidth = aRealWidthAndHeight ? screenProperties->iScreenWidth : screenProperties->iMaxScreenWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3815
	aInfo.iSizeInPixels.iHeight = aRealWidthAndHeight ? screenProperties->iScreenHeight : screenProperties->iMaxScreenHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3816
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3817
	if (aRealWidthAndHeight==EFalse)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3818
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3819
		aInfo.iSizeInTwips.iWidth = screenProperties->iMaxPhysicalScreenWidth ?	screenProperties->iMaxPhysicalScreenWidth : TInt(screenProperties->iScreenWidth*KDefaultPixelsToTwipsX);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3820
		aInfo.iSizeInTwips.iHeight = screenProperties->iMaxPhysicalScreenHeight ? screenProperties->iMaxPhysicalScreenHeight : TInt(screenProperties->iScreenHeight*KDefaultPixelsToTwipsY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3821
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3822
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3823
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3824
		aInfo.iSizeInTwips.iWidth = screenProperties->iPhysicalScreenWidth ? screenProperties->iPhysicalScreenWidth : TInt(screenProperties->iScreenWidth*KDefaultPixelsToTwipsX);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3825
		aInfo.iSizeInTwips.iHeight = screenProperties->iPhysicalScreenHeight ? screenProperties->iPhysicalScreenHeight : TInt(screenProperties->iScreenHeight*KDefaultPixelsToTwipsY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3826
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3827
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3828
	aInfo.iIsMono = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3829
	aInfo.iIsPalettized = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3830
	aInfo.iDisplayMode=screenProperties->iCurrentMode;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3831
	aInfo.iIsPixelOrderRGB = ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3832
	aInfo.iIsPixelOrderLandscape=ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3833
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3834
	// Set memory to iVideoAddress to NULL to trigger the HAL code into querying the video address
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3835
	// separately
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3836
	aInfo.iVideoAddress = NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3837
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3838
	TInt bpp=screenProperties->iModeDepths[aModeNumber&KMaskModeNum];												
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3839
	aInfo.iBitsPerPixel=bpp;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3840
	if (bpp>8)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3841
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3842
		bpp=(bpp+15)&-16;	//12 & 16 --> 16 ; 24 & 32 --> 32
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3843
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3844
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3845
	aInfo.iOffsetToFirstPixel=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3846
#ifdef TEST_GCE_VARIABLE_START_EXTRA
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3847
	aInfo.iOffsetToFirstPixel+= TEST_GCE_VARIABLE_START_EXTRA*(1+aModeNumber&KMaskScreenModeNum);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3848
	if ((aModeNumber& KModeFlagFlipped)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3849
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3850
#ifndef ASSYMETRIC_SQUARE_STRIDE		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3851
		if (aInfo.iSizeInPixels.iWidth!=aInfo.iSizeInPixels.iHeight)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3852
#endif
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3853
			aInfo.iOffsetToFirstPixel+= TEST_GCE_VARIABLE_START_EXTRA*KEmulMaxNumModes;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3854
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3855
#endif
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3856
	if (aModeNumber& KModeFlagFlipped)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3857
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3858
		// we calculate the number of bytes per scanline that MUST be a multiple of 32 bits word (alignment)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3859
		// screenProperties->iMaxScreenHeight * bpp represnts the number of bits per scanline
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3860
		// +31 is the ceiling
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3861
		// we shift right (>>3) because there are 8 bits/byte
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3862
		// we mask with ~3 because we are intrested in the octet value
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3863
		aInfo.iOffsetBetweenLines=((screenProperties->iMaxScreenHeight * bpp + 31) >> 3) & ~3;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3864
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3865
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3866
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3867
		// please see the comment above
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3868
		aInfo.iOffsetBetweenLines=((screenProperties->iMaxScreenWidth * bpp + 31) >> 3) & ~3;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3869
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3870
#ifdef  TEST_GCE_VARIABLE_STRIDE_EXTRA
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3871
	aInfo.iOffsetBetweenLines+=TEST_GCE_VARIABLE_STRIDE_EXTRA;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3872
#endif	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3873
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3874
	return ETrue;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3875
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3876
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3877
TInt DMasterIni::DoHalFunction(TAny* aPtr, TInt aFunction, TAny* a1, TAny* a2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3878
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3879
	return masterIni->HalFunction((TInt)aPtr,aFunction,a1,a2);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3880
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3881
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3882
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3883
TInt DMasterIni::HalFunction(TInt aDeviceNumber, TInt aFunction, TAny* a1, TAny* a2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3884
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3885
	if (TUint(aDeviceNumber) >= TUint(systemIni->iScreens.Count()))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3886
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3887
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3888
	TInt mode;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3889
	TInt maxMode=1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3890
	TInt r=KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3891
	switch(aFunction)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3892
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3893
		case EDisplayHalScreenInfo:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3894
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3895
			TPckgBuf<TScreenInfoV01> vPckg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3896
			systemIni->ScreenInfo(vPckg());
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3897
			Kern::InfoCopy(*(TDes8*)a1,vPckg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3898
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3899
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3900
		case EDisplayHalWsRegisterSwitchOnScreenHandling:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3901
			WsSwitchOnScreen=(TBool)a1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3902
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3903
		case EDisplayHalSetState:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3904
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3905
			if(!Kern::CurrentThreadHasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetState")))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3906
				return KErrPermissionDenied;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3907
			if ((TBool)a1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3908
				WinsGuiPowerHandler->ScreenOn(aDeviceNumber);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3909
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3910
				WinsGuiPowerHandler->ScreenOff(aDeviceNumber);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3911
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3912
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3913
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3914
		case EDisplayHalState:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3915
			*(TInt*)a1=!systemIni->iScreens[aDeviceNumber]->iScreenOff;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3916
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3917
		case EDisplayHalWsSwitchOnScreen:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3918
			WinsGuiPowerHandler->ScreenOn();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3919
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3920
		case EDisplayHalMaxDisplayContrast:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3921
			kumemput32(a1,&KMaxDisplayContrast,sizeof(KMaxDisplayContrast));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3922
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3923
		case EDisplayHalDisplayContrast:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3924
			kumemput32(a1,&systemIni->iScreens[aDeviceNumber]->iDisplayContrast,sizeof(systemIni->iScreens[aDeviceNumber]->iDisplayContrast));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3925
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3926
		case EDisplayHalSetDisplayContrast:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3927
			if(!Kern::CurrentThreadHasCapability(ECapabilityWriteDeviceData,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetDisplayContrast")))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3928
				return KErrPermissionDenied;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3929
			if (TUint(a1) <= TUint(KMaxDisplayContrast))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3930
				systemIni->iScreens[aDeviceNumber]->iDisplayContrast = TInt(a1);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3931
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3932
				r = KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3933
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3934
		case EDisplayHalBacklightOn:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3935
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3936
			TBool c = EFalse;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3937
			kumemput32(a1,&c,sizeof(TBool));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3938
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3939
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3940
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3941
		case EDisplayHalCurrentModeInfo:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3942
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3943
			//a1 has ptr to buffer for results
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3944
			TPckgBuf<TVideoInfoV01> vPckg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3945
			if (systemIni->VideoInfo(aDeviceNumber, vPckg()))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3946
				Kern::InfoCopy(*(TDes8*)a1,vPckg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3947
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3948
				r=KErrNotSupported;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3949
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3950
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3951
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3952
		case EDisplayHalSpecifiedModeInfo:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3953
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3954
			kumemget32(&mode, a1, sizeof(mode));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3955
			TPckgBuf<TVideoInfoV01> vPckg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3956
			if (!systemIni->VideoInfo(aDeviceNumber, mode, vPckg()))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3957
				return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3958
			Kern::InfoCopy(*(TDes8*)a2, vPckg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3959
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3960
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3961
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3962
		case EDisplayHalSetMode:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3963
// 			if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetMode")))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3964
// 				return KErrPermissionDenied;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3965
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3966
			//Note that at present the HAL mode does not apparently get set when the CFbsScreenDevice requires a different mode.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3967
			//At least in the emulator and default h4 implementation...
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3968
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3969
			mode=KMaskModeNum&(TInt) a1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3970
			maxMode=1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3971
			//can't avoid this behaviour change test against gce loaded 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3972
			if (masterIni->iBufferSet.Count() &&  masterIni->iBufferSet[aDeviceNumber].iDisplayDriverCount > 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3973
				maxMode=systemIni->iScreens[aDeviceNumber]->iMaxModes;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3974
			if (mode >=maxMode || mode<0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3975
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3976
				r = KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3977
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3978
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3979
			//Harmless/Pointless in vanilla wins mode.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3980
			systemIni->iScreens[aDeviceNumber]->iCurrentMode=mode;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3981
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3982
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3983
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3984
		case EDisplayHalMode:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3985
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3986
			//This is always 0 in non-gce emulator
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3987
			kumemput32(a1,&systemIni->iScreens[aDeviceNumber]->iCurrentMode,sizeof(systemIni->iScreens[aDeviceNumber]->iCurrentMode));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3988
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3989
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3990
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3991
		case EDisplayHalModeCount:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3992
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3993
			//Need to actually count them here!
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3994
			//GCE will ignore modes<=8
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3995
			TInt encodedMode=1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3996
			if (masterIni->iBufferSet.Count() &&  masterIni->iBufferSet[aDeviceNumber].iDisplayDriverCount > 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3997
				encodedMode=systemIni->iScreens[aDeviceNumber]->iMaxModes;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3998
			kumemput32(a1,&encodedMode,sizeof(encodedMode));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  3999
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4000
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4001
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4002
		case EDisplayHalColors:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4003
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4004
			TInt deepestMode=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4005
			if (masterIni->iBufferSet.Count()==0 ||  masterIni->iBufferSet[aDeviceNumber].iDisplayDriverCount <= 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4006
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4007
				deepestMode = KMaxDisplayColors;  	//I could try and work it out, but this is what used to happen!
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4008
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4009
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4010
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4011
				TInt maxBpp=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4012
				for (TInt i=0,maxI=systemIni->iScreens[aDeviceNumber]->iMaxModes;i<maxI;i++)	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4013
					if (systemIni->iScreens[aDeviceNumber]->iModeDepths[i]>maxBpp)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4014
						maxBpp=systemIni->iScreens[aDeviceNumber]->iModeDepths[i];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4015
				deepestMode= 1<<maxBpp;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4016
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4017
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4018
			kumemput32(a1,&deepestMode,sizeof(deepestMode));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4019
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4020
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4021
		case EDisplayHalGetDisplayMemoryHandle:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4022
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4023
			TInt val = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4024
			TInt passedIn = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4025
			kumemget32(&passedIn, a1, sizeof(TInt));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4026
			if (passedIn != -1)	//not from a getall
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4027
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4028
				NKern::ThreadEnterCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4029
				if (!(masterIni->iBufferSet.Count() == 0 || masterIni->iBufferSet[aDeviceNumber].iDisplayDriverCount <= 0 ))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4030
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4031
						r = masterIni->DisplayMemoryHandle(aDeviceNumber, val); 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4032
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4033
				else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4034
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4035
					r = KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4036
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4037
				NKern::ThreadLeaveCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4038
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4039
			kumemput32(a1, &val, sizeof(TInt));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4040
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4041
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4042
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4043
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4044
		case EDisplayHalGetDisplayMemoryAddress:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4045
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4046
			TInt val = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4047
			TInt passedIn = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4048
			kumemget32(&passedIn, a1, sizeof(TInt));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4049
			if (passedIn != -1)	//not from a getall
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4050
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4051
				if (!(masterIni->iBufferSet.Count() == 0 || masterIni->iBufferSet[aDeviceNumber].iDisplayDriverCount <= 0 ))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4052
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4053
					r = masterIni->DisplayMemoryAddress(aDeviceNumber, val);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4054
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4055
				else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4056
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4057
					r = KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4058
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4059
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4060
			kumemput32(a1, &val, sizeof(TInt));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4061
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4062
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4063
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4064
		case EDisplayHalNumberOfResolutions:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4065
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4066
			r = NumberOfResolutions(aDeviceNumber, a1, a2);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4067
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4068
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4069
		case EDisplayHalSpecificScreenInfo:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4070
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4071
			r = SpecificScreenInfo(aDeviceNumber, a1, a2);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4072
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4073
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4074
		case EDisplayHalCurrentScreenInfo:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4075
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4076
			r = CurrentScreenInfo(aDeviceNumber, a1, a2);			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4077
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4078
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4079
		case EDisplayHalSetDisplayState:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4080
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4081
			//increase the spinner at both beginning and end of resetting the display state
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4082
			NKern::LockedInc(iBufferSet[aDeviceNumber].iStateChangeCount);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4083
			kumemget32(&iBufferSet[aDeviceNumber].iDisplayState, a1, sizeof(TInt));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4084
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4085
			switch(iBufferSet[aDeviceNumber].iDisplayState)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4086
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4087
				case ENoResolution:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4088
				case EDisconnect:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4089
				case ESingleResolution:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4090
					// the fascia effect of 0x0 resolution
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4091
					SetDisplaySize(aDeviceNumber, 0, 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4092
					break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4093
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4094
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4095
			NKern::LockedInc(iBufferSet[aDeviceNumber].iStateChangeCount);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4096
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4097
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4098
		case EDisplayHalGetStateSpinner:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4099
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4100
			kumemput32(a1,&iBufferSet[aDeviceNumber].iStateChangeCount,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4101
					sizeof(iBufferSet[aDeviceNumber].iStateChangeCount));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4102
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4103
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4104
		default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4105
			r=KErrNotSupported;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4106
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4107
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4108
	return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4109
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4110
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4111
TInt DMasterIni::NumberOfResolutions(TInt aDeviceNumber, TAny* a1, TAny* a2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4112
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4113
	TInt numberOfConfigs;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4114
	switch(iBufferSet[aDeviceNumber].iDisplayState)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4115
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4116
		case ENoResolution:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4117
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4118
			numberOfConfigs = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4119
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4120
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4121
		case EDisconnect:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4122
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4123
			return KErrDisconnected;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4124
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4125
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4126
		case ESingleResolution:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4127
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4128
			numberOfConfigs = 1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4129
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4130
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4131
		case ENormalResolution:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4132
		default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4133
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4134
			numberOfConfigs = iSystemInis.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4135
			if (numberOfConfigs > 1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4136
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4137
				TVideoInfoV01 info1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4138
				TVideoInfoV01 info2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4139
				iSystemInis[0]->VideoInfoForDisplayDriver(aDeviceNumber, 0, info1, ETrue);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4140
				iSystemInis[1]->VideoInfoForDisplayDriver(aDeviceNumber, 0, info2, ETrue);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4141
				if (info1.iSizeInPixels.iWidth == info2.iSizeInPixels.iWidth &&
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4142
						info1.iSizeInPixels.iHeight == info2.iSizeInPixels.iHeight)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4143
					{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4144
					numberOfConfigs = 1;	//It looks like all resolutions for this device are the same
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4145
					}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4146
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4147
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4148
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4149
	kumemput32(a1,&numberOfConfigs,sizeof(numberOfConfigs));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4150
	if(a2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4151
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4152
		kumemput32(a2,&(iBufferSet[aDeviceNumber].iStateChangeCount),sizeof(iBufferSet[aDeviceNumber].iStateChangeCount));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4153
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4154
	return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4155
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4156
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4157
TInt DMasterIni::SpecificScreenInfo(TInt aDeviceNumber, TAny* a1, TAny* a2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4158
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4159
	TInt config;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4160
	switch(iBufferSet[aDeviceNumber].iDisplayState)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4161
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4162
		case ENoResolution: //Do Nothing
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4163
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4164
		case EDisconnect:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4165
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4166
			return KErrDisconnected;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4167
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4168
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4169
		case ESingleResolution: //fill (0,0) as the only element in resolution array
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4170
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4171
			if(*(TInt*)a1 == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4172
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4173
				TVideoInfoV01 info;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4174
				info.iSizeInPixels.iHeight = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4175
				info.iSizeInPixels.iWidth = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4176
				info.iSizeInTwips.iHeight = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4177
				info.iSizeInTwips.iWidth = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4178
				TPtr8 infoPtr((TUint8*)&info, sizeof(info), sizeof(info));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4179
				Kern::InfoCopy(*(TDes8*)a2, infoPtr);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4180
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4181
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4182
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4183
		case ENormalResolution:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4184
		default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4185
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4186
			kumemget32(&config, a1, sizeof(config));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4187
			TPckgBuf<TVideoInfoV01> vPckg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4188
			iSystemInis[config]->VideoInfoForDisplayDriver(aDeviceNumber, 0, vPckg(), ETrue);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4189
			Kern::InfoCopy(*(TDes8*)a2,vPckg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4190
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4191
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4192
	return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4193
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4194
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4195
TInt DMasterIni::CurrentScreenInfo(TInt aDeviceNumber, TAny* a1, TAny* /*a2*/)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4196
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4197
	switch(iBufferSet[aDeviceNumber].iDisplayState)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4198
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4199
		case ENoResolution: //Do Nothing
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4200
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4201
		case EDisconnect:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4202
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4203
			return KErrDisconnected;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4204
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4205
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4206
		case ESingleResolution: //fill (0,0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4207
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4208
			TVideoInfoV01 info;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4209
			info.iSizeInPixels.iHeight = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4210
			info.iSizeInPixels.iWidth = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4211
			info.iSizeInTwips.iHeight = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4212
			info.iSizeInTwips.iWidth = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4213
			TPtr8 infoPtr((TUint8*)&info, sizeof(info), sizeof(info));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4214
			Kern::InfoCopy(*(TDes8*)a1, infoPtr);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4215
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4216
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4217
		case ENormalResolution:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4218
		default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4219
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4220
			TPckgBuf<TVideoInfoV01> vPckg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4221
			systemIni->VideoInfoForDisplayDriver(aDeviceNumber, 0, vPckg(), ETrue);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4222
			Kern::InfoCopy(*(TDes8*)a1,vPckg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4223
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4224
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4225
	return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4226
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4227
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4228
TInt DMasterIni::DoXYHalFunction(TAny* aThis, TInt aFunction, TAny* a1, TAny* a2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4229
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4230
	return static_cast<DMasterIni*>(aThis)->XYHalFunction(aFunction,a1,a2);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4231
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4232
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4233
TInt DMasterIni::XYHalFunction(TInt aFunction, TAny* a1, TAny* a2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4234
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4235
	TInt r=KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4236
	switch(aFunction)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4237
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4238
		case EDigitiserHalXYInfo:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4239
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4240
			if(systemIni->iXYInputType==EXYInputPointer)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4241
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4242
				TPckgBuf<TDigitiserInfoV01> vPckg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4243
				TDigitiserInfoV01& xyinfo=vPckg();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4244
				xyinfo.iDigitiserSize.iWidth=max(systemIni->iScreens[0]->iXYInputWidth,systemIni->iScreens[0]->iMaxScreenWidth+systemIni->iScreens[0]->iScreenOffsetX);		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4245
				xyinfo.iDigitiserSize.iHeight=max(systemIni->iScreens[0]->iXYInputHeight,systemIni->iScreens[0]->iMaxScreenHeight+systemIni->iScreens[0]->iScreenOffsetY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4246
				xyinfo.iOffsetToDisplay.iX=systemIni->iScreens[0]->iScreenOffsetX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4247
				xyinfo.iOffsetToDisplay.iY=systemIni->iScreens[0]->iScreenOffsetY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4248
				Kern::InfoCopy(*(TDes8*)a1,vPckg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4249
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4250
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4251
				r=KErrNotSupported;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4252
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4253
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4254
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4255
		// a2 = TBool aSet (ETrue for setting, EFalse for retrieval) 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4256
		// a1 = TDigitizerOrientation (set)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4257
		// a1 = &TDigitizerOrientation (get)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4258
		// Assume screen [0] here as this HAL function is only registered for
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4259
		// screen 0 on the emulator platform. Function only called if display==0
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4260
		case EDigitiserOrientation:	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4261
			if ((TBool)a2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4262
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4263
				// Set the orientation attribute
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4264
				// In case user thread, check it has WDD capability
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4265
				if(!Kern::CurrentThreadHasCapability(ECapabilityWriteDeviceData,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDigitiserOrientation")))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4266
					return KErrPermissionDenied;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4267
				systemIni->iScreens[0]->iXYOrientation = (TInt)a1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4268
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4269
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4270
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4271
				// Get the orientation attribute, safe copy it into user memory
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4272
				kumemput32(a1, &(systemIni->iScreens[0]->iXYOrientation), sizeof(TInt));	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4273
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4274
			break; 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4275
			
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4276
		default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4277
			r=KErrNotSupported;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4278
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4279
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4280
	return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4281
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4282
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4283
TInt DMasterIni::DoMouseHalFunction(TAny* aThis, TInt aFunction, TAny* a1, TAny* a2)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4284
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4285
	return static_cast<DMasterIni*>(aThis)->MouseHalFunction(aFunction,a1,a2);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4286
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4287
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4288
TInt DMasterIni::MouseHalFunction(TInt aFunction, TAny* a1, TAny* /*a2*/)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4289
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4290
	TInt r=KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4291
	switch(aFunction)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4292
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4293
		case EMouseHalMouseInfo:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4294
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4295
			if(systemIni->iXYInputType==EXYInputMouse || systemIni->iXYInputType==EXYInputDeltaMouse)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4296
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4297
				TPckgBuf<TMouseInfoV01> vPckg;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4298
				TMouseInfoV01& xyinfo=vPckg();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4299
				xyinfo.iMouseButtons=2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4300
				xyinfo.iMouseAreaSize.iWidth=max(systemIni->iScreens[0]->iXYInputWidth,systemIni->iScreens[0]->iMaxScreenWidth+systemIni->iScreens[0]->iScreenOffsetX);		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4301
				xyinfo.iMouseAreaSize.iHeight=max(systemIni->iScreens[0]->iXYInputHeight,systemIni->iScreens[0]->iMaxScreenHeight+systemIni->iScreens[0]->iScreenOffsetY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4302
				xyinfo.iOffsetToDisplay.iX=systemIni->iScreens[0]->iScreenOffsetX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4303
				xyinfo.iOffsetToDisplay.iY=systemIni->iScreens[0]->iScreenOffsetY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4304
				Kern::InfoCopy(*(TDes8*)a1,vPckg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4305
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4306
			else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4307
				r=KErrNotSupported;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4308
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4309
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4310
		default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4311
			r=KErrNotSupported;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4312
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4313
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4314
	return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4315
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4316
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4317
TInt DMasterIni::DoKbdHalFunction(TAny* /*aThis*/, TInt aFunction, TAny* /*a1*/, TAny* /*a2*/)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4318
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4319
	// don't actually do anything, just enough to report a Keyboard is present
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4320
	TInt r=KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4321
	if(aFunction!=EKeyboardHalKeyboardInfo)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4322
		r=KErrNotSupported;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4323
	return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4324
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4325
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4326
void Inactive()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4327
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4328
// Window has been minimised.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4329
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4330
    {
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4331
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4332
	TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4333
	v.Set(TRawEvent::EInactive);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4334
    TheEventQ.Add(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4335
    }
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4336
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4337
void UpdateModifiers()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4338
//Updates the modifier key states and sends an event to wserv about the 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4339
//change in state
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4340
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4341
	TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4342
	TInt modifiers=0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4343
    if(GetKeyState(VK_SCROLL)&1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4344
        modifiers|=EModifierScrollLock;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4345
    if(GetKeyState(VK_NUMLOCK)&1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4346
        modifiers|=EModifierNumLock;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4347
    if(GetKeyState(VK_CAPITAL)&1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4348
        modifiers|=EModifierCapsLock;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4349
    v.Set(TRawEvent::EUpdateModifiers,modifiers);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4350
    TheEventQ.Add(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4351
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4352
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4353
void Active()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4354
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4355
// Window has been restored.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4356
// Update the toggling modifiers, reset any others
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4357
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4358
    {
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4359
	TRawEvent v;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4360
    UpdateModifiers();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4361
    v.Set(TRawEvent::EActive);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4362
    TheEventQ.Add(v);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4363
    }
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4364
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4365
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4366
void ClearScreen()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4367
    {
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4368
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4369
    }
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4370
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4371
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4372
TInt DWinsUi::GetVirtualKey(TEmulCommand& aCommand, TInt aX, TInt aY)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4373
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4374
	//if the point is in the list of shapes, set the key and return true
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4375
	for (TInt keyCount = iVirtualKeys.Count(); --keyCount >= 0; )
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4376
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4377
		const VirtualKey& vk = *iVirtualKeys[keyCount];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4378
		if (vk.Contains(aX, aY))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4379
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4380
			aCommand = vk.Command();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4381
			return vk.Value();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4382
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4383
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4384
	return -1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4385
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4386
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4387
void DWinsUi::TranslateMouseCoords(const TEmulatorFlip aFlipState, const TInt aX, const TInt aY, const TInt aRegionWidth, const TInt aRegionHeight, TInt& aNewX, TInt& aNewY)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4388
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4389
	switch (aFlipState)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4390
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4391
		case EEmulatorFlipRestore:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4392
			aNewX = aX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4393
			aNewY = aY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4394
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4395
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4396
		case EEmulatorFlipInvert:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4397
			aNewX = aRegionWidth - aX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4398
			aNewY = aRegionHeight - aY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4399
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4400
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4401
		case EEmulatorFlipLeft:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4402
			aNewX = aRegionWidth - aY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4403
			aNewY = aX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4404
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4405
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4406
		case EEmulatorFlipRight:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4407
			aNewX = aY;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4408
			aNewY = aRegionHeight - aX;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4409
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4410
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4411
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4412
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4413
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4414
TBool DWinsUi::OnScreen(TInt aScreen, TInt ax, TInt ay) const
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4415
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4416
// Checks if a point within the Emulator window is on the screen
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4417
//
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4418
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4419
	return (TUint(ax) < TUint(systemIni->iScreens[aScreen]->iScreenWidth) && TUint(ay) < TUint(systemIni->iScreens[aScreen]->iScreenHeight));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4420
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4421
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4422
TInt DWinsUi::Create(TInt aId)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4423
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4424
	TInt r = SetupProperties(aId);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4425
	if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4426
		return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4427
	TInt screen;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4428
	DScreenProperties* currentScreen = NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4429
	for(screen=0;screen<iScreens.Count();screen++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4430
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4431
		BITMAPINFOHEADER bitmapinfo;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4432
		currentScreen = iScreens[screen];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4433
		if (readBitmapInfo(&bitmapinfo, currentScreen->iFasciaFileName) == KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4434
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4435
			currentScreen->iXYInputWidth=bitmapinfo.biWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4436
			currentScreen->iXYInputHeight=bitmapinfo.biHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4437
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4438
		currentScreen->iXYInputWidth=max(currentScreen->iXYInputWidth,currentScreen->iScreenWidth+currentScreen->iScreenOffsetX);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4439
		currentScreen->iXYInputHeight=max(currentScreen->iXYInputHeight,currentScreen->iScreenHeight+currentScreen->iScreenOffsetY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4440
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4441
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4442
	currentScreen = iScreens[0];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4443
	//note digitizer offsets are relative to EPOC screen 0
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4444
	if (-1 == iDigitizerWidth)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4445
		iDigitizerWidth = currentScreen->iXYInputWidth - 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4446
			(currentScreen->iScreenOffsetX + iDigitizerOffsetX);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4447
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4448
		currentScreen->iXYInputWidth=max(currentScreen->iXYInputWidth,iDigitizerWidth);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4449
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4450
	if (-1 == iDigitizerHeight)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4451
		iDigitizerHeight = currentScreen->iXYInputHeight - 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4452
			(currentScreen->iScreenOffsetY + iDigitizerOffsetY);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4453
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4454
		currentScreen->iXYInputHeight=max(currentScreen->iXYInputHeight,iDigitizerHeight);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4455
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4456
	return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4457
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4458
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4459
const RDisplayChannel::TPixelFormat DMasterIni::iSupportedPixelFormatTable[] =
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4460
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4461
		EUidPixelFormatXRGB_8888,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4462
		EUidPixelFormatARGB_8888,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4463
		EUidPixelFormatARGB_8888_PRE,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4464
		EUidPixelFormatXRGB_4444,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4465
		EUidPixelFormatARGB_4444,
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4466
		EUidPixelFormatRGB_565 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4467
	};
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4468
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4469
const TInt DMasterIni::iSupportedPixelFormatTableSize = static_cast<TInt>(sizeof(iSupportedPixelFormatTable)/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4470
		                                                                  sizeof(iSupportedPixelFormatTable[0]));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4471
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4472
void DMasterIni::InitBufferFormat(DScreenProperties& aScreenProperties, RDisplayChannel::TBufferFormat& aBufferFormat)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4473
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4474
	TUint bitsPerPixel = MaximumBitDepthFromMask(aScreenProperties.iColorDepth);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4475
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4476
	aBufferFormat.iSize.iWidth = aScreenProperties.iMaxScreenWidth;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4477
	aBufferFormat.iSize.iHeight = aScreenProperties.iMaxScreenHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4478
	switch (bitsPerPixel)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4479
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4480
	case 12:	// XRGB4444
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4481
		aBufferFormat.iPixelFormat = EUidPixelFormatXRGB_4444;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4482
		break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4483
	case 16:	// RGB565
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4484
		aBufferFormat.iPixelFormat = EUidPixelFormatRGB_565;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4485
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4486
	case 24:	// Really 32bpp, but top 8 unused
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4487
	case 32:	// While 32bpp, top 8 will not be used
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4488
	default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4489
		aBufferFormat.iPixelFormat = EUidPixelFormatXRGB_8888;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4490
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4491
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4492
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4493
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4494
TInt DMasterIni::Create()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4495
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4496
	TInt configurations = Property::GetInt("ConfigCount", 0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4497
	if (configurations == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4498
		return KErrGeneral;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4499
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4500
	// the pixel formats table is, at present, configuration independent
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4501
	TInt count;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4502
	TInt r = KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4503
	for (count = 0; count < configurations && r == KErrNone; ++count)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4504
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4505
		DWinsUi* dwi = new DWinsUi;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4506
		if (dwi)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4507
			r = dwi->Create(count);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4508
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4509
		if (r == KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4510
			iSystemInis.Append(dwi);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4511
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4512
	if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4513
		return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4514
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4515
	systemIni = masterIni->iSystemInis[0];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4516
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4517
	WinsGuiPowerHandler = DWinsGuiPowerHandler::New();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4518
	if (!WinsGuiPowerHandler)
0
cec860690d41 Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  4519
		return KErrNoMemory;
cec860690d41 Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  4520
		
51
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4521
	WinsGuiRotateHandler = DWinsGuiRotateHandler::New();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4522
	if (!WinsGuiRotateHandler)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4523
		return KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4524
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4525
	TheWin=new HWND[systemIni->iScreens.Count()];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4526
	TheChildWin=new HWND[systemIni->iScreens.Count()];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4527
	TheScreenBitmap=new HBITMAP[systemIni->iScreens.Count()];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4528
	CurrentFlipState=new TEmulatorFlip[systemIni->iScreens.Count()];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4529
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4530
	if(!TheWin || !TheChildWin || !TheScreenBitmap || !CurrentFlipState)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4531
		return KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4532
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4533
	TBufferSet buffer;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4534
	buffer.iDisplayDriverCount = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4535
	buffer.iDisplayState = ENormalResolution;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4536
	buffer.iDisplayBuffer = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4537
	buffer.iDisplayChannel = NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4538
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4539
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4540
	TInt i;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4541
	for(i=0;i<systemIni->iScreens.Count();i++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4542
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4543
		DScreenProperties *pScr = systemIni->iScreens[i];
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4544
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4545
		masterIni->InitBitmapHeader(*pScr, &buffer.iInfo);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4546
		masterIni->InitBufferFormat(*pScr, buffer.iBufferFormat);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4547
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4548
		r = masterIni->iBufferSet.Append(buffer);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4549
		if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4550
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4551
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4552
		CurrentFlipState[i] = pScr->iScreenRotation;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4553
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4554
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4555
	if (CreateWin32Thread(EThreadEvent, &KernelWindowThread, NULL, ETrue) == NULL)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4556
		return KErrGeneral;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4557
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4558
	for(i=0;i<systemIni->iScreens.Count();i++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4559
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4560
		r = Kern::AddHalEntry(EHalGroupDisplay,&DoHalFunction,(TAny*)i,i);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4561
		if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4562
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4563
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4564
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4565
	// should really come from Keyboard driver, but not doing it now...
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4566
	r = Kern::AddHalEntry(EHalGroupKeyboard,&DoKbdHalFunction,this);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4567
	if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4568
		return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4569
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4570
	if(systemIni->iXYInputType==EXYInputPointer)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4571
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4572
		r = Kern::AddHalEntry(EHalGroupDigitiser,&DoXYHalFunction,this);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4573
		if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4574
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4575
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4576
	else if(systemIni->iXYInputType==EXYInputMouse || systemIni->iXYInputType==EXYInputDeltaMouse)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4577
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4578
		r = Kern::AddHalEntry(EHalGroupMouse,&DoMouseHalFunction,this);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4579
		if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4580
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4581
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4582
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4583
	return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4584
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4585
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4586
void DMasterIni::InitBitmapHeader(DScreenProperties& aScreenProperties, LPBITMAPV4HEADER aInfo)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4587
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4588
	TInt width = aScreenProperties.iMaxScreenWidth; 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4589
	TInt height = aScreenProperties.iMaxScreenHeight;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4590
	TUint bitsPerPixel = MaximumBitDepthFromMask(aScreenProperties.iColorDepth);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4591
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4592
	memset(aInfo, 0, sizeof(BITMAPV4HEADER));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4593
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4594
	switch (bitsPerPixel)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4595
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4596
	case 12:	// XRGB4444
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4597
			aInfo->bV4BitCount = 16;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4598
			aInfo->bV4V4Compression = BI_BITFIELDS;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4599
			aInfo->bV4RedMask   = 0x0F00;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4600
			aInfo->bV4GreenMask = 0x00F0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4601
			aInfo->bV4BlueMask  = 0x000F;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4602
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4603
	case 16:	// RGB565
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4604
			aInfo->bV4BitCount = 16;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4605
			aInfo->bV4V4Compression = BI_BITFIELDS;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4606
			aInfo->bV4RedMask   = 0xF800;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4607
			aInfo->bV4GreenMask = 0x07E0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4608
			aInfo->bV4BlueMask  = 0x001F;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4609
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4610
	case 24:	// Really 32bpp, but top 8 unused
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4611
	case 32:	// While 32bpp, top 8 will not be used
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4612
	default:
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4613
			aInfo->bV4BitCount = 32;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4614
			aInfo->bV4V4Compression = BI_RGB;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4615
			// Mask is implicit for BI_RGB compression
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4616
			break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4617
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4618
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4619
	aInfo->bV4Size = sizeof(BITMAPV4HEADER);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4620
	aInfo->bV4Width = width;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4621
	aInfo->bV4Height = -height;	// Bitmap runs top to bottom
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4622
	aInfo->bV4Planes = 1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4623
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4624
	TInt bpp = _ALIGN_UP(aInfo->bV4BitCount, 16); //12 & 16 --> 16 ; 24 & 32 --> 32
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4625
	TInt widthInPixel = aInfo->bV4Width * bpp;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4626
	//rounding to 32 bits (4 octets) and converting, then, bits to octets;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4627
	TInt scanLineInBytes = _ALIGN_UP(widthInPixel, 32) >> 3; 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4628
	aInfo->bV4SizeImage = -aInfo->bV4Height * scanLineInBytes;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4629
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4630
	// Set color space as uncalibrated. All other members are then ignored.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4631
#if defined(LCS_DEVICE_RGB)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4632
	aInfo->bV4CSType = LCS_DEVICE_RGB;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4633
#elif defined(LCS_sRGB)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4634
	aInfo->bV4CSType = LCS_sRGB;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4635
#endif
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4636
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4637
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4638
// Helper function that allocates a single frame buffer. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4639
static TInt AllocateOneFrameBuffer(TInt aSize, TScreenBuffer &aScreenBuffer)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4640
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4641
    // Open shared chunk to the composition framebuffer
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4642
	DChunk* chunk = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4643
	// round to page size
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4644
	if (aSize <= 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4645
		return KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4646
	TUint round = Kern::RoundToPageSize(aSize);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4647
	TLinAddr chunkKernelAddr = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4648
	TUint32 physicalAddress = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4649
	TUint32 chunkMapAttr = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4650
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4651
	// create shared chunk
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4652
	NKern::ThreadEnterCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4653
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4654
	TChunkCreateInfo info;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4655
	info.iType = TChunkCreateInfo::ESharedKernelMultiple;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4656
	info.iMaxSize = round;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4657
	info.iMapAttr = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4658
	info.iOwnsMemory = ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4659
	info.iDestroyedDfc = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4660
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4661
	TInt r = Kern::ChunkCreate(info, chunk, chunkKernelAddr, chunkMapAttr);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4662
	if (r == KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4663
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4664
		// map our chunk to specific 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4665
		r = Kern::ChunkCommitContiguous(chunk, 0, aSize, physicalAddress);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4666
		if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4667
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4668
			Kern::ChunkClose(chunk);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4669
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4670
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4671
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4672
	if (r == KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4673
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4674
		TBufferAddressA* bufferAddress = new TBufferAddressA;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4675
		if (!bufferAddress)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4676
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4677
			r = KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4678
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4679
		else 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4680
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4681
			bufferAddress->iAddress = (TAny*)chunkKernelAddr;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4682
			bufferAddress->iChunk = chunk;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4683
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4684
			if ((r = aScreenBuffer.iFrameBuffers.Append(bufferAddress->iAddress)) == KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4685
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4686
				r = aScreenBuffer.iMemChunks.Append(bufferAddress);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4687
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4688
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4689
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4690
	if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4691
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4692
		Kern::ChunkClose(chunk);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4693
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4694
	NKern::ThreadLeaveCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4695
	return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4696
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4697
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4698
TInt DMasterIni::AllocateFrameBuffers(TInt aScreenNumber, TInt aCount, TInt aSize)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4699
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4700
	while (aCount--)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4701
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4702
		TInt r = AllocateOneFrameBuffer(aSize, masterIni->iBufferSet[aScreenNumber].iScreenBuffer);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4703
		if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4704
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4705
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4706
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4707
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4708
	return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4709
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4710
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4711
void DMasterIni::ReleaseFrameBuffers(TInt aScreenNumber)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4712
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4713
	RPointerArray<TAny>& frameBuffers = masterIni->iBufferSet[aScreenNumber].iScreenBuffer.iFrameBuffers;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4714
	RPointerArray<TBufferAddressA>& memChunks = masterIni->iBufferSet[aScreenNumber].iScreenBuffer.iMemChunks;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4715
	RPointerArray<TBufferAddressA>& dsaChunks = masterIni->iBufferSet[aScreenNumber].iDsaBuffer.iMemChunks;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4716
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4717
   	NKern::ThreadEnterCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4718
	TInt index;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4719
	TInt count = memChunks.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4720
	for (index = 0; index < count; index++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4721
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4722
		Kern::ChunkClose(memChunks[index]->iChunk);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4723
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4724
	count = dsaChunks.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4725
	for (index = 0; index < count; index++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4726
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4727
		Kern::ChunkClose(dsaChunks[index]->iChunk);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4728
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4729
	NKern::ThreadLeaveCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4730
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4731
	frameBuffers.Reset();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4732
	memChunks.Reset();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4733
	dsaChunks.Reset();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4734
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4735
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4736
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4737
TProcessAddrEntry::TProcessAddrEntry(DProcess *aProcess, TUint8* aAddress): 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4738
	iProcess(aProcess), iAddress(aAddress)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4739
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4740
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4741
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4742
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4743
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4744
Contruct a Shared Chunk cleanup object which will be used to clean up 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4745
after the process/address table entry. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4746
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4747
TChunkCleanup::TChunkCleanup(DProcess* aProcess, TInt aScreenNumber)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4748
    : TDfc((TDfcFn)TChunkCleanup::ChunkDestroyed,this,Kern::SvMsgQue(),0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4749
    , iProcess(aProcess)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4750
    , iScreenNumber(aScreenNumber)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4751
    , iIndex(-1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4752
    {}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4753
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4754
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4755
Cancel the action of the cleanup object.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4756
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4757
void TChunkCleanup::Cancel()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4758
    {
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4759
    // Clear iProcess which means that when the DFC gets queued on chunk destruction
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4760
    // our ChunkDestroyed method will do nothing other than cleanup itself.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4761
    iProcess = NULL;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4762
    }
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4763
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4764
/**
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4765
Callback function called when the DFC runs, i.e. when a chunk is destroyed.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4766
*/
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4767
void TChunkCleanup::ChunkDestroyed(TChunkCleanup* aSelf)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4768
    {
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4769
    DProcess* process = aSelf->iProcess;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4770
    TInt screenNumber = aSelf->iScreenNumber;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4771
    TUint index = aSelf->iIndex;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4772
    // If we haven't been Cancelled...
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4773
    if(process && index != -1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4774
        {
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4775
    	if (masterIni->iBufferSet[screenNumber].iProcAddrTable[index].iProcess == process)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4776
    		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4777
    		masterIni->iBufferSet[screenNumber].iProcAddrTable[index].iProcess = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4778
    		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4779
    	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4780
    		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4781
    		__KTRACE_OPT(KEXTENSION,Kern::Printf("Oops! Someone has messed up our process index!"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4782
    		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4783
        }
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4784
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4785
    // We've finished so now delete ourself
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4786
    delete aSelf;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4787
    }
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4788
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4789
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4790
TInt DMasterIni::DisplayMemoryHandle(TInt aScreenNumber, TInt& aHandle)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4791
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4792
	if (iBufferSet[aScreenNumber].iDsaBuffer.iMemChunks.Count() == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4793
		{	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4794
		int r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4795
		r = AllocateOneFrameBuffer(iMaxSizeInBytes, iBufferSet[aScreenNumber].iDsaBuffer);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4796
		if (KErrNone != r)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4797
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4798
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4799
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4800
		__ASSERT_DEBUG(iBufferSet[aScreenNumber].iDisplayChannel, Fault(EGuiNoDisplayChannel));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4801
		iBufferSet[aScreenNumber].iDisplayChannel->SetLegacyBuffer(iBufferSet[aScreenNumber].iDsaBuffer.iFrameBuffers[0]);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4802
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4803
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4804
	aHandle = Kern::MakeHandleAndOpen(&Kern::CurrentThread(), 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4805
			iBufferSet[aScreenNumber].iDsaBuffer.iMemChunks[0]->iChunk);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4806
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4807
	if (aHandle < 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4808
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4809
		return aHandle;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4810
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4811
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4812
	return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4813
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4814
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4815
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4816
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4817
// Find the address of the display memory. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4818
TInt DMasterIni::DisplayMemoryAddress(TInt aScreenNumber, TInt& aAddress)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4819
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4820
	TBufferSet &bufferSet = iBufferSet[aScreenNumber]; 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4821
	DProcess *process = &Kern::CurrentProcess();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4822
	TInt firstFree = -1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4823
	NKern::FMWait(&iLock);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4824
	TUint count = bufferSet.iProcAddrTable.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4825
	for(TUint i = 0; i < count; ++i)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4826
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4827
		DProcess *curProcess = bufferSet.iProcAddrTable[i].iProcess;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4828
		if (curProcess == process)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4829
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4830
			aAddress = reinterpret_cast<TInt>(bufferSet.iProcAddrTable[i].iAddress);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4831
			NKern::FMSignal(&iLock);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4832
			return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4833
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4834
		if (curProcess == 0 && firstFree == -1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4835
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4836
			firstFree = i;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4837
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4838
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4839
	NKern::FMSignal(&iLock);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4840
	// If we get here, we couldn't find the process in the iProcAddrTable. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4841
	// Create a new Process Address entry. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4842
	// Step 1
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4843
	// Create a dummy chunk so that we can detect when the process dies, 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4844
	// give a handle to the user [but don't actually let the process KNOW what the handle is
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4845
	// so the user process can't do anything silly with the chunk]. Close our side of the
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4846
	// chunk to make sure there is only one reference to it. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4847
	DChunk* chunk = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4848
	// find page size for one page. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4849
	TUint round = Kern::RoundToPageSize(1);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4850
	TLinAddr chunkKernelAddr = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4851
	TUint32 chunkMapAttr = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4852
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4853
	// create shared chunk
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4854
	NKern::ThreadEnterCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4855
	// Cleanup object, used to issue a DFC when the chunk is closed (and 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4856
	// as the handle of the chunk is not given to the process, it can only
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4857
	// be closed when the process terminates!)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4858
	TChunkCleanup *cleanup = new TChunkCleanup(process, aScreenNumber);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4859
	if (!cleanup)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4860
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4861
		NKern::ThreadLeaveCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4862
		return KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4863
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4864
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4865
	TChunkCreateInfo info;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4866
	info.iType = TChunkCreateInfo::ESharedKernelMultiple;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4867
	info.iMaxSize = round;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4868
	info.iMapAttr = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4869
	info.iOwnsMemory = ETrue;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4870
	info.iDestroyedDfc = cleanup;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4871
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4872
	TInt r = Kern::ChunkCreate(info, chunk, chunkKernelAddr, chunkMapAttr);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4873
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4874
	if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4875
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4876
		delete cleanup;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4877
		NKern::ThreadLeaveCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4878
		return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4879
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4880
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4881
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4882
	// Create a new handle for the user thread. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4883
    r = Kern::MakeHandleAndOpen(&Kern::CurrentThread(), chunk);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4884
	Kern::ChunkClose(chunk);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4885
	if (r <= 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4886
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4887
		NKern::ThreadLeaveCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4888
		return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4889
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4890
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4891
	// Step 2
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4892
	// Create a second handle for the chunk to the DSA buffer.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4893
	// First part: Make sure there is a DisplayMemoryHandle;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4894
	TInt handle = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4895
	r = DisplayMemoryHandle(aScreenNumber, handle); 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4896
	if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4897
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4898
		Kern::ChunkClose(chunk);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4899
		NKern::ThreadLeaveCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4900
		return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4901
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4902
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4903
	DChunk *dsaChunk = bufferSet.iDsaBuffer.iMemChunks[0]->iChunk;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4904
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4905
	// Step 3
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4906
	// Get the base addrss and insert into table. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4907
	TUint8* baseAddress = Kern::ChunkUserBase(dsaChunk, &Kern::CurrentThread());
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4908
	NKern::FMWait(&iLock);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4909
	// Optimistically, the place we found earlier in the table is still free.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4910
	if (firstFree != -1 && bufferSet.iProcAddrTable[firstFree].iProcess != 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4911
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4912
		// If not, we go find another one.
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4913
		firstFree = -1;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4914
		TUint count = bufferSet.iProcAddrTable.Count();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4915
		for(TUint i = 0; i < count; ++i)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4916
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4917
			if (bufferSet.iProcAddrTable[i].iProcess == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4918
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4919
				firstFree = i;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4920
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4921
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4922
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4923
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4924
	// Check if there is a free entry - if so, re-use it. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4925
	if (firstFree != -1)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4926
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4927
		bufferSet.iProcAddrTable[firstFree].iProcess = process;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4928
		bufferSet.iProcAddrTable[firstFree].iAddress = baseAddress;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4929
		cleanup->SetIndex(firstFree);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4930
		NKern::FMSignal(&iLock);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4931
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4932
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4933
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4934
		// No free entry. Append it to the list. 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4935
		NKern::FMSignal(&iLock);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4936
		TProcessAddrEntry entry(process, baseAddress);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4937
		r = bufferSet.iProcAddrTable.Append(entry);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4938
		if (r != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4939
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4940
			Kern::ChunkClose(chunk);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4941
			NKern::ThreadLeaveCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4942
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4943
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4944
		// We added it at the end - so we start from the back and check for the 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4945
		// process, as some other process COULD have added one after us, so we 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4946
		// can't just use the count for index!
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4947
		TUint index;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4948
		for(index = bufferSet.iProcAddrTable.Count()-1; index; --index)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4949
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4950
			if (bufferSet.iProcAddrTable[index].iProcess == process 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4951
					&& bufferSet.iProcAddrTable[index].iAddress != baseAddress)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4952
				{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4953
				break;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4954
				}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4955
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4956
		cleanup->SetIndex(index);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4957
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4958
	aAddress = reinterpret_cast<TInt>(baseAddress);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4959
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4960
	NKern::ThreadLeaveCS();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4961
	return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4962
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4963
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4964
EXPORT_C TInt WinsGui::CurrentConfiguration()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4965
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4966
	return ::CurrentConfiguration;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4967
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4968
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4969
GLDEF_C void Fault(TGuiPanic aPanic)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4970
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4971
	Kern::Fault("WINS-UI",aPanic);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4972
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4973
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4974
DECLARE_STANDARD_EXTENSION()
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4975
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4976
	__KTRACE_OPT(KEXTENSION,Kern::Printf("Starting Emulator GUI"));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4977
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4978
	// if NoGui property == true do nothing
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4979
	if (Property::GetBool("NoGui",EFalse))
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4980
		return KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4981
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4982
	// create keyboard driver
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4983
	TInt r=KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4984
	masterIni = new DMasterIni;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4985
	if (masterIni)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4986
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4987
		r = masterIni->Create();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4988
		if (r!= KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4989
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4990
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4991
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4992
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4993
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4994
	DMultiTouch::iMultiTouchSupported = DMultiTouch::Init();
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4995
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4996
	// Create multitouch when necessary
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4997
	if (systemIni->MultiTouchEnabled() && systemIni->GCEEnabled() && DMultiTouch::iMultiTouchSupported)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4998
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  4999
		TheMultiTouch = new DMultiTouch(systemIni->MultiTouchProximityStep(),systemIni->MultiTouchPressureStep());
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5000
		if(!TheMultiTouch)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5001
			{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5002
			r = KErrNoMemory;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5003
			__KTRACE_OPT(KEXTENSION,Kern::Printf("Returns %d",r));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5004
			return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5005
			}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5006
		DMultiTouch::iMultiTouchCreated = TRUE;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5007
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5008
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5009
	__KTRACE_OPT(KEXTENSION,Kern::Printf("Returns %d",r));
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5010
	return r;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5011
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5012
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5013
TInt DWinsUi::DoDefineEmulatorControlHotKey(TAny* aPtr, const char* aValue)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5014
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5015
	return static_cast<DWinsUi*>(aPtr)->DefineEmulatorControlHotKey(aValue);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5016
	}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5017
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5018
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5019
TInt DWinsUi::DefineEmulatorControlHotKey(const char* aValue)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5020
	{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5021
	const char* beg = skipws(aValue);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5022
	const char* end = skiptok(beg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5023
	TInt err = KErrNone;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5024
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5025
	TEmulCommand command = ENoCommand;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5026
	TInt data = 0;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5027
	if (_strnicmp(beg, "SelectConfig", end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5028
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5029
		//get the int param which is the config to switch to
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5030
		beg = end;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5031
		char * e;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5032
		data = strtol(beg, &e,0);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5033
		if (beg == e)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5034
			err = KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5035
		end = e;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5036
		command = ESelectConfig;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5037
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5038
	else if(_strnicmp(beg, "NextConfig", end-beg) == 0)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5039
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5040
		command = ENextConfig;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5041
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5042
	else
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5043
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5044
		err = KErrArgument;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5045
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5046
	if (err != KErrNone)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5047
		return err;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5048
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5049
	// get the keys	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5050
	KeyCombination* pCombination = new KeyCombination(data, command);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5051
	if (!pCombination)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5052
		return KErrNoMemory;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5053
	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5054
	beg = skipws(end);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5055
	const char* end2;	
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5056
	for (TInt i=0;i<KMaxHotKeyCombinationLength;i++)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5057
		{
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5058
		TInt key=KErrNotFound;		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5059
		end2 = skiptok(beg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5060
		TPtrC8 name((const TUint8*)beg, end2-beg);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5061
		if ((key=iKeyboard.GetScanCode(name))!=KErrNotFound)
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5062
			pCombination->AddKey((TStdScanCode)key);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5063
		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5064
		if (beg == end2 || *end2++ != ',') 
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5065
			break;		
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5066
		beg = end2;
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5067
		}
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5068
	return iControlHotKeys.Append(pCombination);
5aa1c6a27c95 201037_03
hgs
parents: 15
diff changeset
  5069
	}