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