mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			64 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | # (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) |