ocaml/maccaml/appleevents.c

148 lines
4.5 KiB
C

/***********************************************************************/
/* */
/* Objective Caml */
/* */
/* Damien Doligez, projet Para, INRIA Rocquencourt */
/* */
/* Copyright 1997 Institut National de Recherche en Informatique et */
/* en Automatique. All rights reserved. This file is distributed */
/* under the terms of the GNU Library General Public License, with */
/* the special exception on linking described in file ../LICENSE. */
/* */
/***********************************************************************/
/* $Id$ */
#include "main.h"
static OSErr GotRequiredParams (const AppleEvent *ae)
{
OSErr err;
DescType type;
Size sz;
err = AEGetAttributePtr (ae, keyMissedKeywordAttr, typeWildCard, &type, NULL,
0, &sz);
if (err == errAEDescNotFound) return noErr;
if (err == noErr) return errAEParamMissed;
return err;
}
static pascal OSErr HandleOpenApplication (const AppleEvent *ae,
AppleEvent *reply, long refCon)
{
#pragma unused (ae, reply, refCon)
launch_toplevel_requested = 1;
return noErr;
}
static pascal OSErr HandleQuitApplication (const AppleEvent *ae,
AppleEvent *reply, long refCon)
{
#pragma unused (ae, reply, refCon)
WindowPtr w = FrontWindow ();
WStatusH st;
int request_interaction = prefs.asksavetop && winToplevel != NULL;
OSErr err;
while (w != NULL){
WinUpdateStatus (w);
st = WinGetStatus (w);
if (st != NULL && (*st)->menuflags.save){
request_interaction = 1;
}
w = GetNextWindow (w);
}
if (request_interaction){
err = AEInteractWithUser (kAEDefaultTimeout, NULL, ProcessEventUPP);
if (err != noErr) return err;
}
err = DoQuit ();
if (err != noErr) return err;
return noErr;
}
static pascal OSErr HandleOpenDocuments (const AppleEvent *ae,
AppleEvent *reply, long refCon)
{
#pragma unused (reply, refCon)
FSSpec filespec;
AEDescList doclist = {0, NULL};
OSErr err;
long i, len;
Size sz;
AEKeyword key;
DescType type;
launch_toplevel_requested = 1;
err = AEGetParamDesc (ae, keyDirectObject, typeAEList, &doclist);
if (err != noErr) goto failed;
err = GotRequiredParams (ae);
if (err != noErr) goto failed;
err = AECountItems (&doclist, &len);
if (err != noErr) goto failed;
for (i = 1; i <= len; i++){
err = AEGetNthPtr (&doclist, i, typeFSS, &key, &type, &filespec,
sizeof (filespec), &sz);
if (err != noErr) goto failed;
err = FileOpen (&filespec);
if (err != noErr){
OSErr err2 = AEInteractWithUser (kAEDefaultTimeout, NULL,ProcessEventUPP);
if (err2 == noErr){
ErrorAlertCantOpen (filespec.name, err);
}else{
if (err2 == errAENoUserInteraction) err = err2;
goto failed;
}
}
}
AEDisposeDesc (&doclist);
return noErr;
failed:
if (doclist.dataHandle != NULL) AEDisposeDesc (&doclist);
return err;
}
static pascal OSErr HandlePrintDocuments (const AppleEvent *ae,
AppleEvent *reply, long refCon)
{
#pragma unused (ae, reply, refCon)
return errAEEventNotHandled; /* XXX */
}
OSErr InstallAEHandlers (void)
{
OSErr err;
err = AEInstallEventHandler (kCoreEventClass, kAEOpenApplication,
NewAEEventHandlerProc (HandleOpenApplication),
0, false);
if (err != noErr) goto failed;
err = AEInstallEventHandler (kCoreEventClass, kAEQuitApplication,
NewAEEventHandlerProc (HandleQuitApplication),
0, false);
if (err != noErr) goto failed;
err = AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments,
NewAEEventHandlerProc (HandleOpenDocuments),
0, false);
if (err != noErr) goto failed;
err = AEInstallEventHandler (kCoreEventClass, kAEPrintDocuments,
NewAEEventHandlerProc (HandlePrintDocuments),
0, false);
if (err != noErr) goto failed;
return noErr;
failed:
return err;
}