continue (15千字)
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 (sysErrRomIncompatible);
}
return (0);
}
static void SetDefaultValues(void)
{
MemHandle memHandle;
HW_PREF* pPrefs;
FormPtr frm;
frm = FrmGetActiveForm(); // a2 = frm
if (FtrGet('HW99', 10, (UInt32 *)&memHandle)) {
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1001), 0);
return;
}
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1001), 1);
pPrefs = (HW_PREF*)MemHandleLock(memHandle); // a3 = ptr
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1008), (Int16)(pPrefs->flags & HW_NUMERIC)); //数字
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1010), (Int16)(pPrefs->flags & HW_ENGLISH)); //英文
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1012), (Int16)(pPrefs->flags & HW_SYMBOL)); //符号
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1011), (Int16)(pPrefs->flags & HW_SUBCOMMONCCHAR)); //次常用汉字
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1009), (Int16)(pPrefs->flags & HW_COMMONCCHAR)); //常用汉字
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1013), (Int16)(pPrefs->flags & HW_TRA2SIMPLIFIED)); //写繁得简
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1003), pPrefs->bSplitScreen); //启动全屏分割
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1060), (Int16)(pPrefs->flags & HW_HALF2FULL)); //半角字符转成全角字符
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1061), (Int16)(pPrefs->flags & HW_UPPER2LOWER)); //大写字母转成小写字母
FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1062), (Int16)(pPrefs->flags & HW_LOWER2UPPER)); //小写字母转成大写字母
FrmSetControlGroupSelection(frm, 3, (Int16)(pPrefs->PenColor + 1017)); //笔迹颜色选择
FrmSetControlGroupSelection(frm, 4, (Int16)(pPrefs->RecogWaitTime + 1043)); //识别等待时间
FrmSetControlGroupSelection(frm, 2, (Int16)(pPrefs->PenThickness + 1052)); //笔迹粗细
CtlSetLabel(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1058)), "设置快捷方式");
MemHandleUnlock(memHandle);
}
void DrawTabLines(void)
{
int i;
Coord x1 = 3;
Coord y1 = 22;
Coord x2, y2;
WinHandle winHandle = WinGetDisplayWindow(); // a2 = winHandle
WinSetDrawWindow(winHandle);
for (i = 0; i < 4; i++) {
x2 = x1;
y2 = y1 - 15;
WinDrawLine(x1, y1, x2, y2);
y1 = y2;
x2 += 4;
y2 -= 4;
WinDrawLine(x1, y1, x2, y2);
x1 = x2;
y1 = y2;
x2 = x1 + 30;
WinDrawLine(x1, y1, x2, y2);
x1 = x2;
x2 += 4;
y2 += 4;
WinDrawLine(x1, y1, x2, y2);
x1 = x2;
y1 = y2;
y2 += 15;
WinDrawLine(x1, y1, x2, y2);
}
y2 += 135;
WinDrawLine(x1, y1, x1, y2);
WinDrawLine(x1, y2, 3, y2);
WinDrawLine(3, y2, 3, (Coord)(y2 - 135));
WinDrawLine(41, y2, 3 + 4 * 38, y2);
}
void DrawActiveTab(int);
void DrawGroupFrame(Int16 left, Int16 top, Int16 right, Int16 bottom, char* title, Int16 i, Boolean b);
// 显示"设置"选项卡中的控件
void ShowSettingControls(void)
{
FormPtr frm;
MemHandle memHandle;
frm = FrmGetActiveForm(); // a2 = frm
DrawActiveTab(0);
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1001)));
if (!FtrGet('HW99', 10, (UInt32 *)&memHandle)) {
CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1004)), true); //"设置"选项卡
CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1005)), true); //"笔迹"选项卡
CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1006)), true); //"辅助"选项卡
CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1007)), true); //"关于"选项卡
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1008))); //数字
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1009))); //常用汉字
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1010))); //英文
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1011))); //次常用汉字
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1012))); //符号
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1013))); //写繁得简
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1044))); //识别等待
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1045))); //识别等待
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1046))); //识别等待
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1047))); //识别等待
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1048))); //识别等待
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1049))); //识别等待
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1050))); //识别等待
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1051))); //识别等待
CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1052))); //识别等待
FrmShowObject(frm, FrmGetObjectIndex(frm, 1015)); //长
FrmShowObject(frm, FrmGetObjectIndex(frm, 1016)); //短
DrawGroupFrame(50, 8, 65, 140, "识别范围", 10, true); //"识别范围"框
DrawGroupFrame(125, 8, 25, 140, "识别等待时间", 10, true); //"识别等待时间"框
}
else {
CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1004)), false); //"设置"选项卡
CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1005)), false); //"笔迹"选项卡
CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1006)), false); //"辅助"选项卡
CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1007)), false); //"关于"选项卡
}
}
static Boolean HW_HandleEvent(EventPtr event)
{
FormPtr frm;
Boolean handled = false;
MemHandle memHandle;
HW_PREF* pPrefs;
MemHandle BitmapHandle;
BitmapPtr BitmapPtr;
frm = FrmGetActiveForm (); // a3 = frm
if (event->eType == frmOpenEvent) {
BitmapHandle = DmGet1Resource(bitmapRsc, 0x44c); // a2 = MemHandle
BitmapPtr = MemHandleLock(BitmapHandle); // a4
WinPaintBitmap(BitmapPtr, 40, 10);
MemHandleUnlock(BitmapHandle);
DmReleaseResource(BitmapHandle);
WinScreenLock(winLockCopy);
SetDefaultValues();
FrmDrawForm(frm);
DrawTabLines();
ShowSettingControls();
WinScreenUnlock();
handled = true;
}
else if (event->eType == ctlSelectEvent) {
switch (event->data.ctlSelect.controlID)
{
case 1001: //启动汉王手写输入法
if (event->data.ctlSelect.on) {
if (HW_Install()) return true;
SetDefaultValues();
ShowSettingControls();
if (FtrGet('HW99', 10, (UInt32 *)&memHandle))
return true;
pPrefs = (HW_PREF*)MemHandleLock(memHandle); // a3 = ptr
pPrefs->bOpenHW = true;
pPrefs->MenuMode = HIDDEN;
MemHandleUnlock(memHandle);
}
else {
HideSettingControls();
HW_Uninstall();
}
handled = true;
break;
case 1004: //"设置"选项卡
HidePenControls();
HideAccessorialControls();
HideAboutControls();
ShowSettingControls();
handled = true;
break;
case 1005: //"笔迹"选项卡
HideSettingControls();
HideAccessorialControls();
HideAboutControls();
ShowPenControls();
handled = true;
break;
case 1006: //"辅助"选项卡
HideSettingControls();
HidePenControls();
HideAboutControls();
ShowAccessorialControls();
handled = true;
break;
case 1007: //"关于"选项卡
HideSettingControls();
HidePenControls();
HideAccessorialControls();
ShowAboutControls();
handled = true;
break;
case 1017: //笔迹颜色: 彩色
case 1018: //笔迹颜色: 红色
case 1019: //笔迹颜色: 绿色
case 1020: //笔迹颜色: 棕色
case 1021: //笔迹颜色: 黑色
case 1022: //笔迹颜色: 蓝色
case 1023: //笔迹颜色: 黄色
case 1024: //笔迹颜色: 紫色
handled = true;
break;
case 1058: //启动/关闭快捷方式设置
handled = true;
break;
case 1061: //大写字母转成小写字母
handled = true;
break;
case 1062: //小写字母转成大写字母
handled = true;
break;
}
}
return (handled);
}
static Boolean ApplicationHandleEvent (EventPtr event)
{
UInt16 formId;
FormPtr frm;
if (event->eType == frmLoadEvent)
{
// Load the form resource.
formId = event->data.frmLoad.formID;
frm = FrmInitForm (formId);
FrmSetActiveForm (frm);
// Set the event handler for the form. The handler of the currently
// active form is called by FrmHandleEvent each time is receives an
// event.
if (formId == HW_MainForm)
FrmSetEventHandler (frm, HW_HandleEvent);
return (true);
}
return (false);
}
static void EventLoop (void)
{
EventType event;
do {
EvtGetEvent (&event, evtWaitForever);
if (! SysHandleEvent (&event))
if (! ApplicationHandleEvent (&event))
FrmDispatchEvent (&event);
} while (event.eType != appStopEvent);
}
// 加载汉字识别编码库
int LoadRecognitionDB()
{
DmOpenRef dor;
MemPtr* mp;
MemPtr* ptr;
UInt16 i;
dor = DmOpenDatabaseByTypeCreator('GB68', 'HW99', dmModeReadOnly); // a3
if (!dor) return -1;
mp = (MemPtr*)MemPtrNew(86 * sizeof(void*)); // a4
if (!mp) {
DmCloseDatabase(dor);
return -2;
}
////////////////////////////////////////////////////////////////////////////////
// Specify 0 to set the owner to the operating system.
// When you allocate a parameter block to pass to SysUIAppSwitch or
// SysAppLaunch, you must call MemPtrSetOwner or MemHandleSetOwner to grant
// ownership of the parameter block chunk, and any other chunks referenced
// in it, to the OS (your application is originally set as the owner).
// If you don't change the ownership of the parameter block, it will get freed
// before the application you're launching has a chance to use it.
////////////////////////////////////////////////////////////////////////////////
MemPtrSetOwner(mp, 0);
for (i = 0; i < 22; i++) // d3 = i, a6 = mp
mp[i] = MemHandleLock(DmQueryRecord(dor, i));
DmCloseDatabase(dor);
for (i = 6, ptr = &mp[22]; i < 22; i++) {
*ptr++ = mp[i];
*ptr++ = (Int8*)mp[i] + 9757;
*ptr++ = (Int8*)mp[i] + 19514;
*ptr++ = (Int8*)mp[i] + 29271;
}
if (FtrSet('HW99', 1, (UInt32)mp)) {
for (i = 0; i < 22; i++)
MemPtrUnlock(mp[i]);
MemChunkFree(mp);
return -3;
}
return 0;
}
// 加载多元词组联想库
int LoadPhraseDB()
{
DmOpenRef dor;
MemHandle** mp;
UInt16 i;
// In Resource Database Header, there are type and creator fields holding
// 4-byte signatures of the database type and creator as defined by the
// application that created the database.
dor = DmOpenDatabaseByTypeCreator('HMPR', 'HW99', dmModeReadOnly); // a3
if (!dor) return -1;
mp = (MemHandle**)MemPtrNew(4 * sizeof(void*)); // a4
if (!mp) {
DmCloseDatabase(dor);
return -2;
}
MemPtrSetOwner(mp, 0);
for (i = 0; i < 4; i++) // d3 = i, a6 = mp
mp[i] = MemHandleLock(DmQueryRecord(dor, i));
DmCloseDatabase(dor);
if (FtrSet('HW99', 2, (UInt32)mp)) {
for (i = 0; i < 4; i++)
MemPtrUnlock(mp[i]);
MemChunkFree(mp);
return -3;
}
return 0;
}
// 安装汉王手写系统
int HW_Install(void)
{
MemHandle memHandlePref, memHandle2, memHandle3;
HW_PREF* pPref;
void* mp2, *mp3;
UInt16 sz = sizeof(HW_PREF);
LocalID dbID;
LoadRecognitionDB(); // 加载汉字识别编码库
LoadPhraseDB(); // 加载多元词组联想库
memHandlePref = MemHandleNew(sz);
if (!memHandlePref) return 1;
MemHandleSetOwner(memHandlePref, 0);
memHandle2 = MemHandleNew(8202);
if (!memHandle2) {
MemHandleFree(memHandlePref);
return 1;
}
MemHandleSetOwner(memHandle2, 0);
memHandle3 = MemHandleNew(414);
if (!memHandle3) {
MemHandleFree(memHandlePref);
MemHandleFree(memHandle2);
return 1;
}
MemHandleSetOwner(memHandle3, 0);
if (FtrSet('HW99', 10, (UInt32)memHandlePref) ||
FtrSet('HW99', 11, (UInt32)memHandle2) ||
FtrSet('HW99', 12, (UInt32)memHandle3))
{
MemHandleFree(memHandlePref);
MemHandleFree(memHandle2);
MemHandleFree(memHandle3);
return 1;
}
pPref = (HW_PREF*)MemHandleLock(memHandlePref); // a2
mp2 = MemHandleLock(memHandle3); // d4
mp3 = MemHandleLock(memHandle2); // d5
if (PrefGetAppPreferences('HW99', 0, pPref, &sz, true) == noPreferenceFound) {
pPref->bInstallHW = true;
pPref->flags = 3;
pPref->RecogRange = HW_COMMONCCHAR; // 默认识别范围为: 常用汉字
pPref->RecogWaitTime = 3;
pPref->PenThickness = 2;
pPref->PenColor = 0;
pPref->ShotcutPenDownX = 0;
pPref->ShotcutPenDownY = 0;
pPref->ShotcutPenUpX = 0;
pPref->ShotcutPenUpY = 0;
pPref->bSetting = false;
pPref->bUsingShortcut = false;
pPref->bSplitScreen = false;
pPref->bHalfToFull = false;
pPref->bLowerToUpper = false;
pPref->bUpperToLower = false;
pPref->bOpenHW = true;
pPref->bHalfScrnInput = false;
pPref->bMouse = false;
pPref->bRedrawMenu = false;
pPref->Phase = READY;
if (ChkReg() == 99)
pPref->bReged = 0xff;
else
pPref->bReged = 0;
pPref->MenuMode = HIDDEN;
pPref->bMenuFolded = 1;
PrefSetAppPreferences('HW99', 6, 0, pPref, sz, true);
}
else {
if (ChkReg() == 99)
pPref->bReged = 0xff;
else
pPref->bReged = 0;
}
MemSet(mp2, 414, 0);
MemSet(mp3, 8202, 0);
if (FtrSet('HW99', 13, (UInt32)SysGetTrapAddress(sysTrapSysHandleEvent)))
return 1;
SysSetTrapAddress(sysTrapSysHandleEvent, HW_SysHandleEvent);
dbID = DmFindDatabase(0, "HWPenS-1"); // d4
if (dbID) {
SysNotifyRegister(
0, // cardNo of the storage card on which the app code resource resides.
dbID, // Local ID of the application or code resource
'sync', // The notification that the application wants to receive
NULL, // Set to NULL to receive the notification as an app launch code.
sysNotifyNormalPriority,
0 // userDataP Caller-defined data to pass to the notification handler
);
}
MemHandleUnlock(memHandlePref);
MemHandleUnlock(memHandle2);
MemHandleUnlock(memHandle3);
FtrSet('HW99', 24, 0);
return 0;
}
int UnloadRecognitionDB(void)
{
void** mp;
int i;
if (FtrGet('HW99', 1, (UInt32*)&mp) || !mp)
return -1;
for (i = 0; i < 22; i++)
MemPtrUnlock(mp[i]);
MemChunkFree(mp);
FtrUnregister('HW99', 1);
return 0;
}
int UnloadPhraseDB(void)
{
void** mp;
int i;
if (FtrGet('HW99', 2, (UInt32*)&mp) || !mp)
return -1;
for (i = 0; i < 4; i++)
MemPtrUnlock(mp[i]);
MemChunkFree(mp);
FtrUnregister('HW99', 2);
return 0;
}
