1 2 /* ======================== Module _IBCarbon ======================== */ 3 4 #include "Python.h" 5 #include "pymactoolbox.h" 6 7 8 #if APPLE_SUPPORTS_QUICKTIME 9 10 #include <Carbon/Carbon.h> 11 12 #ifdef USE_TOOLBOX_OBJECT_GLUE 13 extern int _CFStringRefObj_Convert(PyObject *, CFStringRef *); 14 #endif 15 16 17 static PyObject *IBCarbon_Error; 18 19 /* ---------------------- Object type IBNibRef ---------------------- */ 20 21 PyTypeObject IBNibRef_Type; 22 23 #define IBNibRefObj_Check(x) ((x)->ob_type == &IBNibRef_Type || PyObject_TypeCheck((x), &IBNibRef_Type)) 24 25 typedef struct IBNibRefObject { 26 PyObject_HEAD 27 IBNibRef ob_itself; 28 } IBNibRefObject; 29 30 PyObject *IBNibRefObj_New(IBNibRef itself) 31 { 32 IBNibRefObject *it; 33 it = PyObject_NEW(IBNibRefObject, &IBNibRef_Type); 34 if (it == NULL) return NULL; 35 it->ob_itself = itself; 36 return (PyObject *)it; 37 } 38 39 int IBNibRefObj_Convert(PyObject *v, IBNibRef *p_itself) 40 { 41 if (!IBNibRefObj_Check(v)) 42 { 43 PyErr_SetString(PyExc_TypeError, "IBNibRef required"); 44 return 0; 45 } 46 *p_itself = ((IBNibRefObject *)v)->ob_itself; 47 return 1; 48 } 49 50 static void IBNibRefObj_dealloc(IBNibRefObject *self) 51 { 52 DisposeNibReference(self->ob_itself); 53 self->ob_type->tp_free((PyObject *)self); 54 } 55 56 static PyObject *IBNibRefObj_CreateWindowFromNib(IBNibRefObject *_self, PyObject *_args) 57 { 58 PyObject *_res = NULL; 59 OSStatus _err; 60 CFStringRef inName; 61 WindowPtr outWindow; 62 if (!PyArg_ParseTuple(_args, "O&", 63 CFStringRefObj_Convert, &inName)) 64 return NULL; 65 _err = CreateWindowFromNib(_self->ob_itself, 66 inName, 67 &outWindow); 68 if (_err != noErr) return PyMac_Error(_err); 69 _res = Py_BuildValue("O&", 70 WinObj_New, outWindow); 71 return _res; 72 } 73 74 static PyObject *IBNibRefObj_CreateMenuFromNib(IBNibRefObject *_self, PyObject *_args) 75 { 76 PyObject *_res = NULL; 77 OSStatus _err; 78 CFStringRef inName; 79 MenuHandle outMenuRef; 80 if (!PyArg_ParseTuple(_args, "O&", 81 CFStringRefObj_Convert, &inName)) 82 return NULL; 83 _err = CreateMenuFromNib(_self->ob_itself, 84 inName, 85 &outMenuRef); 86 if (_err != noErr) return PyMac_Error(_err); 87 _res = Py_BuildValue("O&", 88 MenuObj_New, outMenuRef); 89 return _res; 90 } 91 92 static PyObject *IBNibRefObj_CreateMenuBarFromNib(IBNibRefObject *_self, PyObject *_args) 93 { 94 PyObject *_res = NULL; 95 OSStatus _err; 96 CFStringRef inName; 97 Handle outMenuBar; 98 if (!PyArg_ParseTuple(_args, "O&", 99 CFStringRefObj_Convert, &inName)) 100 return NULL; 101 _err = CreateMenuBarFromNib(_self->ob_itself, 102 inName, 103 &outMenuBar); 104 if (_err != noErr) return PyMac_Error(_err); 105 _res = Py_BuildValue("O&", 106 ResObj_New, outMenuBar); 107 return _res; 108 } 109 110 static PyObject *IBNibRefObj_SetMenuBarFromNib(IBNibRefObject *_self, PyObject *_args) 111 { 112 PyObject *_res = NULL; 113 OSStatus _err; 114 CFStringRef inName; 115 if (!PyArg_ParseTuple(_args, "O&", 116 CFStringRefObj_Convert, &inName)) 117 return NULL; 118 _err = SetMenuBarFromNib(_self->ob_itself, 119 inName); 120 if (_err != noErr) return PyMac_Error(_err); 121 Py_INCREF(Py_None); 122 _res = Py_None; 123 return _res; 124 } 125 126 static PyMethodDef IBNibRefObj_methods[] = { 127 {"CreateWindowFromNib", (PyCFunction)IBNibRefObj_CreateWindowFromNib, 1, 128 PyDoc_STR("(CFStringRef inName) -> (WindowPtr outWindow)")}, 129 {"CreateMenuFromNib", (PyCFunction)IBNibRefObj_CreateMenuFromNib, 1, 130 PyDoc_STR("(CFStringRef inName) -> (MenuHandle outMenuRef)")}, 131 {"CreateMenuBarFromNib", (PyCFunction)IBNibRefObj_CreateMenuBarFromNib, 1, 132 PyDoc_STR("(CFStringRef inName) -> (Handle outMenuBar)")}, 133 {"SetMenuBarFromNib", (PyCFunction)IBNibRefObj_SetMenuBarFromNib, 1, 134 PyDoc_STR("(CFStringRef inName) -> None")}, 135 {NULL, NULL, 0} 136 }; 137 138 #define IBNibRefObj_getsetlist NULL 139 140 141 #define IBNibRefObj_compare NULL 142 143 #define IBNibRefObj_repr NULL 144 145 #define IBNibRefObj_hash NULL 146 #define IBNibRefObj_tp_init 0 147 148 #define IBNibRefObj_tp_alloc PyType_GenericAlloc 149 150 static PyObject *IBNibRefObj_tp_new(PyTypeObject *type, PyObject *_args, PyObject *_kwds) 151 { 152 PyObject *_self; 153 IBNibRef itself; 154 char *kw[] = {"itself", 0}; 155 156 if (!PyArg_ParseTupleAndKeywords(_args, _kwds, "O&", kw, IBNibRefObj_Convert, &itself)) return NULL; 157 if ((_self = type->tp_alloc(type, 0)) == NULL) return NULL; 158 ((IBNibRefObject *)_self)->ob_itself = itself; 159 return _self; 160 } 161 162 #define IBNibRefObj_tp_free PyObject_Del 163 164 165 PyTypeObject IBNibRef_Type = { 166 PyObject_HEAD_INIT(NULL) 167 0, /*ob_size*/ 168 "_IBCarbon.IBNibRef", /*tp_name*/ 169 sizeof(IBNibRefObject), /*tp_basicsize*/ 170 0, /*tp_itemsize*/ 171 /* methods */ 172 (destructor) IBNibRefObj_dealloc, /*tp_dealloc*/ 173 0, /*tp_print*/ 174 (getattrfunc)0, /*tp_getattr*/ 175 (setattrfunc)0, /*tp_setattr*/ 176 (cmpfunc) IBNibRefObj_compare, /*tp_compare*/ 177 (reprfunc) IBNibRefObj_repr, /*tp_repr*/ 178 (PyNumberMethods *)0, /* tp_as_number */ 179 (PySequenceMethods *)0, /* tp_as_sequence */ 180 (PyMappingMethods *)0, /* tp_as_mapping */ 181 (hashfunc) IBNibRefObj_hash, /*tp_hash*/ 182 0, /*tp_call*/ 183 0, /*tp_str*/ 184 PyObject_GenericGetAttr, /*tp_getattro*/ 185 PyObject_GenericSetAttr, /*tp_setattro */ 186 0, /*tp_as_buffer*/ 187 Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ 188 0, /*tp_doc*/ 189 0, /*tp_traverse*/ 190 0, /*tp_clear*/ 191 0, /*tp_richcompare*/ 192 0, /*tp_weaklistoffset*/ 193 0, /*tp_iter*/ 194 0, /*tp_iternext*/ 195 IBNibRefObj_methods, /* tp_methods */ 196 0, /*tp_members*/ 197 IBNibRefObj_getsetlist, /*tp_getset*/ 198 0, /*tp_base*/ 199 0, /*tp_dict*/ 200 0, /*tp_descr_get*/ 201 0, /*tp_descr_set*/ 202 0, /*tp_dictoffset*/ 203 IBNibRefObj_tp_init, /* tp_init */ 204 IBNibRefObj_tp_alloc, /* tp_alloc */ 205 IBNibRefObj_tp_new, /* tp_new */ 206 IBNibRefObj_tp_free, /* tp_free */ 207 }; 208 209 /* -------------------- End object type IBNibRef -------------------- */ 210 211 212 static PyObject *IBCarbon_CreateNibReference(PyObject *_self, PyObject *_args) 213 { 214 PyObject *_res = NULL; 215 OSStatus _err; 216 CFStringRef inNibName; 217 IBNibRef outNibRef; 218 if (!PyArg_ParseTuple(_args, "O&", 219 CFStringRefObj_Convert, &inNibName)) 220 return NULL; 221 _err = CreateNibReference(inNibName, 222 &outNibRef); 223 if (_err != noErr) return PyMac_Error(_err); 224 _res = Py_BuildValue("O&", 225 IBNibRefObj_New, outNibRef); 226 return _res; 227 } 228 #endif /* APPLE_SUPPORTS_QUICKTIME */ 229 230 static PyMethodDef IBCarbon_methods[] = { 231 #if APPLE_SUPPORTS_QUICKTIME 232 {"CreateNibReference", (PyCFunction)IBCarbon_CreateNibReference, 1, 233 PyDoc_STR("(CFStringRef inNibName) -> (IBNibRef outNibRef)")}, 234 #endif /* APPLE_SUPPORTS_QUICKTIME */ 235 {NULL, NULL, 0} 236 }; 237 238 239 240 241 void init_IBCarbon(void) 242 { 243 PyObject *m; 244 #if APPLE_SUPPORTS_QUICKTIME 245 PyObject *d; 246 #endif /* APPLE_SUPPORTS_QUICKTIME */ 247 248 249 250 251 252 m = Py_InitModule("_IBCarbon", IBCarbon_methods); 253 #if APPLE_SUPPORTS_QUICKTIME 254 d = PyModule_GetDict(m); 255 IBCarbon_Error = PyMac_GetOSErrException(); 256 if (IBCarbon_Error == NULL || 257 PyDict_SetItemString(d, "Error", IBCarbon_Error) != 0) 258 return; 259 IBNibRef_Type.ob_type = &PyType_Type; 260 if (PyType_Ready(&IBNibRef_Type) < 0) return; 261 Py_INCREF(&IBNibRef_Type); 262 PyModule_AddObject(m, "IBNibRef", (PyObject *)&IBNibRef_Type); 263 /* Backward-compatible name */ 264 Py_INCREF(&IBNibRef_Type); 265 PyModule_AddObject(m, "IBNibRefType", (PyObject *)&IBNibRef_Type); 266 #endif /* APPLE_SUPPORTS_QUICKTIME */ 267 } 268 269 /* ====================== End module _IBCarbon ====================== */ 270 271