snes9x/macosx/mac-appleevent.cpp

168 lines
3.9 KiB
C++
Executable File

/*****************************************************************************\
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
This file is licensed under the Snes9x License.
For further information, consult the LICENSE file in the root directory.
\*****************************************************************************/
/***********************************************************************************
SNES9X for Mac OS (c) Copyright John Stiles
Snes9x for Mac OS X
(c) Copyright 2001 - 2011 zones
(c) Copyright 2002 - 2005 107
(c) Copyright 2002 PB1400c
(c) Copyright 2004 Alexander and Sander
(c) Copyright 2004 - 2005 Steven Seeger
(c) Copyright 2005 Ryan Vogt
***********************************************************************************/
#include "port.h"
#include "mac-prefix.h"
#include "mac-os.h"
#include "mac-snes9x.h"
#include "mac-appleevent.h"
static AEEventHandlerUPP oappUPP, rappUPP, pdocUPP, quitUPP, odocUPP;
static pascal OSErr AEoapp (const AppleEvent *, AppleEvent *, long);
static pascal OSErr AErapp (const AppleEvent *, AppleEvent *, long);
static pascal OSErr AEpdoc (const AppleEvent *, AppleEvent *, long);
static pascal OSErr AEquit (const AppleEvent *, AppleEvent *, long);
static pascal OSErr AEodoc (const AppleEvent *, AppleEvent *, long);
static pascal OSErr AEoapp (const AppleEvent *theEvent, AppleEvent *theReply, long refCon)
{
if (running)
return (noErr);
if (startopendlog)
{
if (SNES9X_OpenCart(NULL))
{
SNES9X_Go();
QuitApplicationEventLoop();
}
else
AdjustMenus();
}
return (noErr);
}
static pascal OSErr AErapp (const AppleEvent *theEvent, AppleEvent *theReply, long refCon)
{
if (running)
return (noErr);
if (!cartOpen)
{
if (startopendlog)
{
if (SNES9X_OpenCart(NULL))
{
SNES9X_Go();
QuitApplicationEventLoop();
}
else
AdjustMenus();
}
}
else
{
SNES9X_Go();
QuitApplicationEventLoop();
}
return (noErr);
}
static pascal OSErr AEpdoc (const AppleEvent *theEvent, AppleEvent *theReply, long refCon)
{
return (errAEEventNotHandled);
}
static pascal OSErr AEquit (const AppleEvent *theEvent, AppleEvent *theReply, long refCon)
{
if (running)
return (noErr);
SNES9X_Quit();
QuitApplicationEventLoop();
return (noErr);
}
static pascal OSErr AEodoc (const AppleEvent *theEvent, AppleEvent *theReply, long refCon)
{
OSErr err;
FSRef ref;
AEDescList docList;
AEKeyword keywd;
DescType rtype;
Size acsize;
long count;
if (running)
return (noErr);
err = AEGetParamDesc(theEvent, keyDirectObject, typeAEList, &docList);
if (err)
return (noErr);
err = AECountItems(&docList, &count);
if (err || (count != 1))
{
err = AEDisposeDesc(&docList);
return (noErr);
}
err = AEGetNthPtr(&docList, 1, typeFSRef, &keywd, &rtype, &ref, sizeof(FSRef), &acsize);
if (err == noErr)
{
if (SNES9X_OpenCart(&ref))
{
SNES9X_Go();
QuitApplicationEventLoop();
}
else
AdjustMenus();
}
err = AEDisposeDesc(&docList);
return (noErr);
}
void InitAppleEvents (void)
{
OSErr err;
oappUPP = NewAEEventHandlerUPP(AEoapp);
err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, oappUPP, 0L, false);
odocUPP = NewAEEventHandlerUPP(AEodoc);
err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, odocUPP, 0L, false);
pdocUPP = NewAEEventHandlerUPP(AEpdoc);
err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, pdocUPP, 0L, false);
quitUPP = NewAEEventHandlerUPP(AEquit);
err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, quitUPP, 0L, false);
rappUPP = NewAEEventHandlerUPP(AErapp);
err = AEInstallEventHandler(kCoreEventClass, kAEReopenApplication, rappUPP, 0L, false);
}
void DeinitAppleEvents (void)
{
DisposeAEEventHandlerUPP(oappUPP);
DisposeAEEventHandlerUPP(odocUPP);
DisposeAEEventHandlerUPP(pdocUPP);
DisposeAEEventHandlerUPP(quitUPP);
DisposeAEEventHandlerUPP(rappUPP);
}