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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
|
/* -*- mode: C++; tab-width: 4 -*- */
/* ===================================================================== *\
Copyright (c) 1999-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.
\* ===================================================================== */
#include "EmCommon.h"
#include "CGremlinsStubs.h"
#include "Platform.h" // Platform::ViewDrawLine
#include "ROMStubs.h" // EvtEnqueuePenPoint, EvtEnqueueKey
// ---------------------------------------------------------------------------
// ¥ StubEnqueuePt
// ---------------------------------------------------------------------------
// This is a stub routine that called the application object's method that
// enqueues a point.
void StubAppEnqueuePt(const PointType* pen)
{
// Make a copy of the point, as we may be munging it.
PointType pt = *pen;
// Enqueue the new pen position. We must "reverse" correct it because the
// Event Manager assumes that all points enqueued are raw digitizer points.
if (pt.x != -1 || pt.y != -1)
{
(void) ::PenScreenToRaw(&pt);
}
::EvtEnqueuePenPoint(&pt);
}
// ---------------------------------------------------------------------------
// ¥ StubAppEnqueueKey
// ---------------------------------------------------------------------------
// This is a stub routine that called the Application object's method that
// enqueues a key.
void StubAppEnqueueKey (UInt16 ascii, UInt16 keycode, UInt16 modifiers)
{
switch (ascii)
{
// This translates some control characters into system chars.
// Following is a list of such system chars and whether or
// now we support them specially.
//
// * = Handled here
// ! = Handled elsewhere
//
// * vchrLowBattery 0x0101 // Display low battery dialog
// vchrEnterDebugger 0x0102 // Enter Debugger
// * vchrNextField 0x0103 // Go to next field in form
// vchrStartConsole 0x0104 // Startup console task
//
// * vchrMenu 0x0105 // Ctl-A
// * vchrCommand 0x0106 // Ctl-C
// * vchrConfirm 0x0107 // Ctl-D
// * vchrLaunch 0x0108 // Ctl-E
// * vchrKeyboard 0x0109 // Ctl-F popup the keyboard in appropriate mode
// vchrFind 0x010A
// vchrCalc 0x010B
// * vchrPrevField 0x010C
// vchrAlarm 0x010D // sent before displaying an alarm
// vchrRonamatic 0x010E // stroke from graffiti area to top half of screen
// vchrGraffitiReference 0x010F // popup the Graffiti reference
// vchrKeyboardAlpha 0x0110 // popup the keyboard in alpha mode
// vchrKeyboardNumeric 0x0111 // popup the keyboard in number mode
// vchrLock 0x0112 // switch to the Security app and lock the device
// * vchrBacklight 0x0113 // toggle state of backlight
// * vchrAutoOff 0x0114 // power off due to inactivity timer
// Added for PalmOS 3.0
// vchrExgTest 0x0115 // put exchange Manager into test mode (&.t)
// vchrSendData 0x0116 // Send data if possible
// vchrIrReceive 0x0117 // Initiate an Ir receive manually (&.i)
// Added for PalmOS 3.1
// vchrTsm1 0x0118 // Text Services silk-screen button
// vchrTsm2 0x0119 // Text Services silk-screen button
// vchrTsm3 0x011A // Text Services silk-screen button
// vchrTsm4 0x011B // Text Services silk-screen button
// Added for PalmOS 3.2
// vchrRadioCoverageOK 0x011C // Radio coverage check successful
// vchrRadioCoverageFail 0x011D // Radio coverage check failure
// vchrPowerOff 0x011E // Posted after autoOffChr or hardPowerChr
// // to put system to sleep with SysSleep.
// Added for PalmOS 3.5
// vchrResumeSleep 0x011F // Posted by NotifyMgr clients after they
// // have deferred a sleep request in order
// // to resume it.
// vchrLateWakeup 0x0120 // Posted by the system after waking up
// // to broadcast a late wakeup notification.
// // FOR SYSTEM USE ONLY
// vchrTsmMode 0x0121 // Posted by TSM to trigger mode change.
// vchrBrightness 0x0122 // Activates brightness adjust dialog
// * vchrContrast 0x0123 // Activates contrast adjust dialog
// vchrExgIntData 0x01FF // Exchange Manager wakeup event
//
// The application launching buttons generate the following
// key codes and will also set the commandKeyMask bit in the
// modifiers field
// vchrHardKeyMin 0x0200
// vchrHardKeyMax 0x02FF // 256 hard keys
//
// ! vchrHard1 0x0204
// ! vchrHard2 0x0205
// ! vchrHard3 0x0206
// ! vchrHard4 0x0207
// ! vchrHardPower 0x0208
// vchrHardCradle 0x0209 // Button on cradle pressed
// vchrHardCradle2 0x020A // Button on cradle pressed and hwrDockInGeneric1
// // input on dock asserted (low).
// vchrHardContrast 0x020B // Sumo's Contrast button
// vchrHardAntenna 0x020C // Eleven's Antenna switch
// vchrHardBrightness 0x020D // Hypothetical Brightness button
case 0x01: // control-A
ascii = vchrMenu;
modifiers = commandKeyMask;
break;
case 0x02: // control-B
ascii = vchrLowBattery;
modifiers = commandKeyMask;
break;
case 0x03: // control-C
ascii = vchrCommand;
modifiers = commandKeyMask;
break;
case 0x04: // control-D
ascii = vchrConfirm;
modifiers = commandKeyMask;
break;
case 0x05: // control-E
ascii = vchrLaunch;
modifiers = commandKeyMask;
break;
case 0x06: // control-F
ascii = vchrKeyboard;
modifiers = commandKeyMask;
break;
case 0x0D: // control-M
ascii = chrLineFeed;
break;
case 0x0E: // control-N
ascii = vchrNextField;
modifiers = commandKeyMask;
break;
case 0x10: // control-P
ascii = vchrPrevField;
modifiers = commandKeyMask;
break;
case 0x13: // control-S
ascii = vchrAutoOff;
modifiers = commandKeyMask;
break;
case 0x14: // control-T
ascii = vchrHardContrast;
modifiers = commandKeyMask;
break;
case 0x15: // control-U
ascii = vchrBacklight;
modifiers = commandKeyMask;
break;
}
#if 0 // Turning this bit off for now. It never worked because (a) the values
// assigned to "status" were incorrect (they should be correct now) and
// (b) they only worked for non-EZ devices. EZ devices kind of ignore
// the "status" parameter and probe the keyboard settings directly,
// something we don't handle at this point of control. So I'm turning
// this off and just posting the ascii keys. Since the old method
// never worked, then there's no issue with the Key Manager no longer
// doing the right thing.
// If this is one of the hard keys, send it through the Key Manager so that
// it can do the right things concering double-taps, etc.
if ((modifiers & commandKeyMask) &&
(ascii > hardKeyMin || (ascii == pageUpChr) || (ascii == pageDownChr)))
{
DWord status = 0;
switch (ascii)
{
case hardPowerChr: status = hwr328IntLoInt0; break;
case pageUpChr: status = hwr328IntLoInt1; break;
case pageDownChr: status = hwr328IntLoInt2; break;
case hard1Chr: status = hwr328IntLoInt3; break;
case hard2Chr: status = hwr328IntLoInt4; break;
case hard3Chr: status = hwr328IntLoInt5; break;
case hard4Chr: status = hwr328IntLoInt6; break;
case hardCradleChr: status = hwr328IntHiIRQ1 << 16; break;
case hardAntennaChr: status = hwr328IntHiIRQ2 << 16; break;
}
// I'm dubious that this is the correct thing to do in the emulator.
// This is an interrupt routine that we're calling directly. But
// what if a "real" interrupt is triggered from some other source
// while this call is executing (for instance, the user clicks on
// one of the "keyboard buttons", thus generating a keyboard
// interrupt)? It's possible that the two will stomp on each other.
// The best thing to do is to post events the emulator way.
// However, I'm hard-pressed to do that. That would require calling
// Hardware_ButtonEvent twice (once to signal the keyboard
// interrupt, and another to clear it), but I don't know how to give
// the processor time in between to respond to the first call.
if (status != 0)
::KeyHandleInterrupt (false, status);
}
// For other keys, enqueue them directly.
else
#endif
{
::EvtEnqueueKey (ascii, keycode, modifiers);
}
}
// ---------------------------------------------------------------------------
// ¥ StubAppGremlinsOn
// ---------------------------------------------------------------------------
// Stub routine that update the Gremlins menu an the global variable the
// keeps track of the ????
void StubAppGremlinsOn (void)
{
// Called from Gremlins::Initialize.
}
// ---------------------------------------------------------------------------
// ¥ StubAppGremlinsOff
// ---------------------------------------------------------------------------
// Stub routine that update the Gremlins menu an the global variable the
// keeps track of the ????
void StubAppGremlinsOff (void)
{
// Called by Gremlins when counter > until.
}
// ---------------------------------------------------------------------------
// ¥ StubViewDrawLine
// ---------------------------------------------------------------------------
// This is a stub routine that called the View object's method that draw
// a line.
void StubViewDrawLine (int xStart, int yStart, int xEnd, int yEnd)
{
Platform::ViewDrawLine (xStart, yStart, xEnd, yEnd);
}
// ---------------------------------------------------------------------------
// ¥ StubViewDrawPixel
// ---------------------------------------------------------------------------
// This is a stub routine that called the View object's method that draw
// a pixel.
void StubViewDrawPixel (int xPos, int yPos)
{
Platform::ViewDrawPixel (xPos, yPos);
}
|