diff options
author | Daniel Stone <daniel@fooishbar.org> | 2012-06-22 13:21:35 +0100 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-06-22 11:52:06 -0400 |
commit | 62b33b6964d23470b53afda7b81e6bd8730e59d7 (patch) | |
tree | 45d49fd1490317b11c75593db5fa8540ae01d097 | |
parent | 22815f9115a6f03fd7be7009beaabe9490e5b927 (diff) |
compositor-x11: Add base XCB/XKB support
Try to find the XKB extension, to be used in later commits.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
-rw-r--r-- | configure.ac | 20 | ||||
-rw-r--r-- | src/compositor-x11.c | 33 |
2 files changed, 52 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index ce97486d..b616e777 100644 --- a/configure.ac +++ b/configure.ac @@ -65,8 +65,26 @@ if test x$enable_x11_compositor = xyes; then LIBS=$xcb_save_LIBS CFLAGS=$xcb_save_CFLAGS + X11_COMPOSITOR_MODULES="x11 x11-xcb" + + PKG_CHECK_MODULES(X11_COMPOSITOR_XKB, [xcb-xkb], + [have_xcb_xkb="yes"], [have_xcb_xkb="no"]) + if test "x$have_xcb_xkb" = xyes; then + # Most versions of XCB have totally broken XKB bindings, where the + # events don't work. Make sure we can actually use them. + xcb_xkb_save_CFLAGS=$CFLAGS + CFLAGS=$X11_COMPOSITOR_XKB_CFLAGS + AC_CHECK_MEMBER([struct xcb_xkb_state_notify_event_t.xkbType], + [], [have_xcb_xkb=no], [[#include <xcb/xkb.h>]]) + CFLAGS=$xcb_xkb_save_CFLAGS + fi + if test "x$have_xcb_xkb" = xyes; then + X11_COMPOSITOR_MODULES="$X11_COMPOSITOR_MODULES xcb-xkb" + AC_DEFINE([HAVE_XCB_XKB], [1], [libxcb supports XKB protocol]) + fi + + PKG_CHECK_MODULES(X11_COMPOSITOR, [$X11_COMPOSITOR_MODULES]) AC_DEFINE([BUILD_X11_COMPOSITOR], [1], [Build the X11 compositor]) - PKG_CHECK_MODULES(X11_COMPOSITOR, [x11 x11-xcb]) fi diff --git a/src/compositor-x11.c b/src/compositor-x11.c index d8dbacbf..7f0e6bd9 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -35,6 +35,10 @@ #include <linux/input.h> #include <xcb/xcb.h> +#ifdef HAVE_XCB_XKB +#include <xcb/xkb.h> +#endif + #include <X11/Xlib.h> #include <X11/Xlib-xcb.h> @@ -59,6 +63,8 @@ struct x11_compositor { struct wl_array keys; struct wl_event_source *xcb_source; struct xkb_keymap *xkb_keymap; + unsigned int has_xkb; + uint8_t xkb_event_base; struct { xcb_atom_t wm_protocols; xcb_atom_t wm_normal_hints; @@ -132,6 +138,31 @@ x11_compositor_get_keymap(struct x11_compositor *c) return ret; } +static void +x11_compositor_setup_xkb(struct x11_compositor *c) +{ +#ifndef HAVE_XCB_XKB + weston_log("XCB-XKB not available during build\n"); + c->has_xkb = 0; + c->xkb_event_base = 0; + return; +#else + const xcb_query_extension_reply_t *ext; + + c->has_xkb = 0; + c->xkb_event_base = 0; + + ext = xcb_get_extension_data(c->conn, &xcb_xkb_id); + if (!ext) { + weston_log("XKB extension not available on host X11 server\n"); + return; + } + c->xkb_event_base = ext->first_event; + + c->has_xkb = 1; +#endif +} + static int x11_input_create(struct x11_compositor *c, int no_input) { @@ -151,6 +182,8 @@ x11_input_create(struct x11_compositor *c, int no_input) weston_seat_init_pointer(&input->base); + x11_compositor_setup_xkb(c); + keymap = x11_compositor_get_keymap(c); weston_seat_init_keyboard(&input->base, keymap); if (keymap) |