[cairo] pycairo fails with python 3.2

Fons Adriaensen fons at linuxaudio.org
Wed Mar 23 15:01:23 PDT 2011


Hello all,

Pycairo fails with Python 3.2 since it is still using the now
deprecated PyCObject interface.

I managed to get the current release (1.8.10) working with
the two patches added at the end of this message.

Apart from those I also had to use the standard Python
distutils as the waf scripts failed at the configure stage.


****************************

--- cairomodule-orig.c  2011-03-23 16:44:59.000000000 +0100
+++ cairomodule.c   2011-03-23 16:52:54.000000000 +0100
@@ -70,7 +70,7 @@
 }
 
 
-/* C API.  Clients get at this via Pycairo_IMPORT, defined in pycairo.h.
+/* C API.  Clients get at this via inport_cairo(), defined in pycairo.h.
  */
 static Pycairo_CAPI_t CAPI = {
   &PycairoContext_Type,
@@ -376,8 +376,11 @@
   PyModule_AddObject(m, "XlibSurface",
             (PyObject *)&PycairoXlibSurface_Type);
 #endif
-
-  PyModule_AddObject(m, "CAPI", PyCObject_FromVoidPtr(&CAPI, NULL));
+ 
+/* Create a Capsule containing the CAPI pointer */
+  PyObject *T;
+  T = PyCapsule_New((void *)(&CAPI), "cairo.CAPI", 0);
+  if (T) PyModule_AddObject(m, "CAPI", T);
 
     /* constants */
 #if CAIRO_HAS_ATSUI_FONT


*****************************

--- py3cairo-orig.h 2010-05-29 07:21:37.000000000 +0200
+++ py3cairo.h  2011-03-23 22:44:58.000000000 +0100
@@ -193,13 +193,18 @@
 #define Pycairo_Check_Status         (Pycairo_CAPI->Check_Status)
 
 
-/* To access the Pycairo C API, edit the client module file to:
- * 1) Add the following line to define a global variable for the C API
- *    static Pycairo_CAPI_t *Pycairo_CAPI;
- * 2) Add 'Pycairo_IMPORT;' to the init<module> function
- */
-#define Pycairo_IMPORT \
-        Pycairo_CAPI = (Pycairo_CAPI_t*) PyCObject_Import("cairo", "CAPI")
+/* To access the Pycairo C API, the client module should
+   call 'import_cairo()' from the init<module> function,
+   and check the return value, < 0 means the import failed.
+*/
+
+static Pycairo_CAPI_t *Pycairo_CAPI;
+
+static int import_cairo(void)
+{
+  Pycairo_CAPI = (Pycairo_CAPI_t*) PyCapsule_Import("cairo.CAPI", 0);
+  return (Pycairo_CAPI != 0) ? 0 : -1;
+}
 
 #endif /* ifndef _INSIDE_PYCAIRO_ */

********************************


Ciao,

-- 
FA





More information about the cairo mailing list