Home | History | Annotate | Download | only in ibcarbon
      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