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 <Carbon/Carbon.h>
sl@0: #include <fx.h>
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: }