aboutsummaryrefslogtreecommitdiff
path: root/SrcShared/EmWindow.h
blob: 087efde11171814c7a8c71ba9b015b7ffd9a375e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/* -*- mode: C++; tab-width: 4 -*- */
/* ===================================================================== *\
	Copyright (c) 2001 Palm, Inc. or its subsidiaries.
	All rights reserved.

	This file is part of the Palm OS Emulator.

	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.
\* ===================================================================== */

#ifndef EmWindow_h
#define EmWindow_h

#include "EmPixMap.h"			// EmPixMap
#include "EmRegion.h"			// EmRegion
#include "EmStructs.h"			// RGBList
#include "PreferenceMgr.h"		// PrefKeyType

/*
	EmWindow is the cross-platform object representing the window that
	displays the emulation.  It is not the actual thing that appears on
	the monitor as a window, but merely deals with cross-platform
	aspects of handling it, such as updating its contents, changing
	skins, etc.

	EmWindow handles all the cross-platform issues.  It can deal with
	the upper-level parts of updating the LCD area, wiggling the window
	if the vibrator is going, changing skins, etc.

	EmWindow manages most of the platform-specific aspects by defining
	HostFoo methods, which are then defined differently on each
	platform.  These HostFoo methods are implemented in
	EmWindow<Host>.cpp.

	EmWindow<Host> is also defined in EmWindow<Host>.cpp, and holds any
	platform-specific data (such as the HWND on Windows, etc.).  It
	declares and implements any support functions needed on that
	particular platform, but which can't be declared in EmWindow because
	either not all platforms need those functions, or they involve
	platform-specific types.

	One creates a window by calling "window = new EmWindow<Host>;"
	followed by "window->WindowInit();".  Cross-platform code can then
	call high-level functions in EmWindow such as HandleUpdate and
	HandlePen.  Platform-specific code can perform platform-specific
	operations.  When it's time to close the window, call
	"window->WindowDispose();" followed by "delete window;"
*/

class EmPoint;
class EmScreenUpdateInfo;

class EmWindow
{
	public:
								EmWindow			(void);
		virtual					~EmWindow			(void);

		static EmWindow*		NewWindow			(void);

		void					WindowInit			(void);
		void					WindowReset			(void);

		void					HandlePenEvent		(const EmPoint&, Bool down);
		void					HandleUpdate		(void);
		void 					HandlePalette		(void);
		void					HandleDisplayChange	(void);
		void					HandleActivate		(Bool active);
		virtual void			HandleIdle			(void);

		void					HandleDebugMode		(Bool debugMode);
		void					HandleGremlinMode	(Bool gremlinMode);

		void					GetLCDContents		(EmScreenUpdateInfo& info);

	private:
		void					PaintScreen			(Bool drawCase, Bool always);
		void					PaintCase			(const EmScreenUpdateInfo& info);
		void					PaintLCDFrame		(const EmScreenUpdateInfo& info);
		void					PaintLCD			(const EmScreenUpdateInfo& info);
		void					PaintLED			(uint16 ledState);
		void					PaintButtonFrames	(void);

		static void				PrefsChangedCB		(PrefKeyType key, void* data);
		void					PrefsChanged		(PrefKeyType key);

		EmRect					GetLCDBounds		(void);
		EmRect					GetLEDBounds		(void);

		Bool					GetSkin				(EmPixMap&);
		void					GetDefaultSkin		(EmPixMap&);

	protected:
		void					PreDestroy			(void);
		Bool					PrevLCDColorsChanged(const RGBList& newLCDColors);
		void					SaveLCDColors		(const RGBList& newLCDColors);
		void					GetSystemColors		(const EmScreenUpdateInfo&,
													 RGBList&);
		void					QuantizeSkinColors	(const EmPixMap& skin,
													 RGBList& colors,
													 Bool polite);

		const EmPixMap&			GetCurrentSkin		(void);
		const RGBList&			GetCurrentSkinColors(Bool polite);
		const EmRegion&			GetCurrentSkinRegion(void);

	private:
		virtual void			HostWindowReset		(void) = 0;

		virtual void			HostMouseCapture	(void);
		virtual void			HostMouseRelease	(void);

		virtual void			HostUpdateBegin		(void);
		virtual void			HostUpdateEnd		(void);

		virtual void			HostDrawingBegin	(void);
		virtual void			HostDrawingEnd		(void);

		virtual void			HostPaletteSet		(const EmScreenUpdateInfo&);
		virtual void			HostPaletteRestore	(void);

		virtual void			HostWindowMoveBy	(const EmPoint&) = 0;
		virtual void			HostWindowMoveTo	(const EmPoint&) = 0;
		virtual EmRect			HostWindowBoundsGet	(void) = 0;
		virtual void			HostWindowCenter	(void) = 0;
		virtual void			HostWindowShow		(void) = 0;
		virtual void			HostWindowDrag		(void);
		virtual void			HostWindowStayOnTop	(void);

		virtual void			HostRectFrame		(const EmRect&, const EmPoint&, const RGBType&) = 0;
		virtual void			HostOvalPaint		(const EmRect&, const RGBType&) = 0;

		virtual void			HostPaintCase		(const EmScreenUpdateInfo&) = 0;
		virtual void			HostPaintLCD		(const EmScreenUpdateInfo& info,
													 const EmRect& srcRect,
													 const EmRect& destRect,
													 Bool scaled) = 0;

		virtual void			HostPalette			(void);
		virtual void			HostDisplayChange	(void);

		virtual void			HostGetDefaultSkin	(EmPixMap&, int scale) = 0;
		virtual EmPoint			HostGetCurrentMouse	(void) = 0;

	private:
		static EmWindow*		fgWindow;

		EmPixMap				fSkinBase;
		EmPixMap				fSkinCurrent;

		RGBList					fSkinColors[16];

		EmRegion				fSkinRegion;

		RGBList					fPrevLCDColors;

		SkinElementType			fCurrentButton;

		Bool					fNeedWindowReset;
		Bool					fNeedWindowInvalidate;

		Bool					fOldLCDOn;
		Bool					fOldBacklightOn;
		uint16					fOldLEDState;

		Bool					fWiggled;
		Bool					fActive;
		Bool					fDebugMode;
		Bool					fGremlinMode;
};

extern EmWindow*	gWindow;

#endif	// EmWindow_h