diff options
| author | Jack Jansen <jack.jansen@cwi.nl> | 1996-03-18 14:21:15 +0000 | 
|---|---|---|
| committer | Jack Jansen <jack.jansen@cwi.nl> | 1996-03-18 14:21:15 +0000 | 
| commit | bb653772f5a74b18ac34f005b6b5bb8295e81eb3 (patch) | |
| tree | 168575a910fcd3b71cfb9b52a4a0f56ee540e2a6 /Mac/Lib/test/AEservertest.py | |
| parent | 0f7af3f79544a5859bfd4aa3ed4e31eb6d439952 (diff) | |
| download | cpython-git-bb653772f5a74b18ac34f005b6b5bb8295e81eb3.tar.gz | |
Oops... I Inadvertently lost their cvs files...
Diffstat (limited to 'Mac/Lib/test/AEservertest.py')
| -rw-r--r-- | Mac/Lib/test/AEservertest.py | 219 | 
1 files changed, 219 insertions, 0 deletions
| diff --git a/Mac/Lib/test/AEservertest.py b/Mac/Lib/test/AEservertest.py new file mode 100644 index 0000000000..a372bee709 --- /dev/null +++ b/Mac/Lib/test/AEservertest.py @@ -0,0 +1,219 @@ +"""AEservertest - Test AppleEvent server interface + +(adapted from Guido's 'echo' program). + +Build an applet from this source, and include the aete resource that you +want to test. Use the AEservertest script to try things. +""" + +import addpack +addpack.addpack('Tools') +addpack.addpack('bgen') +addpack.addpack('ae') +addpack.addpack('evt') +#addpack.addpack('menu') +addpack.addpack('win') + +import sys +sys.stdout = sys.stderr +import traceback +import MacOS +import AE +from AppleEvents import * +import Evt +from Events import * +import Menu +import Dlg +import Win +from Windows import * +import Qd +import macfs + +import aetools +import EasyDialogs + +kHighLevelEvent = 23				# Not defined anywhere for Python yet? + +Quit='Quit' + +def mymessage(str): +	err = AE.AEInteractWithUser(kAEDefaultTimeout) +	if err: +		print str +	EasyDialogs.Message(str) + +def myaskstring(str, default=''): +	err = AE.AEInteractWithUser(kAEDefaultTimeout) +	if err: +		return default +	return EasyDialogs.AskString(str, default) + +def main(): +	echo = EchoServer() +	yield = MacOS.EnableAppswitch(-1)		# Disable Python's own "event handling" +	try: +		try: +			echo.mainloop(everyEvent, 0) +		except Quit: +			pass +	finally: +		MacOS.EnableAppswitch(yield)	# Let Python have a go at events +		echo.close() + + +class EchoServer: +	 +	suites = ['aevt', 'core', 'reqd'] +	 +	def __init__(self): +		self.active = 0 +		# +		# Install the handlers +		# +		for suite in self.suites: +			AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler) +			print (suite, typeWildCard, self.aehandler) +		self.active = 1 +		# +		# Setup the apple menu and file/quit +		# +		self.appleid = 1 +		self.fileid = 2 +		 +		Menu.ClearMenuBar() +		self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024") +		applemenu.AppendMenu("All about echo...;(-") +		applemenu.AppendResMenu('DRVR') +		applemenu.InsertMenu(0) +		 +		self.filemenu = Menu.NewMenu(self.fileid, 'File') +		self.filemenu.AppendMenu("Quit/Q") +		self.filemenu.InsertMenu(0) +		 +		Menu.DrawMenuBar() +		# +		# Set interaction allowed (for the return values) +		# +		AE.AESetInteractionAllowed(kAEInteractWithAll) +	 +	def __del__(self): +		self.close() +	 +	def close(self): +		if self.active: +			self.active = 0 +			for suite in self.suites: +				AE.AERemoveEventHandler(suite, typeWildCard) +	 +	def mainloop(self, mask = everyEvent, timeout = 60*60): +		while 1: +			self.dooneevent(mask, timeout) +	 +	def dooneevent(self, mask = everyEvent, timeout = 60*60): +			got, event = Evt.WaitNextEvent(mask, timeout) +			if got: +				self.lowlevelhandler(event) +	 +	def lowlevelhandler(self, event): +		what, message, when, where, modifiers = event +		h, v = where +		if what == kHighLevelEvent: +			msg = "High Level Event: %s %s" % \ +				(`code(message)`, `code(h | (v<<16))`) +			self.handled_by_us = 0 +			try: +				AE.AEProcessAppleEvent(event) +			except AE.Error, err: +				mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err)) +				traceback.print_exc() +			else: +				if self.handled_by_us == 0: +					print msg, "Handled by AE, somehow" +				else: +					print msg, 'Handled by us.' +		elif what == keyDown: +			c = chr(message & charCodeMask) +			if modifiers & cmdKey: +				if c == '.': +					raise KeyboardInterrupt, "Command-period" +				else: +					self.menuhit(Menu.MenuKey(message&charCodeMask)) +			##MacOS.HandleEvent(event) +		elif what == mouseDown: +			partcode, window = Win.FindWindow(where) +			if partcode == inMenuBar: +				result = Menu.MenuSelect(where) +				self.menuhit(result) +		elif what <> autoKey: +			print "Event:", (eventname(what), message, when, (h, v), modifiers) +##			MacOS.HandleEvent(event) + +	def menuhit(self, result): +			id = (result>>16) & 0xffff	# Hi word +			item = result & 0xffff		# Lo word +			if id == self.appleid: +				if item == 1: +					mymessage("Echo -- echo AppleEvents") +				elif item > 1: +					name = self.applemenu.GetItem(item) +					Qd.OpenDeskAcc(name) +			elif id == self.fileid: +				if item == 1: +					raise Quit +	 +	def aehandler(self, request, reply): +		print "Apple Event!" +		self.handled_by_us = 1 +		parameters, attributes = aetools.unpackevent(request) +		print "class =", `attributes['evcl'].type`, +		print "id =", `attributes['evid'].type` +		print "Parameters:" +		keys = parameters.keys() +		keys.sort() +		for key in keys: +			print "%s: %.150s" % (`key`, `parameters[key]`) +			print "      :", str(parameters[key]) +		print "Attributes:" +		keys = attributes.keys() +		keys.sort() +		for key in keys: +			print "%s: %.150s" % (`key`, `attributes[key]`) +		parameters['----'] = self.askreplyvalue() +		aetools.packevent(reply, parameters) +		 +	def askreplyvalue(self): +		while 1: +			str = myaskstring('Reply value to send (python-style)', 'None') +			try: +				rv = eval(str) +				break +			except: +				pass +		return rv +		 +_eventnames = { +	keyDown: 'keyDown', +	autoKey: 'autoKey', +	mouseDown: 'mouseDown', +	mouseUp: 'mouseUp', +	updateEvt: 'updateEvt', +	diskEvt: 'diskEvt', +	activateEvt: 'activateEvt', +	osEvt: 'osEvt', +} + +def eventname(what): +	if _eventnames.has_key(what): return _eventnames[what] +	else: return `what` + +def code(x): +	"Convert a long int to the 4-character code it really is" +	s = '' +	for i in range(4): +		x, c = divmod(x, 256) +		s = chr(c) + s +	return s + + +if __name__ == '__main__': +	main() | 
