continue (15千字)
BOOL OnPenDown(EventPtr eventP, HW_PREF* pPrefs, HW_PENS* pHWPens, HW_TRACE* pHWTrace){
Coord x, y;
FormPtr frm;
Int8 MenuMode;
UInt16 screenX, screenY;
// d3 = eventP(a6)
// a2 = pPrefs
// a3 = pHWPens
// a4 = pHWTrace
x = eventP->screenX;
y = eventP->screenY;
WinWindowToDisplayPt(&x, &y);
if (x > 160 || y > 160)
return 0;
MenuMode = pPrefs->MenuMode;
switch (MenuMode)
{
case FOLDED:
if (screenX > 141 && screenX < 151 && screenY > 141 && screenY < 151)
break;
case LOWER:
if (screenY > 120 && screenY < 145)
break;
case UPPER:
if (screenY > 80 && screenY < 105)
break;
default:
if (pPrefs->bMouse)
return false;
pHWTrace->b2006 = 0;
pHWTrace->points[pHWTrace->PtCount].x = screenX;
pHWTrace->points[pHWTrace->PtCount].y = screenY;
if (pHWTrace->PtCount == 0)
pHWTrace->b2007 = 1;
pHWTrace->PtCount++;
pHWTrace->dw2002 = 0;
return true;
}
// 如果已有笔迹采样点, 将新点加入笔迹数组.
if (pHWTrace->PtCount) {
pHWTrace->points[pHWTrace->PtCount].x = screenX;
pHWTrace->points[pHWTrace->PtCount].y = screenY;
pHWTrace->PtCount++;
return true;
}
pHWTrace->b2006 = true;
if (MenuMode == LOWER && x > 3 && x < 63 && y > 134 && y < 146 ||
MenuMode == UPPER && x > 3 && x < 63 && y > 94 && y < 106)
{
UInt16 ofs = (pHWPens->CandiDispOfs + (x - 1)) / 12;
char* p = (char*)&pHWPens->Cands[pHWPens->index - 1][ofs];
if (*p == 0) {
if (*(p + 1) == 0)
return true;
EvtEnqueueKey(backspaceChr, 0, 0);
EvtEnqueueKey(*(p + 1), 0, 0);
}
else {
EnqueueChChar(GetCurField(FrmGetActiveForm()), p, true);
GetAssoc(pHWPens, *(UInt16*)p);
}
pPrefs->bRedrawMenu = true;
return true;
}
if (MenuMode == LOWER && x > 3 && x < 133 && y > 121 && y < 133 ||
MenuMode == UPPER && x > 3 && x < 133 && y > 81 && y < 93) // else goto 6b4a
{
UInt16 pos = (x - 1) / 13 * 2;
if (pHWPens->AssocOfs + pos < pHWPens->AssocNum) {
EnqueueChChar(GetCurField(FrmGetActiveForm()), pHWPens->AssocBuffer[pos], false);
pHWPens->AssocNum = 0;
pHWPens->AssocOfs = 0;
}
return true;
}
if (MenuMode == LOWER && x > 63 && x < 75 && y > 134 && y < 146 ||
MenuMode == UPPER && x > 63 && x < 75 && y > 94 && y < 106) // else goto 6be0
{
UInt16 ofs = pHWPens->CandiDispOfs + 5;
if (ofs == 10) {
pHWPens->CandiDispOfs = 0;
pPrefs->bRedrawMenu = true;
}
else if (pHWPens->Cands[pHWPens->index - 1][ofs] != 0) {
pHWPens->CandiDispOfs + 5;
pPrefs->bRedrawMenu = true;
}
return true;
}
if (MenuMode == LOWER && x > 132 && x < 144 && y > 121 && y < 133 ||
MenuMode == UPPER && x > 132 && x < 144 && y > 81 && y < 93) // else goto 6c4a
{
if (pHWPens->AssocOfs) {
pHWPens->AssocOfs -= 20;
pPrefs->bRedrawMenu = true;
}
return true;
}
if (MenuMode == LOWER && x > 145 && x < 157 && y > 121 && y < 133 ||
MenuMode == UPPER && x > 145 && x < 157 && y > 81 && y < 93) // else goto 6cba
{
if (pHWPens->AssocOfs + 20 < pHWPens->AssocNum) {
pHWPens->AssocOfs += 20;
pPrefs->bRedrawMenu = true;
}
return true;
}
if (MenuMode == LOWER && x > 148 && x < 158 && y > 134 && y < 146 ||
MenuMode == UPPER && x > 148 && x < 158 && y > 94 && y < 106) // else goto 6d46
{
frm = FrmGetActiveForm();
if (FrmValidatePtr(frm))
FrmUpdateForm(FrmGetFormId(frm), frmRedrawUpdateCode);
ClearMenu(MenuMode);
MenuMode = FOLDED;
pPrefs->bMenuFolded = true;
return true;
}
if (x > 141 && x < 151 && y > 141 && y < 151 && MenuMode == LOWER)
{
ClearMenu(MenuMode);
pPrefs->MenuMode = GetMenuMode();
pPrefs->bMenuFolded = false;
pPrefs->bRedrawMenu = true;
return true;
}
if (MenuMode == LOWER && x > 76 && x < 88 && y > 134 && y < 146 ||
MenuMode == UPPER && x > 76 && x < 88 && y > 94 && y < 106) // else goto 6dfa
{
if (pPrefs->RecogRange == HW_ENGLISH)
pPrefs->RecogRange = 0;
else
pPrefs->RecogRange = HW_ENGLISH;
RedrawMenu(pPrefs, pHWPens);
return true;
}
if (MenuMode == LOWER && x > 88 && x < 100 && y > 134 && y < 146 ||
MenuMode == UPPER && x > 88 && x < 100 && y > 94 && y < 106) // else goto 6e6a
{
if (pPrefs->RecogRange == HW_NUMERIC)
pPrefs->RecogRange = 0;
else
pPrefs->RecogRange = HW_NUMERIC;
RedrawMenu(pPrefs, pHWPens);
return true;
}
if (MenuMode == LOWER && x > 100 && x < 112 && y > 134 && y < 146 ||
MenuMode == UPPER && x > 100 && x < 112 && y > 94 && y < 106) // else goto 6e6a
{
if (pPrefs->RecogRange == HW_SYMBOL)
pPrefs->RecogRange = 0;
else
pPrefs->RecogRange = HW_SYMBOL;
RedrawMenu(pPrefs, pHWPens);
return true;
}
if (MenuMode == LOWER && x > 112 && x < 124 && y > 134 && y < 146 ||
MenuMode == UPPER && x > 112 && x < 124 && y > 94 && y < 106) // else goto 6f42
{
pPrefs->bHalfToFull = !pPrefs->bHalfToFull;
RedrawMenu(pPrefs, pHWPens);
return true;
}
if (MenuMode == LOWER && x > 136 && x < 148 && y > 134 && y < 146 ||
MenuMode == UPPER && x > 136 && x < 148 && y > 94 && y < 106) // else goto 6fa8
{
pPrefs->bMouse = !pPrefs->bMouse;
RedrawMenu(pPrefs, pHWPens);
return true;
}
if (MenuMode == LOWER && x > 124 && x < 136 && y > 134 && y < 146 ||
MenuMode == UPPER && x > 124 && x < 136 && y > 94 && y < 106) // else goto 7022
{
LocalID dbID = DmFindDatabase(0, "HWPenS-1");
UInt32 Results;
if (dbID)
SysAppLaunch(0, dbID, 0, HWDefinedCmd, NULL, &Results);
return true;
}
return false;
}
BOOL OnPenUp(EventPtr eventP, HW_PREF* pPrefs, HW_PENS* pHWPens, HW_TRACE* pHWTrace)
{
Boolean handled;
EventType evt1, evt2;
UInt16 PtCount = pHWTrace->PtCount;
if (PtCount == 0)
handled = false;
else if (pHWTrace->b2006)
handled = true;
else if (pHWTrace->b2007) {
pHWTrace->b2007 = 0;
pHWTrace->b2008 = 1;
evt1 = *eventP;
evt1.eType = penDownEvent;
EvtAddEventToQueue(&evt1);
EvtAddEventToQueue(eventP);
pHWTrace->PtCount = 0;
handled = true;
}
else {
pHWTrace->points[PtCount].x = 0xff; //(FF,00)表示笔划结束
pHWTrace->points[PtCount].y = 0;
pHWTrace->PtCount++;
evt2.eType = firstUserEvent + 1;
EvtAddEventToQueue(&evt2);
pHWTrace->dw2002 = TimGetTicks();
handled = true;
}
return handled;
}
BOOL OnPenMove(EventPtr eventP, HW_PREF* pPrefs, HW_PENS* pHWPens, HW_TRACE* pHWTrace)
{
Coord x, y;
UInt16 var_e, err, i;
RectangleType rc;
WindowType* winHandle, *winHandleSaved;
x = eventP->screenX;
y = eventP->screenY;
WinWindowToDisplayPt(&x, &y);
if (x > 160 || y > 160)
return false;
if ((var_e = pHWTrace->PtCount) == 0)
return false;
if (pHWTrace->b2006 != 0)
return true;
pHWTrace->points[var_e].x = x;
pHWTrace->points[var_e].y = y;
pHWTrace->PtCount++;
if (pHWTrace->b2007) { // or jump to 719e
Int16 deltaX, deltaY, d;
deltaX = x - pHWTrace->points[0].x;
if (deltaX >= 0)
d = deltaX;
else
d = -deltaX;
if (d <= 8) { // or 70f0
deltaY = y - pHWTrace->points[0].y;
if (deltaY >= 0)
d = deltaY;
else
d = -deltaY;
if (d <= 8)
return true;
}
RctSetRectangle(&rc, 0, 0, 160, 160);
winHandle = WinSetDrawWindow(WinGetDisplayWindow()); // d4
InsPtEnable(false);
winHandleSaved = WinSaveBits(&rc, &err); // d3
MemPtrSetOwner(winHandleSaved, 0);
InsPtEnable(true);
WinSetDrawWindow(winHandle);
FtrSet('HW99', 14, winHandleSaved);
pHWTrace->b2007 = false;
for (i = 0; i < pHWTrace->PtCount - 1; i++) // d3 = i
DrawStroke(pPrefs, pHWTrace->points[i], pHWTrace->points[i + 1]);
return true;
}
// only draw last stroke
i = pHWTrace->PtCount - 2;
DrawStroke(pPrefs, pHWTrace->points[i], pHWTrace->points[i + 1]);
return true;
}
BOOL HW_SysHandleEvent(EventPtr eventP)
{
MemHandle memPref, mem414, mem8202;
HW_PREF* pPrefs;
HW_PENS* pHWPens;
char* pHWTrace;
BOOL (*OrgSysHandleEvent)(EventPtr eventP);
FormPtr frm;
WinHandle winHandle;
EventType event;
UInt32 var_2e, i, j;
Int8 WaitTime;
UInt16 DeltaX, DeltaY;
if (!FtrGet('HW99', 10, (UInt32 *)&memPref))
pPrefs = (HW_PREF*)memPrefLock(memPref); // a2 = pPrefs
if (!FtrGet('HW99', 12, (UInt32 *)&mem414))
pHWPens = (HW_PENS*)memPrefLock(mem414); // a3
if (!FtrGet('HW99', 11, (UInt32 *)&mem8202))
pHWTrace = (char*)memPrefLock(mem8202); // d3
// 如果是半屏模式, 则退出.
if (!pPrefs->bHalfScrnInput) {// d4 = eventP
if (pHWTrace[8194] && eventP->eType == firstUserEvent + 1) {
WaitTime = pPrefs->RecogWaitTime * 10;
// 如果识别等待时间已过, 就开始识别
if (TimGetTicks() - pHWTrace[8194] > WaitTime) {
UInt16 range = GetRecogRange(pPrefs);
frm = FrmGetActiveForm(); // a4
pHWTrace[pHWTrace[8192] << 2] = 0xff; // (FF,FF)表示字的结束
pHWTrace[pHWTrace[8192] << 2 + 2] = 0xff;
pHWTrace[8192]++;
FtrGet('HW99', 14, &var_2e);
winHandle = WinSetDrawWindow(WinGetDisplayWindow()); // a5
WinRestoreBits(var_2e, 0, 0);
WinSetDrawWindow(winHandle);
if (pPrefs->bSplitScreen) {
pHWPens->index = 0;
if ((i = HWHalfScreenRecognize(pHWTrace, &pHWPens->Cands[pHWPens->index], 10, range)) > 0) { // d5
pHWPens->AssocNum = 0;
pHWPens->AssocOfs = 0;
j = 0; // d4
do EnqueueInputKeys(frm, pHWPens, j++, 0);
while (j < i - 1);
EnqueueInputKeys(frm, pHWPens, i - 1, 1);
}
}
else if (HWFullScreenRecognize(pHWTrace, pHWPens->Cands[pHWPens->index], 10, range) > 0) {
pHWPens->AssocNum = 0;
pHWPens->AssocOfs = 0;
EnqueueInputKeys(frm, pHWPens, pHWPens->index, 1);
pPrefs->bRedrawMenu = true;
}
MemSet(pHWTrace, 0, 8202, 0);
goto _exit;
}
else {
if (eventP->eType == firstUserEvent + 1) {
EvtGetEvent (&event, evtWaitForever);
if (event.eType == nilEvent) {
event.eType = firstUserEvent + 1;
EvtAddEventToQueue(&event);
}
goto _exit;
}
}
}
if (eventP->eType == penDownEvent) {
if (pPrefs->bSetting) {
pPrefs->ShotcutPenDownX = eventP->screenX;
pPrefs->ShotcutPenDownY = eventP->screenY;
}
else {
if (eventP->screenX - pPrefs->ShotcutPenDownX >= 0)
DeltaX = eventP->screenX - pPrefs->ShotcutPenDownX;
else
DeltaX = -(eventP->screenX - pPrefs->ShotcutPenDownX);
if (DeltaX <= 15) {
if (eventP->screenY - pPrefs->ShotcutPenDownY >= 0)
DeltaY = eventP->screenY - pPrefs->ShotcutPenDownY;
else
DeltaY = -(eventP->screenY - pPrefs->ShotcutPenDownY);
if (DeltaY <= 15) {
pPrefs->bUsingShortcut = 1;
goto _exit;
}
}
}
}
else if (eventP->eType == penUpEvent) {
if (pPrefs->bSetting) {
if (pPrefs->ShotcutPenDownX != -1) {
ControlType *controlP;
frm = GetActiveForm();
controlP = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1058));
pPrefs->ShotcutPenUpX = eventP->screenX;
pPrefs->ShotcutPenUpY = eventP->screenY;
pPrefs->bSetting = false;
CtlSetLabel(controlP, "设置完成!");
}
goto _exit;
}
else if (pPrefs->bUsingShortcut) {
frm = GetActiveForm();
if (eventP->screenX - pPrefs->ShotcutPenUpX > 0)
DeltaX = eventP->screenX - pPrefs->ShotcutPenUpX;
else
DeltaX = -(eventP->screenX - pPrefs->ShotcutPenUpX);
if (DeltaX <= 15) {
if (eventP->screenY - pPrefs->ShotcutPenUpY > 0)
DeltaY = eventP->screenY - pPrefs->ShotcutPenUpY;
else
DeltaY = -(eventP->screenY - pPrefs->ShotcutPenUpY);
if (DeltaY <= 15) {
UInt16 focus;
if ((focus = FrmGetFocus(frm)) != -1) {
pPrefs->bOpenHW = !pPrefs->bOpenHW;
if (pPrefs->bOpenHW)
pPrefs->bRedrawMenu = true;
else {
ClearMenu(pPrefs->MenuMode);
RedrawCurForm();
}
pPrefs->bUsingShortcut = 0;
goto _exit;
}
}
}
}
}
if (pPrefs->bOpenHW) {
if (pPrefs->bRedrawMenu) {
RedrawMenu(pPrefs, pHWPens);
pPrefs->bRedrawMenu = false;
}
if (pPrefs->Phase == ENTER) {
MemSet(pHWPens, 414, 0);
frm = FrmGetActiveForm();
if (frm && GetCurField(frm)) {
pHWPens->InsPtPos = FldGetInsPtPosition(GetCurField(frm));
if (pPrefs->bMenuFolded)
pPrefs->MenuMode = FOLDED;
else
pPrefs->MenuMode = GetMenuMode();
pPrefs->bRedrawMenu = true;
}
else
pPrefs->MenuMode = HIDDEN;
pPrefs->Phase = READY;
}
else if (pPrefs->Phase == LEAVE) {
if (pPrefs->MenuMode != HIDDEN) {
frm = FrmGetActiveForm(); // a4
if (frm) {
winHandle = WinGetActiveWindow();
if (winHandle == FrmGetWindowHandle(frm) && frm->focus != -1)
FrmDrawForm(frm);
}
}
pPrefs->Phase = READY;
}
else if (pPrefs->Phase == CHGFLD) {
frm = FrmGetActiveForm();
if (InsPtEnabled()) {
AdjustCandIndex(frm, pHWPens);
if (pPrefs->bMenuFolded) {
pPrefs->MenuMode = FOLDED;
pPrefs->bRedrawMenu = false; // then goto 6684
}
else {
Int8 MenuMode = GetMenuMode();
if (pPrefs->MenuMode == HIDDEN) {
pPrefs->MenuMode = MenuMode;
pPrefs->bRedrawMenu = true;
// goto 6684
}
else if (pPrefs->MenuMode != MenuMode) {
ClearMenu(pPrefs->MenuMode);
frm = FrmGetActiveForm();
if (FrmGetFocus(frm) != -1) {
RedrawCurForm();
pPrefs->MenuMode = MenuMode;
}
} // goto 6684
}
}
else if (pPrefs->MenuMode != HIDDEN) {
frm = GetActiveForm();
ClearMenu(pPrefs->MenuMode);
if (FrmGetFocus(frm) != -1) {
RedrawCurForm();
pPrefs->MenuMode = HIDDEN;
}
}
pPrefs->Phase = READY; // 6684 here
}
switch (eventP->eType)
{
case winEnterEvent:
case frmOpenEvent:
pPrefs->Phase = ENTER;
break;
case winExitEvent:
ClearMenu(pPrefs->MenuMode);
pPrefs->Phase = LEAVE;
break;
case fldEnterEvent:
case tblSelectEvent:
pPrefs->Phase = CHGFLD;
break;
case fldChangedEvent:
case frmUpdateEvent:
pPrefs->bRedrawMenu = true;
break;
default:
if (pPrefs->MenuMode != HIDDEN) {
switch (eventP->eType)
{
case penDownEvent:
if (pHWTrace[8200] == 0)
if (OnPenDown(eventP, pPrefs, pHWPens, pHWTrace))
goto _exit;
break;
case penUpEvent:
if (pHWTrace[8200] != 0)
pHWTrace[8200] = 0;
else if (pPrefs->bMouse == 0 && OnPenUp(eventP, pPrefs, pHWPens, pHWTrace))
goto _exit;
break;
case penMoveEvent:
if (pPrefs->bMouse == 0 && OnPenMove(eventP, pPrefs, pHWPens, pHWTrace))
goto _exit;
}
}
}
}
}
MemHandleUnlock(memPref);
MemHandleUnlock(mem414);
MemHandleUnlock(mem8202);
FtrGet('HW99', 13, (UInt32)&OrgSysHandleEvent);
return OrgSysHandleEvent(eventP);
_exit:
MemHandleUnlock(memPref);
MemHandleUnlock(mem414);
MemHandleUnlock(mem8202);
return 1;
}
static Err RomVersionCompatible (UInt32 requiredVersion, UInt16 launchFlags)
{
UInt32 romVersion;
DmSearchStateType stateInfoP;
UInt16 cardNo;
LocalID dbID;
// See if we have at least the minimum required version of the ROM or later.
FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion);
if (romVersion < requiredVersion)
{
if ((launchFlags & (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) ==
(sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp))
{
FrmAlert (RomIncompatibleAlert);
// Pilot 1.0 will continuously relaunch this app unless we switch to
// another safe one.
if (romVersion < version350)
{
DmGetNextDatabaseByTypeCreator(true, &stateInfoP, 'appl', 'pref', true, &cardNo, &dbID);
if (!dbID)
ErrDisplayFileLineMsg("HWGBIMEMain.c", 551, "Could not find app");
if (dbID && SysUIAppSwitch(cardNo, dbID, 0, 0))
ErrDisplayFileLineMsg("HWGBIMEMain.c", 551, "Could not launch app");
//AppLaunchWithCommand(sysFileCDefaultApp, sysAppLaunchCmdNormalLaunch, NULL);
}
}
return (sysErrRomIncompatib
