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