]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Donovan Preston's interface to IBCarbon, allowing you to use Interface
authorJack Jansen <jack.jansen@cwi.nl>
Sun, 4 Aug 2002 21:34:24 +0000 (21:34 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Sun, 4 Aug 2002 21:34:24 +0000 (21:34 +0000)
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!

Mac/Modules/ibcarbon/IBCarbonscan.py [new file with mode: 0644]
Mac/Modules/ibcarbon/IBCarbonsupport.py [new file with mode: 0644]
Mac/Modules/ibcarbon/_IBCarbon.c [new file with mode: 0644]

diff --git a/Mac/Modules/ibcarbon/IBCarbonscan.py b/Mac/Modules/ibcarbon/IBCarbonscan.py
new file mode 100644 (file)
index 0000000..7c54fc9
--- /dev/null
@@ -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 (file)
index 0000000..9890c3a
--- /dev/null
@@ -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 (file)
index 0000000..34e432f
--- /dev/null
@@ -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 ====================== */
+