2 A simple menu command to send the contents of a window to the Python interpreter
4 copyright © 1996 Just van Rossum, Letterror: just@knoware.nl
11 OSErr
SendTextAsAE(ExternalCallbackBlock
*callbacks
, Ptr theText
, long theSize
, Str255 windowTitle
)
15 AEAddressDesc theTarget
;
19 OSType pythonSig
= 'Pyth';
23 EventRecord theDummyEvent
;
25 /* initialize AE descriptor for python's signature */
26 err
= AECreateDesc (typeApplSignature
, &pythonSig
, sizeof(OSType
), &theTarget
);
27 if(err
!= noErr
) return err
;
29 /* initialize AE descriptor for the title of our window */
30 err
= AECreateDesc (typeChar
, &windowTitle
[1], windowTitle
[0], &theNameDesc
);
31 if(err
!= noErr
) return err
;
33 /* initialize AE descriptor for the content of our window */
34 err
= AECreateDesc ('TEXT', theText
, theSize
, &theTextDesc
);
35 if(err
!= noErr
) return err
;
37 /* initialize AppleEvent */
38 err
= AECreateAppleEvent ('pyth', 'EXEC', &theTarget
, kAutoGenerateReturnID
, kAnyTransactionID
, &theEvent
);
39 if(err
!= noErr
) return err
;
41 /* add the content of our window to the AppleEvent */
42 err
= AEPutParamDesc (&theEvent
, keyDirectObject
, &theTextDesc
);
43 if(err
!= noErr
) return err
;
45 /* add the title of our window to the AppleEvent */
46 err
= AEPutParamDesc (&theEvent
, 'NAME', &theNameDesc
);
47 if(err
!= noErr
) return err
;
49 /* send the AppleEvent */
50 err
= AESend (&theEvent
, &theReply
, kAEWaitReply
, kAEHighPriority
, kNoTimeOut
, NULL
, NULL
);
51 if(err
== connectionInvalid
) {
52 // launch PythonSlave.py
53 itemHit
= Alert(128, NULL
);
54 if(itemHit
== 2) return noErr
; /* user cancelled */
56 if( ! GetPythonSlaveSpec(&docSpec
) )
57 return noErr
; /* user cancelled */
59 err
= LaunchPythonSlave(&docSpec
);
60 if(err
!= noErr
) return err
;
61 } else if(err
!= noErr
)
65 err
= AEDisposeDesc (&theTarget
);
66 if(err
!= noErr
) return err
;
68 err
= AEDisposeDesc (&theNameDesc
);
69 if(err
!= noErr
) return err
;
71 err
= AEDisposeDesc (&theTextDesc
);
72 if(err
!= noErr
) return err
;
74 err
= AEDisposeDesc (&theEvent
);
75 if(err
!= noErr
) return err
;
77 err
= AEDisposeDesc (&theReply
);
78 if(err
!= noErr
) return err
;
80 /* everything is cool */
84 pascal void main(ExternalCallbackBlock
*callbacks
, WindowPtr theWindow
)
88 Handle windowContents
;
91 //RememberA0(); /* Can't find header file for this. Seems to work anyway. */
95 GetWTitle(theWindow
, windowTitle
);
96 windowContents
= callbacks
->GetWindowContents(theWindow
);
98 HLock(windowContents
);
99 err
= SendTextAsAE(callbacks
, *windowContents
, GetHandleSize(windowContents
), windowTitle
);
100 if(err
!= noErr
) callbacks
->ReportOSError(err
);
101 HUnlock(windowContents
);