| # (Slightly less) primitive operations for sending Apple Events to applications. |
| # This could be the basis of a Script Editor like application. |
| |
| from AE import * |
| from AppleEvents import * |
| import aetools |
| import types |
| |
| class TalkTo: |
| def __init__(self, signature): |
| """Create a communication channel with a particular application. |
| |
| For now, the application must be given by its 4-character signature |
| (because I don't know yet how to do other target types). |
| """ |
| if type(signature) != types.StringType or len(signature) != 4: |
| raise TypeError, "signature should be 4-char string" |
| self.target = AECreateDesc(typeApplSignature, signature) |
| self.send_flags = kAEWaitReply |
| self.send_priority = kAENormalPriority |
| self.send_timeout = kAEDefaultTimeout |
| def newevent(self, code, subcode, parameters = {}, attributes = {}): |
| event = AECreateAppleEvent(code, subcode, self.target, |
| kAutoGenerateReturnID, kAnyTransactionID) |
| aetools.packevent(event, parameters, attributes) |
| return event |
| def sendevent(self, event): |
| reply = event.AESend(self.send_flags, self.send_priority, |
| self.send_timeout) |
| parameters, attributes = aetools.unpackevent(reply) |
| return reply, parameters, attributes |
| |
| def send(self, code, subcode, parameters = {}, attributes = {}): |
| return self.sendevent(self.newevent(code, subcode, parameters, attributes)) |
| |
| def activate(self): |
| # Send undocumented but easily reverse engineered 'activate' command |
| self.send('misc', 'actv') |
| |
| |
| # This object is equivalent to "selection" in AppleScript |
| # (in the core suite, if that makes a difference): |
| get_selection = aetools.Property('sele', None) |
| |
| # Test program. You can make it do what you want by passing parameters. |
| # The default gets the selection from Quill (Scriptable Text Editor). |
| |
| def test(app = 'quil', suite = 'core', id = 'getd', arg = get_selection): |
| t = TalkTo(app) |
| t.activate() |
| if arg: |
| dict = {'----': arg} |
| else: |
| dict = {} |
| reply, parameters, attributes = t.send(suite, id, dict) |
| print reply, parameters |
| if parameters.has_key('----'): print "returns:", str(parameters['----']) |
| |
| |
| test() |
| # So we can see it: |
| import sys |
| sys.exit(1) |