summaryrefslogtreecommitdiffstats
path: root/Mac/Contrib/BBPy/source/BBPy_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Contrib/BBPy/source/BBPy_main.c')
-rw-r--r--Mac/Contrib/BBPy/source/BBPy_main.c104
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);
+}