Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 1 | # IBCarbonsupport.py |
| 2 | |
| 3 | from macsupport import * |
| 4 | |
Jack Jansen | 9c2b514 | 2001-11-05 16:21:45 +0000 | [diff] [blame] | 5 | from CarbonEvtscan import RefObjectTypes |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 6 | |
| 7 | # where should this go? macsupport.py? |
| 8 | CFStringRef = OpaqueByValueType('CFStringRef') |
| 9 | |
| 10 | for typ in RefObjectTypes: |
| 11 | execstr = "%(name)s = OpaqueByValueType('%(name)s')" % {"name": typ} |
| 12 | exec execstr |
| 13 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 14 | if 0: |
| 15 | # these types will have no methods and will merely be opaque blobs |
| 16 | # should write getattr and setattr for them? |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 17 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 18 | StructObjectTypes = ["EventTypeSpec", |
| 19 | "HIPoint", |
| 20 | "HICommand", |
| 21 | "EventHotKeyID", |
| 22 | ] |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 23 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 24 | for typ in StructObjectTypes: |
| 25 | execstr = "%(name)s = OpaqueType('%(name)s')" % {"name": typ} |
| 26 | exec execstr |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 27 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 28 | EventHotKeyID = OpaqueByValueType("EventHotKeyID", "EventHotKeyID") |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 29 | EventTypeSpec_ptr = OpaqueType("EventTypeSpec", "EventTypeSpec") |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 30 | |
| 31 | # is this the right type for the void * in GetEventParameter |
| 32 | #void_ptr = FixedInputBufferType(1024) |
| 33 | void_ptr = stringptr |
| 34 | # here are some types that are really other types |
| 35 | |
| 36 | EventTime = double |
| 37 | EventTimeout = EventTime |
| 38 | EventTimerInterval = EventTime |
| 39 | EventAttributes = UInt32 |
| 40 | EventParamName = OSType |
| 41 | EventParamType = OSType |
| 42 | EventPriority = SInt16 |
| 43 | EventMask = UInt16 |
| 44 | |
| 45 | EventComparatorUPP = FakeType("(EventComparatorUPP)0") |
| 46 | EventLoopTimerUPP = FakeType("(EventLoopTimerUPP)0") |
| 47 | EventHandlerUPP = FakeType("(EventHandlerUPP)0") |
| 48 | EventHandlerUPP = FakeType("(EventHandlerUPP)0") |
| 49 | EventComparatorProcPtr = FakeType("(EventComparatorProcPtr)0") |
| 50 | EventLoopTimerProcPtr = FakeType("(EventLoopTimerProcPtr)0") |
| 51 | EventHandlerProcPtr = FakeType("(EventHandlerProcPtr)0") |
| 52 | |
| 53 | CarbonEventsFunction = OSErrFunctionGenerator |
| 54 | CarbonEventsMethod = OSErrMethodGenerator |
| 55 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 56 | includestuff = r""" |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 57 | #ifdef WITHOUT_FRAMEWORKS |
| 58 | #include <CarbonEvents.h> |
| 59 | #else |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 60 | #include <Carbon/Carbon.h> |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 61 | #endif |
| 62 | |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 63 | #include "macglue.h" |
| 64 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 65 | /* Macro to test whether a weak-loaded CFM function exists */ |
| 66 | #define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL ) {\ |
| 67 | PyErr_SetString(PyExc_NotImplementedError, \ |
| 68 | "Not available in this shared library/OS version"); \ |
| 69 | return; \ |
| 70 | }} while(0) |
| 71 | |
| 72 | |
| 73 | #define USE_MAC_MP_MULTITHREADING 0 |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 74 | |
| 75 | #if USE_MAC_MP_MULTITHREADING |
| 76 | static PyThreadState *_save; |
| 77 | static MPCriticalRegionID reentrantLock; |
| 78 | #endif /* USE_MAC_MP_MULTITHREADING */ |
| 79 | |
| 80 | extern int CFStringRef_New(CFStringRef *); |
| 81 | |
| 82 | extern int CFStringRef_Convert(PyObject *, CFStringRef *); |
| 83 | extern int CFBundleRef_Convert(PyObject *, CFBundleRef *); |
| 84 | |
| 85 | int EventTargetRef_Convert(PyObject *, EventTargetRef *); |
| 86 | PyObject *EventHandlerCallRef_New(EventHandlerCallRef itself); |
| 87 | PyObject *EventRef_New(EventRef itself); |
| 88 | |
| 89 | /********** EventTypeSpec *******/ |
| 90 | static PyObject* |
| 91 | EventTypeSpec_New(EventTypeSpec *in) |
| 92 | { |
| 93 | return Py_BuildValue("ll", in->eventClass, in->eventKind); |
| 94 | } |
| 95 | |
| 96 | static int |
| 97 | EventTypeSpec_Convert(PyObject *v, EventTypeSpec *out) |
| 98 | { |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 99 | if (PyArg_Parse(v, "(O&l)", PyMac_GetOSType, &(out->eventClass), &(out->eventKind))) |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 100 | return 1; |
| 101 | return NULL; |
| 102 | } |
| 103 | |
| 104 | /********** end EventTypeSpec *******/ |
| 105 | |
| 106 | /********** HIPoint *******/ |
| 107 | |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 108 | #if 0 /* XXX doesn't compile */ |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 109 | static PyObject* |
| 110 | HIPoint_New(HIPoint *in) |
| 111 | { |
| 112 | return Py_BuildValue("ff", in->x, in->y); |
| 113 | } |
| 114 | |
| 115 | static int |
| 116 | HIPoint_Convert(PyObject *v, HIPoint *out) |
| 117 | { |
| 118 | if (PyArg_ParseTuple(v, "ff", &(out->x), &(out->y))) |
| 119 | return 1; |
| 120 | return NULL; |
| 121 | } |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 122 | #endif |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 123 | |
| 124 | /********** end HIPoint *******/ |
| 125 | |
| 126 | /********** EventHotKeyID *******/ |
| 127 | |
| 128 | static PyObject* |
| 129 | EventHotKeyID_New(EventHotKeyID *in) |
| 130 | { |
| 131 | return Py_BuildValue("ll", in->signature, in->id); |
| 132 | } |
| 133 | |
| 134 | static int |
| 135 | EventHotKeyID_Convert(PyObject *v, EventHotKeyID *out) |
| 136 | { |
| 137 | if (PyArg_ParseTuple(v, "ll", &out->signature, &out->id)) |
| 138 | return 1; |
| 139 | return NULL; |
| 140 | } |
| 141 | |
| 142 | /********** end EventHotKeyID *******/ |
| 143 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 144 | /******** myEventHandler ***********/ |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 145 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 146 | static EventHandlerUPP myEventHandlerUPP; |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 147 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 148 | pascal OSStatus myEventHandler(EventHandlerCallRef handlerRef, EventRef event, void *outPyObject) { |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 149 | PyObject *retValue; |
| 150 | int status; |
| 151 | |
| 152 | #if USE_MAC_MP_MULTITHREADING |
| 153 | MPEnterCriticalRegion(reentrantLock, kDurationForever); |
| 154 | PyEval_RestoreThread(_save); |
| 155 | #endif /* USE_MAC_MP_MULTITHREADING */ |
| 156 | |
Jack Jansen | 34cbe71 | 2001-11-05 16:15:45 +0000 | [diff] [blame] | 157 | retValue = PyObject_CallFunction((PyObject *)outPyObject, "O&O&", EventHandlerCallRef_New, handlerRef, EventRef_New, event); |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 158 | status = PyInt_AsLong(retValue); |
| 159 | |
| 160 | #if USE_MAC_MP_MULTITHREADING |
| 161 | _save = PyEval_SaveThread(); |
| 162 | MPExitCriticalRegion(reentrantLock); |
| 163 | #endif /* USE_MAC_MP_MULTITHREADING */ |
| 164 | |
| 165 | return status; |
| 166 | } |
| 167 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 168 | /******** end myEventHandler ***********/ |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 169 | |
| 170 | """ |
| 171 | |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 172 | initstuff = initstuff + """ |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 173 | PyMac_PRECHECK(NewEventHandlerUPP); /* This can fail if CarbonLib is too old */ |
| 174 | myEventHandlerUPP = NewEventHandlerUPP(myEventHandler); |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 175 | """ |
| 176 | module = MacModule('_CarbonEvt', 'CarbonEvents', includestuff, finalstuff, initstuff) |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 177 | |
| 178 | #class CFReleaserObj(GlobalObjectDefinition): |
| 179 | # def outputFreeIt(self, name): |
| 180 | # Output("CFRelease(%s);" % name) |
| 181 | |
| 182 | for typ in RefObjectTypes: |
| 183 | execstr = typ + 'object = GlobalObjectDefinition(typ)' |
| 184 | exec execstr |
| 185 | module.addobject(eval(typ + 'object')) |
| 186 | |
| 187 | functions = [] |
Jack Jansen | 34cbe71 | 2001-11-05 16:15:45 +0000 | [diff] [blame] | 188 | for typ in RefObjectTypes: ## go thru all ObjectTypes as defined in CarbonEventsscan.py |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 189 | # initialize the lists for carbongen to fill |
| 190 | execstr = typ + 'methods = []' |
| 191 | exec execstr |
| 192 | |
| 193 | execfile('CarbonEventsgen.py') |
| 194 | |
Jack Jansen | 34cbe71 | 2001-11-05 16:15:45 +0000 | [diff] [blame] | 195 | for f in functions: module.add(f) # add all the functions carboneventsgen put in the list |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 196 | |
Jack Jansen | 34cbe71 | 2001-11-05 16:15:45 +0000 | [diff] [blame] | 197 | for typ in RefObjectTypes: ## go thru all ObjectTypes as defined in CarbonEventsscan.py |
Jack Jansen | 9c2b514 | 2001-11-05 16:21:45 +0000 | [diff] [blame] | 198 | methods = eval(typ + 'methods') ## get a reference to the method list from the main namespace |
Jack Jansen | 34cbe71 | 2001-11-05 16:15:45 +0000 | [diff] [blame] | 199 | obj = eval(typ + 'object') ## get a reference to the object |
| 200 | for m in methods: obj.add(m) ## add each method in the list to the object |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 201 | |
| 202 | installeventhandler = """ |
| 203 | EventTypeSpec inSpec; |
| 204 | PyObject *callback; |
| 205 | EventHandlerRef outRef; |
| 206 | OSStatus _err; |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 207 | |
| 208 | if (!PyArg_ParseTuple(_args, "O&O", EventTypeSpec_Convert, &inSpec, &callback)) |
| 209 | return NULL; |
| 210 | |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 211 | _err = InstallEventHandler(_self->ob_itself, myEventHandlerUPP, 1, &inSpec, (void *)callback, &outRef); |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 212 | if (_err != noErr) return PyMac_Error(_err); |
| 213 | |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 214 | return Py_BuildValue("O&", EventHandlerRef_New, outRef);""" |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 215 | |
| 216 | f = ManualGenerator("InstallEventHandler", installeventhandler); |
Jack Jansen | 34cbe71 | 2001-11-05 16:15:45 +0000 | [diff] [blame] | 217 | f.docstring = lambda: "(EventTargetRef inTarget, EventTypeSpec inSpec, Method callback) -> (EventHandlerRef outRef)" |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 218 | EventTargetRefobject.add(f) |
| 219 | |
| 220 | runappeventloop = """ |
| 221 | #if USE_MAC_MP_MULTITHREADING |
| 222 | if (MPCreateCriticalRegion(&reentrantLock) != noErr) { |
Just van Rossum | f8d6473 | 2001-12-12 20:48:53 +0000 | [diff] [blame^] | 223 | PySys_WriteStderr("lock failure\\n"); |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 224 | return NULL; |
| 225 | } |
| 226 | _save = PyEval_SaveThread(); |
| 227 | #endif /* USE_MAC_MP_MULTITHREADING */ |
| 228 | |
| 229 | RunApplicationEventLoop(); |
| 230 | |
| 231 | #if USE_MAC_MP_MULTITHREADING |
| 232 | PyEval_RestoreThread(_save); |
| 233 | |
| 234 | MPDeleteCriticalRegion(reentrantLock); |
| 235 | #endif /* USE_MAC_MP_MULTITHREADING */ |
| 236 | |
| 237 | Py_INCREF(Py_None); |
| 238 | |
| 239 | return Py_None; |
| 240 | """ |
| 241 | |
| 242 | f = ManualGenerator("RunApplicationEventLoop", runappeventloop); |
| 243 | f.docstring = lambda: "() -> ()" |
| 244 | module.add(f) |
| 245 | |
Just van Rossum | c3baa0e | 2001-12-11 21:52:02 +0000 | [diff] [blame] | 246 | SetOutputFileName('_CarbonEvtmodule.c') |
Jack Jansen | 52e9045 | 2001-11-05 14:44:23 +0000 | [diff] [blame] | 247 | module.generate() |
| 248 | |
Jack Jansen | 9c2b514 | 2001-11-05 16:21:45 +0000 | [diff] [blame] | 249 | ##import os |
| 250 | ##os.system("python setup.py build") |