1 |
|
---|
2 | /* ======================== Module _IBCarbon ======================== */
|
---|
3 |
|
---|
4 | #include "Python.h"
|
---|
5 |
|
---|
6 |
|
---|
7 | #ifndef __LP64__
|
---|
8 |
|
---|
9 | #include <Carbon/Carbon.h>
|
---|
10 | #include "pymactoolbox.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 /* __LP64__ */
|
---|
229 |
|
---|
230 | static PyMethodDef IBCarbon_methods[] = {
|
---|
231 | #ifndef __LP64__
|
---|
232 | {"CreateNibReference", (PyCFunction)IBCarbon_CreateNibReference, 1,
|
---|
233 | PyDoc_STR("(CFStringRef inNibName) -> (IBNibRef outNibRef)")},
|
---|
234 | #endif /* __LP64__ */
|
---|
235 | {NULL, NULL, 0}
|
---|
236 | };
|
---|
237 |
|
---|
238 |
|
---|
239 |
|
---|
240 |
|
---|
241 | void init_IBCarbon(void)
|
---|
242 | {
|
---|
243 | PyObject *m;
|
---|
244 | #ifndef __LP64__
|
---|
245 | PyObject *d;
|
---|
246 | #endif /* __LP64__ */
|
---|
247 |
|
---|
248 |
|
---|
249 |
|
---|
250 |
|
---|
251 |
|
---|
252 | m = Py_InitModule("_IBCarbon", IBCarbon_methods);
|
---|
253 | #ifndef __LP64__
|
---|
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 /* __LP64__ */
|
---|
267 | }
|
---|
268 |
|
---|
269 | /* ====================== End module _IBCarbon ====================== */
|
---|
270 |
|
---|