summaryrefslogtreecommitdiffstats
path: root/Mac/Modules
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2002-08-04 21:34:24 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2002-08-04 21:34:24 (GMT)
commit0c069924e5e2a1bc254355a592cd0bdac28d316f (patch)
treec59fcb3bd5ead8658d3256f56f3c212a96fe2c13 /Mac/Modules
parent84a016417a9f334a15a5ee306069f696138b4a7c (diff)
downloadcpython-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/Modules')
-rw-r--r--Mac/Modules/ibcarbon/IBCarbonscan.py45
-rw-r--r--Mac/Modules/ibcarbon/IBCarbonsupport.py59
-rw-r--r--Mac/Modules/ibcarbon/_IBCarbon.c238
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 ====================== */
+