Jack Jansen | f4f6d48 | 2002-08-02 11:12:15 +0000 | [diff] [blame] | 1 | """argvemulator - create sys.argv from OSA events. Used by applets that |
| 2 | want unix-style arguments. |
| 3 | """ |
| 4 | |
Benjamin Peterson | 2368193 | 2008-05-12 21:42:13 +0000 | [diff] [blame] | 5 | from warnings import warnpy3k |
Benjamin Peterson | a6864e0 | 2008-07-14 17:42:17 +0000 | [diff] [blame] | 6 | warnpy3k("In 3.x, the argvemulator module is removed.", stacklevel=2) |
Benjamin Peterson | 2368193 | 2008-05-12 21:42:13 +0000 | [diff] [blame] | 7 | |
Jack Jansen | f4f6d48 | 2002-08-02 11:12:15 +0000 | [diff] [blame] | 8 | import sys |
| 9 | import traceback |
| 10 | from Carbon import AE |
| 11 | from Carbon.AppleEvents import * |
| 12 | from Carbon import Evt |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 13 | from Carbon import File |
Jack Jansen | f4f6d48 | 2002-08-02 11:12:15 +0000 | [diff] [blame] | 14 | from Carbon.Events import * |
| 15 | import aetools |
| 16 | |
| 17 | class ArgvCollector: |
Jack Jansen | f4f6d48 | 2002-08-02 11:12:15 +0000 | [diff] [blame] | 18 | |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 19 | """A minimal FrameWork.Application-like class""" |
Jack Jansen | f4f6d48 | 2002-08-02 11:12:15 +0000 | [diff] [blame] | 20 | |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 21 | def __init__(self): |
| 22 | self.quitting = 0 |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 23 | # Remove the funny -psn_xxx_xxx argument |
| 24 | if len(sys.argv) > 1 and sys.argv[1][:4] == '-psn': |
| 25 | del sys.argv[1] |
Raymond Hettinger | ff41c48 | 2003-04-06 09:01:11 +0000 | [diff] [blame] | 26 | |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 27 | AE.AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, self.__runapp) |
| 28 | AE.AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, self.__openfiles) |
Raymond Hettinger | ff41c48 | 2003-04-06 09:01:11 +0000 | [diff] [blame] | 29 | |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 30 | def close(self): |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 31 | AE.AERemoveEventHandler(kCoreEventClass, kAEOpenApplication) |
| 32 | AE.AERemoveEventHandler(kCoreEventClass, kAEOpenDocuments) |
Raymond Hettinger | ff41c48 | 2003-04-06 09:01:11 +0000 | [diff] [blame] | 33 | |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 34 | def mainloop(self, mask = highLevelEventMask, timeout = 1*60): |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 35 | # Note: this is not the right way to run an event loop in OSX or even |
| 36 | # "recent" versions of MacOS9. This is however code that has proven |
| 37 | # itself. |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 38 | stoptime = Evt.TickCount() + timeout |
| 39 | while not self.quitting and Evt.TickCount() < stoptime: |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 40 | self._dooneevent(mask, timeout) |
| 41 | |
| 42 | if not self.quitting: |
| 43 | print "argvemulator: timeout waiting for arguments" |
| 44 | |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 45 | self.close() |
Raymond Hettinger | ff41c48 | 2003-04-06 09:01:11 +0000 | [diff] [blame] | 46 | |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 47 | def _dooneevent(self, mask = highLevelEventMask, timeout = 1*60): |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 48 | got, event = Evt.WaitNextEvent(mask, timeout) |
| 49 | if got: |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 50 | self._lowlevelhandler(event) |
Raymond Hettinger | ff41c48 | 2003-04-06 09:01:11 +0000 | [diff] [blame] | 51 | |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 52 | def _lowlevelhandler(self, event): |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 53 | what, message, when, where, modifiers = event |
| 54 | h, v = where |
| 55 | if what == kHighLevelEvent: |
| 56 | try: |
| 57 | AE.AEProcessAppleEvent(event) |
| 58 | except AE.Error, err: |
Walter Dörwald | 70a6b49 | 2004-02-12 17:35:32 +0000 | [diff] [blame] | 59 | msg = "High Level Event: %r %r" % (hex(message), hex(h | (v<<16))) |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 60 | print 'AE error: ', err |
| 61 | print 'in', msg |
| 62 | traceback.print_exc() |
| 63 | return |
| 64 | else: |
| 65 | print "Unhandled event:", event |
Raymond Hettinger | ff41c48 | 2003-04-06 09:01:11 +0000 | [diff] [blame] | 66 | |
Raymond Hettinger | ff41c48 | 2003-04-06 09:01:11 +0000 | [diff] [blame] | 67 | |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 68 | def _quit(self): |
| 69 | self.quitting = 1 |
Raymond Hettinger | ff41c48 | 2003-04-06 09:01:11 +0000 | [diff] [blame] | 70 | |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 71 | def __runapp(self, requestevent, replyevent): |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 72 | self._quit() |
Raymond Hettinger | ff41c48 | 2003-04-06 09:01:11 +0000 | [diff] [blame] | 73 | |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 74 | def __openfiles(self, requestevent, replyevent): |
| 75 | try: |
| 76 | listdesc = requestevent.AEGetParamDesc(keyDirectObject, typeAEList) |
| 77 | for i in range(listdesc.AECountItems()): |
| 78 | aliasdesc = listdesc.AEGetNthDesc(i+1, typeAlias)[1] |
| 79 | alias = File.Alias(rawdata=aliasdesc.data) |
| 80 | fsref = alias.FSResolveAlias(None)[0] |
| 81 | pathname = fsref.as_pathname() |
| 82 | sys.argv.append(pathname) |
| 83 | except Exception, e: |
| 84 | print "argvemulator.py warning: can't unpack an open document event" |
| 85 | import traceback |
| 86 | traceback.print_exc() |
Raymond Hettinger | ff41c48 | 2003-04-06 09:01:11 +0000 | [diff] [blame] | 87 | |
Ronald Oussoren | 4b7a6c8 | 2006-06-07 20:18:44 +0000 | [diff] [blame] | 88 | self._quit() |
Jack Jansen | f4f6d48 | 2002-08-02 11:12:15 +0000 | [diff] [blame] | 89 | |
| 90 | if __name__ == '__main__': |
Just van Rossum | 35b50e2 | 2003-06-21 14:41:32 +0000 | [diff] [blame] | 91 | ArgvCollector().mainloop() |
| 92 | print "sys.argv=", sys.argv |