diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 2002-08-04 21:34:24 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 2002-08-04 21:34:24 (GMT) |
commit | 0c069924e5e2a1bc254355a592cd0bdac28d316f (patch) | |
tree | c59fcb3bd5ead8658d3256f56f3c212a96fe2c13 /Mac | |
parent | 84a016417a9f334a15a5ee306069f696138b4a7c (diff) | |
download | cpython-0c069924e5e2a1bc254355a592cd0bdac28d316f.zip cpython-0c069924e5e2a1bc254355a592cd0bdac28d316f.tar.gz cpython-0c069924e5e2a1bc254355a592cd0bdac28d316f.tar.bz2 |
Donovan Preston's interface to IBCarbon, allowing you to use Interface
Builder carbon NIB files from Python. As-is, I may need to twiddle a few
things as he donated this long ago.
Donovan is now one of the four people in the world who know how to drive
bgen!
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Modules/ibcarbon/IBCarbonscan.py | 45 | ||||
-rw-r--r-- | Mac/Modules/ibcarbon/IBCarbonsupport.py | 59 | ||||
-rw-r--r-- | Mac/Modules/ibcarbon/_IBCarbon.c | 238 |
3 files changed, 342 insertions, 0 deletions
diff --git a/Mac/Modules/ibcarbon/IBCarbonscan.py b/Mac/Modules/ibcarbon/IBCarbonscan.py new file mode 100644 index 0000000..7c54fc9 --- /dev/null +++ b/Mac/Modules/ibcarbon/IBCarbonscan.py @@ -0,0 +1,45 @@ +# IBCarbonscan.py + +import sys +import os +import string +import MacOS + +BGENDIR= '/Users/dp/python/dist/src/Tools/bgen/bgen' +sys.path.append(BGENDIR) +print sys.path, sys.prefix +from bgenlocations import TOOLBOXDIR + +from scantools import Scanner_OSX + +def main(): + print "---Scanning IBCarbonRuntime.h---" + input = ["IBCarbonRuntime.h"] + output = "IBCarbongen.py" + defsoutput = TOOLBOXDIR + "IBCarbonRuntime.py" + scanner = IBCarbon_Scanner(input, output, defsoutput) + scanner.scan() + scanner.close() + print "--done scanning, importing--" + import IBCarbonsupport + print "done" + +class IBCarbon_Scanner(Scanner_OSX): + def destination(self, type, name, arglist): + classname = "IBCarbonFunction" + listname = "functions" + if arglist: + t, n, m = arglist[0] + if t == "IBNibRef" and m == "InMode": + classname = "IBCarbonMethod" + listname = "methods" + return classname, listname + + def makeblacklistnames(self): + return [ + "DisposeNibReference", # taken care of by destructor + "CreateNibReferenceWithCFBundle", ## need to wrap CFBundle.h properly first + ] + +if __name__ == "__main__": + main() diff --git a/Mac/Modules/ibcarbon/IBCarbonsupport.py b/Mac/Modules/ibcarbon/IBCarbonsupport.py new file mode 100644 index 0000000..9890c3a --- /dev/null +++ b/Mac/Modules/ibcarbon/IBCarbonsupport.py @@ -0,0 +1,59 @@ +# IBCarbonsupport.py + +from macsupport import * + +CFStringRef = OpaqueByValueType('CFStringRef', 'CFStringRefObj') +IBNibRef = OpaqueByValueType('IBNibRef', 'IBNibRefObj') +#CFBundleRef = OpaqueByValueType('CFBundleRef') + +IBCarbonFunction = OSErrFunctionGenerator +IBCarbonMethod = OSErrMethodGenerator + +includestuff = """ +#ifdef WITHOUT_FRAMEWORKS +#include <IBCarbonRuntime.h> +#else +#include <Carbon/Carbon.h> +#endif /* WITHOUT_FRAMEWORKS */ +#include "macglue.h" + +#ifdef USE_TOOLBOX_OBJECT_GLUE +extern int _CFStringRefObj_Convert(PyObject *, CFStringRef *); +//#define CFStringRefObj_Convert _CFStringRefObj_Convert +#endif + +//extern int CFBundleRefObj_Convert(PyObject *, CFBundleRef *); // need to wrap CFBundle + +""" + +initstuff = """ + +""" + +module = MacModule('_IBCarbon', 'IBCarbon', includestuff, finalstuff, initstuff) + +class CFReleaserObject(GlobalObjectDefinition): + def outputFreeIt(self, name): + Output("CFRelease(%s);" % name) + +class CFNibDesc(GlobalObjectDefinition): + def outputFreeIt(self, name): + Output("DisposeNibReference(%s);" % name) + +#cfstringobject = CFReleaserObject("CFStringRef") +#module.addobject(cfstringobject) +#cfbundleobject = CFReleaserObject("CFBundleRef") +#module.addobject(cfbundleobject) +ibnibobject = CFNibDesc("IBNibRef", "IBNibRefObj") +module.addobject(ibnibobject) + +functions = [] +methods = [] + +execfile('IBCarbongen.py') + +for f in functions: module.add(f) +for m in methods: ibnibobject.add(m) + +SetOutputFileName('_IBCarbon.c') +module.generate() diff --git a/Mac/Modules/ibcarbon/_IBCarbon.c b/Mac/Modules/ibcarbon/_IBCarbon.c new file mode 100644 index 0000000..34e432f --- /dev/null +++ b/Mac/Modules/ibcarbon/_IBCarbon.c @@ -0,0 +1,238 @@ + +/* ======================== Module _IBCarbon ======================== */ + +#include "Python.h" + + + +#ifdef WITHOUT_FRAMEWORKS +#include <IBCarbonRuntime.h> +#else +#include <Carbon/Carbon.h> +#endif /* WITHOUT_FRAMEWORKS */ +#include "macglue.h" + +#ifdef USE_TOOLBOX_OBJECT_GLUE +extern int _CFStringRefObj_Convert(PyObject *, CFStringRef *); +//#define CFStringRefObj_Convert _CFStringRefObj_Convert +#endif + +//extern int CFBundleRefObj_Convert(PyObject *, CFBundleRef *); // need to wrap CFBundle + + +static PyObject *IBCarbon_Error; + +/* ---------------------- Object type IBNibRef ---------------------- */ + +PyTypeObject IBNibRef_Type; + +#define IBNibRefObj_Check(x) ((x)->ob_type == &IBNibRef_Type) + +typedef struct IBNibRefObject { + PyObject_HEAD + IBNibRef ob_itself; +} IBNibRefObject; + +PyObject *IBNibRefObj_New(IBNibRef itself) +{ + IBNibRefObject *it; + it = PyObject_NEW(IBNibRefObject, &IBNibRef_Type); + if (it == NULL) return NULL; + it->ob_itself = itself; + return (PyObject *)it; +} +int IBNibRefObj_Convert(PyObject *v, IBNibRef *p_itself) +{ + if (!IBNibRefObj_Check(v)) + { + PyErr_SetString(PyExc_TypeError, "IBNibRef required"); + return 0; + } + *p_itself = ((IBNibRefObject *)v)->ob_itself; + return 1; +} + +static void IBNibRefObj_dealloc(IBNibRefObject *self) +{ + DisposeNibReference(self->ob_itself); + PyMem_DEL(self); +} + +static PyObject *IBNibRefObj_CreateWindowFromNib(IBNibRefObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + CFStringRef inName; + WindowPtr outWindow; + if (!PyArg_ParseTuple(_args, "O&", + CFStringRefObj_Convert, &inName)) + return NULL; + Py_BEGIN_ALLOW_THREADS + _err = CreateWindowFromNib(_self->ob_itself, + inName, + &outWindow); + Py_END_ALLOW_THREADS + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + WinObj_New, outWindow); + return _res; +} + +static PyObject *IBNibRefObj_CreateMenuFromNib(IBNibRefObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + CFStringRef inName; + MenuHandle outMenuRef; + if (!PyArg_ParseTuple(_args, "O&", + CFStringRefObj_Convert, &inName)) + return NULL; + Py_BEGIN_ALLOW_THREADS + _err = CreateMenuFromNib(_self->ob_itself, + inName, + &outMenuRef); + Py_END_ALLOW_THREADS + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + MenuObj_New, outMenuRef); + return _res; +} + +static PyObject *IBNibRefObj_CreateMenuBarFromNib(IBNibRefObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + CFStringRef inName; + Handle outMenuBar; + if (!PyArg_ParseTuple(_args, "O&", + CFStringRefObj_Convert, &inName)) + return NULL; + Py_BEGIN_ALLOW_THREADS + _err = CreateMenuBarFromNib(_self->ob_itself, + inName, + &outMenuBar); + Py_END_ALLOW_THREADS + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + ResObj_New, outMenuBar); + return _res; +} + +static PyObject *IBNibRefObj_SetMenuBarFromNib(IBNibRefObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + CFStringRef inName; + if (!PyArg_ParseTuple(_args, "O&", + CFStringRefObj_Convert, &inName)) + return NULL; + Py_BEGIN_ALLOW_THREADS + _err = SetMenuBarFromNib(_self->ob_itself, + inName); + Py_END_ALLOW_THREADS + if (_err != noErr) return PyMac_Error(_err); + Py_INCREF(Py_None); + _res = Py_None; + return _res; +} + +static PyMethodDef IBNibRefObj_methods[] = { + {"CreateWindowFromNib", (PyCFunction)IBNibRefObj_CreateWindowFromNib, 1, + "(CFStringRef inName) -> (WindowPtr outWindow)"}, + {"CreateMenuFromNib", (PyCFunction)IBNibRefObj_CreateMenuFromNib, 1, + "(CFStringRef inName) -> (MenuHandle outMenuRef)"}, + {"CreateMenuBarFromNib", (PyCFunction)IBNibRefObj_CreateMenuBarFromNib, 1, + "(CFStringRef inName) -> (Handle outMenuBar)"}, + {"SetMenuBarFromNib", (PyCFunction)IBNibRefObj_SetMenuBarFromNib, 1, + "(CFStringRef inName) -> None"}, + {NULL, NULL, 0} +}; + +PyMethodChain IBNibRefObj_chain = { IBNibRefObj_methods, NULL }; + +static PyObject *IBNibRefObj_getattr(IBNibRefObject *self, char *name) +{ + return Py_FindMethodInChain(&IBNibRefObj_chain, (PyObject *)self, name); +} + +#define IBNibRefObj_setattr NULL + +#define IBNibRefObj_compare NULL + +#define IBNibRefObj_repr NULL + +#define IBNibRefObj_hash NULL + +PyTypeObject IBNibRef_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "_IBCarbon.IBNibRef", /*tp_name*/ + sizeof(IBNibRefObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) IBNibRefObj_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + (getattrfunc) IBNibRefObj_getattr, /*tp_getattr*/ + (setattrfunc) IBNibRefObj_setattr, /*tp_setattr*/ + (cmpfunc) IBNibRefObj_compare, /*tp_compare*/ + (reprfunc) IBNibRefObj_repr, /*tp_repr*/ + (PyNumberMethods *)0, /* tp_as_number */ + (PySequenceMethods *)0, /* tp_as_sequence */ + (PyMappingMethods *)0, /* tp_as_mapping */ + (hashfunc) IBNibRefObj_hash, /*tp_hash*/ +}; + +/* -------------------- End object type IBNibRef -------------------- */ + + +static PyObject *IBCarbon_CreateNibReference(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + CFStringRef inNibName; + IBNibRef outNibRef; + if (!PyArg_ParseTuple(_args, "O&", + CFStringRefObj_Convert, &inNibName)) + return NULL; + Py_BEGIN_ALLOW_THREADS + _err = CreateNibReference(inNibName, + &outNibRef); + Py_END_ALLOW_THREADS + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + IBNibRefObj_New, outNibRef); + return _res; +} + +static PyMethodDef IBCarbon_methods[] = { + {"CreateNibReference", (PyCFunction)IBCarbon_CreateNibReference, 1, + "(CFStringRef inNibName) -> (IBNibRef outNibRef)"}, + {NULL, NULL, 0} +}; + + + + +void init_IBCarbon(void) +{ + PyObject *m; + PyObject *d; + + + + + + m = Py_InitModule("_IBCarbon", IBCarbon_methods); + d = PyModule_GetDict(m); + IBCarbon_Error = PyMac_GetOSErrException(); + if (IBCarbon_Error == NULL || + PyDict_SetItemString(d, "Error", IBCarbon_Error) != 0) + return; + IBNibRef_Type.ob_type = &PyType_Type; + Py_INCREF(&IBNibRef_Type); + if (PyDict_SetItemString(d, "IBNibRefType", (PyObject *)&IBNibRef_Type) != 0) + Py_FatalError("can't initialize IBNibRefType"); +} + +/* ====================== End module _IBCarbon ====================== */ + |