pascal OSStatus AutofireWindowEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEvent, void *inUserData) { #pragma unused (inHandlerRef) OSStatus err, result = eventNotHandledErr; WindowRef tWindowRef = (WindowRef) inUserData; switch (GetEventClass(inEvent)) { case kEventClassWindow: switch (GetEventKind(inEvent)) { case kEventWindowClose: QuitAppModalLoopForWindow(tWindowRef); result = noErr; } break; case kEventClassCommand: switch (GetEventKind(inEvent)) { case kEventCommandProcess: HICommand tHICommand; HIViewRef root; int player = -1; root = HIViewGetRoot(tWindowRef); err = GetEventParameter(inEvent, kEventParamDirectObject, typeHICommand, nil, sizeof(HICommand), nil, &tHICommand); if (err == noErr) { switch (tHICommand.commandID) { case 'DEF1': player = 0; break; case 'DEF2': player = 1; break; } if (player != -1) { autofireRec[player].buttonMask = 0x0000; autofireRec[player].toggleMask = 0xFFF0; autofireRec[player].tcMask = 0x0000; autofireRec[player].invertMask = 0x0000; autofireRec[player].frequency = 10; AutofireReadAllSettings(player + 1, root); result = noErr; } } } } return result; }
void ConfigureAutofire (void) { OSStatus err; IBNibRef nibRef; err = CreateNibReference(kMacS9XCFString, &nibRef); if (err == noErr) { WindowRef tWindowRef; err = CreateWindowFromNib(nibRef, CFSTR("AutoFire"), &tWindowRef); if (err == noErr) { EventHandlerRef wRef, tRef; EventHandlerUPP wUPP, tUPP; EventTypeSpec wEvent[] = { { kEventClassWindow, kEventWindowClose }, { kEventClassCommand, kEventCommandProcess }, { kEventClassCommand, kEventCommandUpdateStatus } }, tEvent[] = { { kEventClassControl, kEventControlHit } }; ControlActionUPP actionUPP; HIViewRef ctl, root; HIViewID cid; root = HIViewGetRoot(tWindowRef); wUPP = NewEventHandlerUPP(AutofireWindowEventHandler); err = InstallWindowEventHandler(tWindowRef, wUPP, GetEventTypeCount(wEvent), wEvent, (void *) tWindowRef, &wRef); cid.signature = 'Ftab'; cid.id = 256; HIViewFindByID(root, cid, &ctl); SetControl32BitValue(ctl, autofireLastTabIndex); AutofireSelectTabPane(ctl, autofireLastTabIndex); tUPP = NewEventHandlerUPP(AutofireTabEventHandler); err = InstallControlEventHandler(ctl, tUPP, GetEventTypeCount(tEvent), tEvent, 0, &tRef); actionUPP = NewControlActionUPP(AutofireSliderActionProc); for (int player = 0; player < 2; player++) { AutofireSetAllIconImages(player + 1, root); AutofireReadAllSettings(player + 1, root); cid.id = player + 1; cid.signature = 'Slid'; HIViewFindByID(root, cid, &ctl); SetControlAction(ctl, actionUPP); } MoveWindowPosition(tWindowRef, kWindowAutoFire, false); ShowWindow(tWindowRef); err = RunAppModalLoopForWindow(tWindowRef); HideWindow(tWindowRef); SaveWindowPosition(tWindowRef, kWindowAutoFire); for (int player = 0; player < 2; player++) AutofireWriteAllSettings(player + 1, root); autofire = (autofireRec[0].buttonMask || autofireRec[1].buttonMask) ? true : false; err = RemoveEventHandler(tRef); DisposeEventHandlerUPP(tUPP); err = RemoveEventHandler(wRef); DisposeEventHandlerUPP(wUPP); DisposeControlActionUPP(actionUPP); CFRelease(tWindowRef); } DisposeNibReference(nibRef); } }