sl@0: /******************************* sl@0: Mac support for HID Test GUI sl@0: sl@0: Alan Ott sl@0: Signal 11 Software sl@0: sl@0: Some of this code is from Apple Documentation, most notably sl@0: http://developer.apple.com/legacy/mac/library/documentation/AppleScript/Conceptual/AppleEvents/AppleEvents.pdf sl@0: *******************************/ sl@0: sl@0: #include sl@0: #include sl@0: sl@0: sl@0: extern FXMainWindow *g_main_window; sl@0: sl@0: static pascal OSErr HandleQuitMessage(const AppleEvent *theAppleEvent, AppleEvent sl@0: *reply, long handlerRefcon) sl@0: { sl@0: puts("Quitting\n"); sl@0: FXApp::instance()->exit(); sl@0: return 0; sl@0: } sl@0: sl@0: static pascal OSErr HandleReopenMessage(const AppleEvent *theAppleEvent, AppleEvent sl@0: *reply, long handlerRefcon) sl@0: { sl@0: puts("Showing"); sl@0: g_main_window->show(); sl@0: return 0; sl@0: } sl@0: sl@0: static pascal OSErr HandleWildCardMessage(const AppleEvent *theAppleEvent, AppleEvent sl@0: *reply, long handlerRefcon) sl@0: { sl@0: puts("WildCard\n"); sl@0: return 0; sl@0: } sl@0: sl@0: OSStatus AEHandler(EventHandlerCallRef inCaller, EventRef inEvent, void* inRefcon) sl@0: { sl@0: Boolean release = false; sl@0: EventRecord eventRecord; sl@0: OSErr ignoreErrForThisSample; sl@0: sl@0: // Events of type kEventAppleEvent must be removed from the queue sl@0: // before being passed to AEProcessAppleEvent. sl@0: if (IsEventInQueue(GetMainEventQueue(), inEvent)) sl@0: { sl@0: // RemoveEventFromQueue will release the event, which will sl@0: // destroy it if we don't retain it first. sl@0: RetainEvent(inEvent); sl@0: release = true; sl@0: RemoveEventFromQueue(GetMainEventQueue(), inEvent); sl@0: } sl@0: // Convert the event ref to the type AEProcessAppleEvent expects. sl@0: ConvertEventRefToEventRecord(inEvent, &eventRecord); sl@0: ignoreErrForThisSample = AEProcessAppleEvent(&eventRecord); sl@0: if (release) sl@0: ReleaseEvent(inEvent); sl@0: // This Carbon event has been handled, even if no AppleEvent handlers sl@0: // were installed for the Apple event. sl@0: return noErr; sl@0: } sl@0: sl@0: static void HandleEvent(EventRecord *event) sl@0: { sl@0: //printf("What: %d message %x\n", event->what, event->message); sl@0: if (event->what == osEvt) { sl@0: if (((event->message >> 24) & 0xff) == suspendResumeMessage) { sl@0: if (event->message & resumeFlag) { sl@0: g_main_window->show(); sl@0: } sl@0: } sl@0: } sl@0: sl@0: #if 0 sl@0: switch (event->what) sl@0: { sl@0: case mouseDown: sl@0: //HandleMouseDown(event); sl@0: break; sl@0: case keyDown: sl@0: case autoKey: sl@0: //HandleKeyPress(event); sl@0: break; sl@0: case kHighLevelEvent: sl@0: puts("Calling ProcessAppleEvent\n"); sl@0: AEProcessAppleEvent(event); sl@0: break; sl@0: } sl@0: #endif sl@0: } sl@0: sl@0: void sl@0: init_apple_message_system() sl@0: { sl@0: OSErr err; sl@0: static const EventTypeSpec appleEvents[] = sl@0: { sl@0: { kEventClassAppleEvent, kEventAppleEvent } sl@0: }; sl@0: sl@0: /* Install the handler for Apple Events */ sl@0: InstallApplicationEventHandler(NewEventHandlerUPP(AEHandler), sl@0: GetEventTypeCount(appleEvents), appleEvents, 0, NULL); sl@0: sl@0: /* Install handlers for the individual Apple Events that come sl@0: from the Dock icon: the Reopen (click), and the Quit messages. */ sl@0: err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, sl@0: NewAEEventHandlerUPP(HandleQuitMessage), 0, false); sl@0: err = AEInstallEventHandler(kCoreEventClass, kAEReopenApplication, sl@0: NewAEEventHandlerUPP(HandleReopenMessage), 0, false); sl@0: #if 0 sl@0: // Left as an example of a wild card match. sl@0: err = AEInstallEventHandler(kCoreEventClass, typeWildCard, sl@0: NewAEEventHandlerUPP(HandleWildMessage), 0, false); sl@0: #endif sl@0: } sl@0: sl@0: void sl@0: check_apple_events() sl@0: { sl@0: RgnHandle cursorRgn = NULL; sl@0: Boolean gotEvent=TRUE; sl@0: EventRecord event; sl@0: sl@0: while (gotEvent) { sl@0: gotEvent = WaitNextEvent(everyEvent, &event, 0L/*timeout*/, cursorRgn); sl@0: if (gotEvent) { sl@0: HandleEvent(&event); sl@0: } sl@0: } sl@0: }