summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagna@src.gnome.org>2014-05-12 23:08:34 +0200
committerGiovanni Campagna <gcampagna@src.gnome.org>2014-06-25 20:45:46 +0200
commit3f09daa34e56ab79e43233e8aaae3e353a508210 (patch)
treebcc55bded7971bdeb24f7c2442ec7b695fc6150d
parent272d8c935808ec879e41ee53f0b9030ffd4abf56 (diff)
downloadgjs-3f09daa34e56ab79e43233e8aaae3e353a508210.tar.gz
cairo: enable multithreading for cairo-xlib
We want to be able to free cairo objects from the background thread, and that means we must be able to make xlib calls from multiple threads. Which is ok, if we initialize xlib beforehand. We don't have a good place to initialize gjs, where we're sure to be called before the first XOpenDisplay(), so just stuff it into a constructor. https://bugzilla.gnome.org/show_bug.cgi?id=730030
-rw-r--r--Makefile-modules.am4
-rw-r--r--configure.ac1
-rw-r--r--modules/cairo.cpp13
3 files changed, 16 insertions, 2 deletions
diff --git a/Makefile-modules.am b/Makefile-modules.am
index d17ca6d1..20bbd44d 100644
--- a/Makefile-modules.am
+++ b/Makefile-modules.am
@@ -27,8 +27,8 @@ CLEANFILES += $(nodist_libmodules_resources_la_SOURCES)
libmodules_resources_la_CPPFLAGS = $(JS_NATIVE_MODULE_CFLAGS)
libmodules_resources_la_LIBADD = $(JS_NATIVE_MODULE_LIBADD)
-libcairoNative_la_CPPFLAGS = $(JS_NATIVE_MODULE_CFLAGS) $(GJS_CAIRO_CFLAGS)
-libcairoNative_la_LIBADD = $(JS_NATIVE_MODULE_LIBADD) $(GJS_CAIRO_LIBS)
+libcairoNative_la_CPPFLAGS = $(JS_NATIVE_MODULE_CFLAGS) $(GJS_CAIRO_CFLAGS) $(GJS_CAIRO_XLIB_CFLAGS)
+libcairoNative_la_LIBADD = $(JS_NATIVE_MODULE_LIBADD) $(GJS_CAIRO_LIBS) $(GJS_CAIRO_XLIB_LIBS)
libcairoNative_la_SOURCES = \
modules/cairo-private.h \
modules/cairo-module.h \
diff --git a/configure.ac b/configure.ac
index 8281308f..819abb2c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -98,6 +98,7 @@ AM_CONDITIONAL(ENABLE_CAIRO, test x$have_cairo = xyes)
AS_IF([test x$have_cairo = xyes], [
AC_DEFINE([ENABLE_CAIRO],[1],[Define if you want to build with cairo support])
])
+PKG_CHECK_MODULES([GJS_CAIRO_XLIB], [cairo-xlib], , )
# Optional GTK+ dep (enabled by default)
AC_ARG_WITH(gtk,
diff --git a/modules/cairo.cpp b/modules/cairo.cpp
index 1fd51b6b..b5dab642 100644
--- a/modules/cairo.cpp
+++ b/modules/cairo.cpp
@@ -27,6 +27,19 @@
#include "cairo-private.h"
+#if CAIRO_HAS_XLIB_SURFACE
+#include "cairo-xlib.h"
+
+class XLibConstructor {
+ public:
+ XLibConstructor() {
+ XInitThreads();
+ }
+};
+
+static XLibConstructor constructor;
+#endif
+
JSBool
gjs_cairo_check_status(JSContext *context,
cairo_status_t status,