diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 1996-03-18 14:21:15 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 1996-03-18 14:21:15 (GMT) |
commit | bb653772f5a74b18ac34f005b6b5bb8295e81eb3 (patch) | |
tree | 168575a910fcd3b71cfb9b52a4a0f56ee540e2a6 /Mac/Lib/test/AEservertest.py | |
parent | 0f7af3f79544a5859bfd4aa3ed4e31eb6d439952 (diff) | |
download | cpython-bb653772f5a74b18ac34f005b6b5bb8295e81eb3.zip cpython-bb653772f5a74b18ac34f005b6b5bb8295e81eb3.tar.gz cpython-bb653772f5a74b18ac34f005b6b5bb8295e81eb3.tar.bz2 |
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 0000000..a372bee --- /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() |