diff options
Diffstat (limited to 'Mac/Contrib/BBPy/source/BBPy_main.c')
-rw-r--r-- | Mac/Contrib/BBPy/source/BBPy_main.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/Mac/Contrib/BBPy/source/BBPy_main.c b/Mac/Contrib/BBPy/source/BBPy_main.c new file mode 100644 index 0000000..a96b271 --- /dev/null +++ b/Mac/Contrib/BBPy/source/BBPy_main.c @@ -0,0 +1,104 @@ +/* BBPython + A simple menu command to send the contents of a window to the Python interpreter + + copyright © 1996 Just van Rossum, Letterror: just@knoware.nl + + All Rights Reserved +*/ + +#include "BBPy.h" + +OSErr SendTextAsAE(ExternalCallbackBlock *callbacks, Ptr theText, long theSize, Str255 windowTitle) +{ + OSErr err; + AEDesc theEvent; + AEAddressDesc theTarget; + AppleEvent theReply; + AEDesc theTextDesc; + AEDesc theNameDesc; + OSType pythonSig = 'Pyth'; + FSSpec docSpec; + short itemHit; + long time; + EventRecord theDummyEvent; + + /* initialize AE descriptor for python's signature */ + err = AECreateDesc (typeApplSignature, &pythonSig, sizeof(OSType), &theTarget); + if(err != noErr) return err; + + /* initialize AE descriptor for the title of our window */ + err = AECreateDesc (typeChar, &windowTitle[1], windowTitle[0], &theNameDesc); + if(err != noErr) return err; + + /* initialize AE descriptor for the content of our window */ + err = AECreateDesc ('TEXT', theText, theSize, &theTextDesc); + if(err != noErr) return err; + + /* initialize AppleEvent */ + err = AECreateAppleEvent ('pyth', 'EXEC', &theTarget, kAutoGenerateReturnID, kAnyTransactionID, &theEvent); + if(err != noErr) return err; + + /* add the content of our window to the AppleEvent */ + err = AEPutParamDesc (&theEvent, keyDirectObject, &theTextDesc); + if(err != noErr) return err; + + /* add the title of our window to the AppleEvent */ + err = AEPutParamDesc (&theEvent, 'NAME', &theNameDesc); + if(err != noErr) return err; + + /* send the AppleEvent */ + err = AESend (&theEvent, &theReply, kAEWaitReply, kAEHighPriority, kNoTimeOut, NULL, NULL); + if(err == connectionInvalid) { + // launch PythonSlave.py + itemHit = Alert(128, NULL); + if(itemHit == 2) return noErr; /* user cancelled */ + + if( ! GetPythonSlaveSpec(&docSpec) ) + return noErr; /* user cancelled */ + + err = LaunchPythonSlave(&docSpec); + if(err != noErr) return err; + } else if(err != noErr) + return err; + + /* clean up */ + err = AEDisposeDesc (&theTarget); + if(err != noErr) return err; + + err = AEDisposeDesc (&theNameDesc); + if(err != noErr) return err; + + err = AEDisposeDesc (&theTextDesc); + if(err != noErr) return err; + + err = AEDisposeDesc (&theEvent); + if(err != noErr) return err; + + err = AEDisposeDesc (&theReply); + if(err != noErr) return err; + + /* everything is cool */ + return noErr; +} + +pascal void main(ExternalCallbackBlock *callbacks, WindowPtr theWindow) +{ + long oldA4; + OSErr err; + Handle windowContents; + Str255 windowTitle; + + //RememberA0(); /* Can't find header file for this. Seems to work anyway. */ + + oldA4 = SetUpA4(); + + GetWTitle(theWindow, windowTitle); + windowContents = callbacks->GetWindowContents(theWindow); + + HLock(windowContents); + err = SendTextAsAE(callbacks, *windowContents, GetHandleSize(windowContents), windowTitle); + if(err != noErr) callbacks->ReportOSError(err); + HUnlock(windowContents); + + RestoreA4(oldA4); +} |