[xinput] Check for the XInput entry points

Apparently, the XInput extension is using the same pkg-config
file ('xi') for both the 1.x and the 2.x API, so we need to
check for both the 1.x XGetExtensionVersion and the 2.x
XQueryInputVersion.
This commit is contained in:
Emmanuele Bassi 2009-06-04 13:41:32 +01:00
parent 876dc22633
commit 0a4a28a950
5 changed files with 66 additions and 29 deletions

View File

@ -39,8 +39,13 @@
#include "clutter-backend-x11.h"
#include "clutter-stage-x11.h"
#include "clutter-x11.h"
#include <X11/extensions/Xcomposite.h>
#ifdef HAVE_XINPUT
#include <X11/extensions/XInput.h>
#endif
#include "../clutter-event.h"
#include "../clutter-main.h"
#include "../clutter-debug.h"
@ -53,15 +58,18 @@ G_DEFINE_TYPE (ClutterBackendX11, clutter_backend_x11, CLUTTER_TYPE_BACKEND);
struct _ClutterX11XInputDevice
{
ClutterInputDevice device;
#ifdef USE_XINPUT
#ifdef HAVE_XINPUT
XDevice *xdevice;
XEventClass xevent_list[5]; /* MAX 5 event types */
int num_events;
#endif
ClutterX11InputDeviceType type; /* FIXME: generic to ClutterInputDevice? */
/* FIXME: generic to ClutterInputDevice? */
ClutterX11InputDeviceType type;
};
#ifdef USE_XINPUT
#ifdef HAVE_XINPUT
void _clutter_x11_register_xinput ();
#endif
@ -185,7 +193,7 @@ clutter_backend_x11_post_parse (ClutterBackend *backend,
clutter_backend_set_resolution (backend, dpi);
#ifdef USE_XINPUT
#ifdef HAVE_XINPUT
_clutter_x11_register_xinput ();
#endif
@ -630,7 +638,7 @@ clutter_x11_remove_filter (ClutterX11FilterFunc func,
}
}
#ifdef USE_XINPUT
#ifdef HAVE_XINPUT
void
_clutter_x11_register_xinput ()
@ -669,7 +677,15 @@ _clutter_x11_register_xinput ()
backend_singleton->have_xinput = TRUE;
ext = XGetExtensionVersion(backend_singleton->xdpy, INAME);
#ifdef HAVE_XGET_EXTENSION_VERSION
ext = XGetExtensionVersion (backend_singleton->xdpy, INAME);
#elif HAVE_XQUERY_INPUT_VERSION
ext = XQueryInputVersion (backend_singleton->xdpy, XI_2_Major, XI_2_Minor);
#else
g_critical ("XInput does not have XGetExtensionVersion nor "
"XQueryInputVersion");
return;
#endif
if (!ext || (ext == (XExtensionVersion*) NoSuchExtension))
{
@ -879,7 +895,7 @@ clutter_x11_get_input_devices (void)
{
ClutterMainContext *context;
#ifdef USE_XINPUT
#ifdef HAVE_XINPUT
if (!backend_singleton)
{
g_critical ("X11 backend has not been initialised");
@ -889,9 +905,9 @@ clutter_x11_get_input_devices (void)
context = clutter_context_get_default ();
return context->input_devices;
#else
#else /* !HAVE_XINPUT */
return NULL;
#endif
#endif /* HAVE_XINPUT */
}
/**
@ -923,7 +939,7 @@ clutter_x11_get_input_device_type (ClutterX11XInputDevice *device)
gboolean
clutter_x11_has_xinput (void)
{
#ifdef USE_XINPUT
#ifdef HAVE_XINPUT
if (!backend_singleton)
{
g_critical ("X11 backend has not been initialised");

View File

@ -28,10 +28,6 @@
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#ifdef USE_XINPUT
#include <X11/extensions/XInput.h>
#endif
#include "clutter-x11.h"
G_BEGIN_DECLS
@ -79,10 +75,8 @@ struct _ClutterBackendX11
Atom atom_NET_WM_NAME;
Atom atom_UTF8_STRING;
#ifdef USE_XINPUT
int event_types[CLUTTER_X11_XINPUT_LAST_EVENT];
gboolean have_xinput;
#endif
int event_types[CLUTTER_X11_XINPUT_LAST_EVENT];
gboolean have_xinput;
Time last_event_time;
};
@ -127,7 +121,6 @@ XVisualInfo *
clutter_backend_x11_get_visual_info (ClutterBackendX11 *backend_x11,
gboolean for_offscreen);
#ifdef USE_XINPUT
void
_clutter_x11_register_xinput (void);
@ -136,7 +129,6 @@ _clutter_x11_unregister_xinput (void);
ClutterX11XInputDevice *
_clutter_x11_get_device_for_xid (XID id);
#endif
void
_clutter_x11_select_events (Window xwin);

View File

@ -43,7 +43,7 @@
#include <X11/Xatom.h>
#ifdef USE_XINPUT
#ifdef HAVE_XINPUT
#include <X11/extensions/XInput.h>
#endif
@ -263,7 +263,7 @@ set_user_time (ClutterBackendX11 *backend_x11,
}
}
#if 0 /* See XInput keyboard comment below USE_XINPUT */
#if 0 /* See XInput keyboard comment below HAVE_XINPUT */
static void
convert_xdevicekey_to_xkey (XDeviceKeyEvent *xkev, XEvent *xevent)
{
@ -282,7 +282,7 @@ convert_xdevicekey_to_xkey (XDeviceKeyEvent *xkev, XEvent *xevent)
xevent->xkey.keycode = xkev->keycode;
xevent->xkey.same_screen = xkev->same_screen;
}
#endif /* USE_XINPUT */
#endif /* HAVE_XINPUT */
static void
translate_key_event (ClutterBackend *backend,
@ -738,7 +738,7 @@ event_translate (ClutterBackend *backend,
}
else
{ /* XInput fun.. Needs clean up. */
#ifdef USE_XINPUT
#ifdef HAVE_XINPUT
int *ev_types = backend_x11->event_types;
CLUTTER_NOTE (EVENT, "XInput event type: %d", xevent->type);

View File

@ -62,10 +62,8 @@ struct _ClutterStageX11
ClutterBackendX11 *backend;
ClutterStageState state;
#ifdef USE_XINPUT
int event_types[CLUTTER_X11_XINPUT_LAST_EVENT];
GList *devices;
#endif
int event_types[CLUTTER_X11_XINPUT_LAST_EVENT];
GList *devices;
ClutterStage *wrapper;
};

View File

@ -491,7 +491,38 @@ AS_IF([test "x$clutterbackend" = "xglx" || test "x$clutterbackend" = "xeglx"],
[yes],
[
AC_DEFINE(USE_XINPUT, 1, Use the XINPUT X extension)
AC_DEFINE(HAVE_XINPUT, 1, Use the XINPUT X extension)
# ugh, this is insane
AC_TRY_COMPILE([#include <X11/extensions/XInput.h>],
[
XExtensionVersion *res;
res = XGetExtensionVersion (NULL, INAME);
],
[have_xget_extension_version=yes],
[have_xget_extension_version=no])
AC_TRY_COMPILE([#include <X11/extensions/XInput.h>],
[
XExtensionVersion *res;
res = XQueryInputVersion (NULL, XI_2_Major, XI_2_Minor);
],
[have_xquery_input_version=yes],
[have_xquery_input_version=no])
AS_IF([test "x$have_xget_extension_version" = "xyes"],
[
AC_DEFINE([HAVE_XGET_EXTENSION_VERSION],
[1],
[Define to 1 if we have XGetExtensionVersion])
])
AS_IF([test "x$have_xquery_input_version" = "xyes"],
[
AC_DEFINE([HAVE_XQUERY_INPUT_VERSION],
[1],
[Define to 1 if we have XQueryInputVersion])
])
X11_LIBS="$X11_LIBS -lXi"
X11_PC_FILES="$X11_PC_FILES xi"