| /* 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); |
| } |