Workaround an xcb-dri2 bug.
xcb_dri2_connect_device_name generated by xcb-proto 1.6 is broken. It
only works when the length of the driver name is a multiple of 4.
diff --git a/compositor/compositor-x11.c b/compositor/compositor-x11.c
index b7a9d0d..f55b30e 100644
--- a/compositor/compositor-x11.c
+++ b/compositor/compositor-x11.c
@@ -16,6 +16,10 @@
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
@@ -152,9 +156,22 @@
return -1;
}
+#ifdef XCB_DRI2_CONNECT_DEVICE_NAME_BROKEN
+ {
+ char *driver_name, *device_name;
+
+ driver_name = xcb_dri2_connect_driver_name (connect);
+ device_name = driver_name +
+ ((connect->driver_name_length + 3) & ~3);
+ snprintf(path, sizeof path, "%.*s",
+ xcb_dri2_connect_device_name_length (connect),
+ device_name);
+ }
+#else
snprintf(path, sizeof path, "%.*s",
xcb_dri2_connect_device_name_length (connect),
xcb_dri2_connect_device_name (connect));
+#endif
free(connect);
fd = open(path, O_RDWR);
diff --git a/configure.ac b/configure.ac
index b510b51..f57e2bd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -34,6 +34,11 @@
[AC_MSG_ERROR([Can't find expat library. Please install expat.])])
AC_SUBST(EXPAT_LIBS)
+# workaround a bug in xcb-dri2 generated by xcb-proto 1.6
+AC_CHECK_LIB(xcb-dri2, xcb_dri2_connect_alignment_pad, [],
+ [AC_DEFINE([XCB_DRI2_CONNECT_DEVICE_NAME_BROKEN], [1],
+ [Define to 1 if xcb_dri2_connect_device_name is broken])])
+
AC_CONFIG_FILES([wayland/wayland-server.pc
wayland/wayland-client.pc
Makefile