parent
76b11091e2
commit
584c502162
|
@ -158,6 +158,13 @@ if test "x$enable_xft" = "xyes"; then
|
||||||
fi
|
fi
|
||||||
AM_CONDITIONAL(USE_LIBXFT, test "x$enable_xft" = "xyes")
|
AM_CONDITIONAL(USE_LIBXFT, test "x$enable_xft" = "xyes")
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(xi2,
|
||||||
|
[ --enable-xi2 compile with XI2 support (experimental) @<:@default=no@:>@],,
|
||||||
|
enable_xi2=no)
|
||||||
|
if test "x$enable_xi2" = "xyes"; then
|
||||||
|
PKG_CHECK_MODULES(XI, xi >= 1.3, AC_DEFINE(USE_XI2, 1, [XI2 support]), enable_xi2=no)
|
||||||
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE(ecore,
|
AC_ARG_ENABLE(ecore,
|
||||||
[ --enable-ecore use ecore functions (for testing only - DO NOT USE!) @<:@default=no@:>@],,
|
[ --enable-ecore use ecore functions (for testing only - DO NOT USE!) @<:@default=no@:>@],,
|
||||||
enable_ecore=no)
|
enable_ecore=no)
|
||||||
|
@ -435,6 +442,7 @@ echo " Compile with ecore/ecore_x ... $enable_ecore"
|
||||||
echo " GLX .......................... $enable_glx"
|
echo " GLX .......................... $enable_glx"
|
||||||
echo " ScreenSaver .................. $enable_xscrnsaver"
|
echo " ScreenSaver .................. $enable_xscrnsaver"
|
||||||
echo " D-Bus ........................ $enable_dbus"
|
echo " D-Bus ........................ $enable_dbus"
|
||||||
|
echo " XI2 .......................... $enable_xi2"
|
||||||
echo
|
echo
|
||||||
echo "Installation path .............. $prefix"
|
echo "Installation path .............. $prefix"
|
||||||
echo " Install HTML docs ............ $enable_docs"
|
echo " Install HTML docs ............ $enable_docs"
|
||||||
|
|
1
src/E.h
1
src/E.h
|
@ -127,6 +127,7 @@
|
||||||
#define XEXT_FIXES 6
|
#define XEXT_FIXES 6
|
||||||
#define XEXT_RENDER 7
|
#define XEXT_RENDER 7
|
||||||
#define XEXT_GLX 8
|
#define XEXT_GLX 8
|
||||||
|
#define XEXT_XI 9
|
||||||
|
|
||||||
#define XEXT_CM_ALL 16
|
#define XEXT_CM_ALL 16
|
||||||
|
|
||||||
|
|
|
@ -121,7 +121,9 @@ e16_CPPFLAGS = -I$(top_builddir) \
|
||||||
$(MODULE_CFLAGS) \
|
$(MODULE_CFLAGS) \
|
||||||
$(IMLIB2_CFLAGS) \
|
$(IMLIB2_CFLAGS) \
|
||||||
$(DBUS_CFLAGS) \
|
$(DBUS_CFLAGS) \
|
||||||
$(X_CFLAGS) $(CWARNFLAGS) \
|
$(XI_CFLAGS) \
|
||||||
|
$(X_CFLAGS) \
|
||||||
|
$(CWARNFLAGS) \
|
||||||
-D LOCALEDIR=\"$(datadir)/locale\" \
|
-D LOCALEDIR=\"$(datadir)/locale\" \
|
||||||
-D ENLIGHTENMENT_BIN=\"$(bindir)\" \
|
-D ENLIGHTENMENT_BIN=\"$(bindir)\" \
|
||||||
-D ENLIGHTENMENT_LIB=\"$(pkglibdir)\" \
|
-D ENLIGHTENMENT_LIB=\"$(pkglibdir)\" \
|
||||||
|
@ -134,6 +136,7 @@ LDADD = \
|
||||||
$(IMLIB2_LIBS) \
|
$(IMLIB2_LIBS) \
|
||||||
$(MODULE_LIBS) \
|
$(MODULE_LIBS) \
|
||||||
$(GLX_LIBS) \
|
$(GLX_LIBS) \
|
||||||
|
$(XI_LIBS) \
|
||||||
$(X_LIBS) \
|
$(X_LIBS) \
|
||||||
$(SM_LIBS) \
|
$(SM_LIBS) \
|
||||||
$(XINERAMA_LIBS) \
|
$(XINERAMA_LIBS) \
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#define EDBUG_TYPE_TIMERS 150
|
#define EDBUG_TYPE_TIMERS 150
|
||||||
#define EDBUG_TYPE_IDLERS 151
|
#define EDBUG_TYPE_IDLERS 151
|
||||||
#define EDBUG_TYPE_SOUND 152
|
#define EDBUG_TYPE_SOUND 152
|
||||||
|
#define EDBUG_TYPE_XI2 153
|
||||||
|
|
||||||
#define EDBUG_TYPE_COMPMGR 161
|
#define EDBUG_TYPE_COMPMGR 161
|
||||||
#define EDBUG_TYPE_COMPMGR2 162
|
#define EDBUG_TYPE_COMPMGR2 162
|
||||||
|
|
113
src/events.c
113
src/events.c
|
@ -49,6 +49,9 @@
|
||||||
#if USE_GLX
|
#if USE_GLX
|
||||||
#include <GL/glx.h>
|
#include <GL/glx.h>
|
||||||
#endif
|
#endif
|
||||||
|
#if USE_XI2
|
||||||
|
#include <X11/extensions/XInput2.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLE_DEBUG_EVENTS
|
#if ENABLE_DEBUG_EVENTS
|
||||||
static const char *EventName(unsigned int type);
|
static const char *EventName(unsigned int type);
|
||||||
|
@ -153,6 +156,64 @@ ExtInitRR(int available)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if USE_XI2
|
||||||
|
static int xi_major_op = 0;
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
EInputQueryExtension(Display * dpy,
|
||||||
|
int *event_base_return, int *error_base_return)
|
||||||
|
{
|
||||||
|
return XQueryExtension(dpy, "XInputExtension", &xi_major_op,
|
||||||
|
event_base_return, error_base_return);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Status
|
||||||
|
EInputQueryVersion(Display * dpy,
|
||||||
|
int *major_version_return, int *minor_version_return)
|
||||||
|
{
|
||||||
|
*major_version_return = XI_2_Major;
|
||||||
|
*minor_version_return = XI_2_Minor;
|
||||||
|
|
||||||
|
return XIQueryVersion(dpy, major_version_return, minor_version_return);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "X11/extensions/XInput.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
ExtInitInput(int available)
|
||||||
|
{
|
||||||
|
int i, j, nd;
|
||||||
|
XDeviceInfo *dvi, *dvis;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
if (!available)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!EDebug(EDBUG_TYPE_VERBOSE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
dvis = XListInputDevices(disp, &nd);
|
||||||
|
Eprintf("Dev id nc use name\n");
|
||||||
|
for (i = 0; i < nd; i++)
|
||||||
|
{
|
||||||
|
dvi = dvis + i;
|
||||||
|
Eprintf(" %2d %#3lx %d %d %-32s", i,
|
||||||
|
dvi->id, dvi->num_classes, dvi->use, dvi->name);
|
||||||
|
p = (char *)dvi->inputclassinfo;
|
||||||
|
for (j = 0; j < dvi->num_classes; j++)
|
||||||
|
{
|
||||||
|
XAnyClassPtr pcany = (XAnyClassPtr) p;
|
||||||
|
|
||||||
|
printf(" %#3lx %3d", pcany->class, pcany->length);
|
||||||
|
p += pcany->length;
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
XFreeDeviceList(dvis);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static const EServerExt Extensions[] = {
|
static const EServerExt Extensions[] = {
|
||||||
{"Shape", XEXT_SHAPE, XShapeQueryExtension, XShapeQueryVersion,
|
{"Shape", XEXT_SHAPE, XShapeQueryExtension, XShapeQueryVersion,
|
||||||
ExtInitShape},
|
ExtInitShape},
|
||||||
|
@ -176,6 +237,9 @@ static const EServerExt Extensions[] = {
|
||||||
#if USE_GLX
|
#if USE_GLX
|
||||||
{"GLX", XEXT_GLX, glXQueryExtension, glXQueryVersion, NULL},
|
{"GLX", XEXT_GLX, glXQueryExtension, glXQueryVersion, NULL},
|
||||||
#endif
|
#endif
|
||||||
|
#if USE_XI2
|
||||||
|
{"Input", XEXT_XI, EInputQueryExtension, EInputQueryVersion, ExtInitInput},
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -634,6 +698,47 @@ EventsCompress(XEvent * evq, int count)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if USE_XI2
|
||||||
|
static void
|
||||||
|
EventFetchXI2(XEvent * ev)
|
||||||
|
{
|
||||||
|
XIDeviceEvent *xie;
|
||||||
|
|
||||||
|
if (!XGetEventData(disp, &ev->xcookie))
|
||||||
|
return;
|
||||||
|
|
||||||
|
xie = (XIDeviceEvent *) ev->xcookie.data;
|
||||||
|
|
||||||
|
if (EDebug(EDBUG_TYPE_XI2))
|
||||||
|
Eprintf("%s: %#lx: XI2 ext=%d type=%d devid=%d srcid=%d\n",
|
||||||
|
"EventsFetch", xie->event, xie->extension,
|
||||||
|
xie->evtype, xie->deviceid, xie->sourceid);
|
||||||
|
|
||||||
|
switch (ev->xcookie.evtype)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case XI_ButtonPress:
|
||||||
|
case XI_ButtonRelease:
|
||||||
|
case XI_Motion:
|
||||||
|
ev->type = ev->xcookie.evtype;
|
||||||
|
ev->xbutton.window = xie->event;
|
||||||
|
ev->xbutton.root = xie->root;
|
||||||
|
ev->xbutton.subwindow = xie->child;
|
||||||
|
ev->xbutton.time = xie->time;
|
||||||
|
ev->xbutton.x = (int)xie->event_x;
|
||||||
|
ev->xbutton.y = (int)xie->event_y;
|
||||||
|
ev->xbutton.x_root = (int)xie->root_x;
|
||||||
|
ev->xbutton.y_root = (int)xie->root_y;
|
||||||
|
ev->xbutton.button = xie->detail;
|
||||||
|
ev->xbutton.state = xie->mods.effective;
|
||||||
|
ev->xbutton.same_screen = 1; /* FIXME */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
XFreeEventData(disp, &ev->xcookie);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
EventsFetch(XEvent ** evq_p, int *evq_n)
|
EventsFetch(XEvent ** evq_p, int *evq_n)
|
||||||
{
|
{
|
||||||
|
@ -654,6 +759,14 @@ EventsFetch(XEvent ** evq_p, int *evq_n)
|
||||||
for (; i < count; i++, ev++)
|
for (; i < count; i++, ev++)
|
||||||
{
|
{
|
||||||
XNextEvent(disp, ev);
|
XNextEvent(disp, ev);
|
||||||
|
#if USE_XI2
|
||||||
|
if (ev->type == GenericEvent)
|
||||||
|
{
|
||||||
|
if (ev->xcookie.extension == xi_major_op)
|
||||||
|
EventFetchXI2(ev);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif /* USE_XI2 */
|
||||||
|
|
||||||
/* Map some event types to E internals */
|
/* Map some event types to E internals */
|
||||||
if (ev->type == event_base_shape + ShapeNotify)
|
if (ev->type == event_base_shape + ShapeNotify)
|
||||||
|
|
43
src/x.c
43
src/x.c
|
@ -40,6 +40,9 @@
|
||||||
#if USE_GLX
|
#if USE_GLX
|
||||||
#include "eglx.h"
|
#include "eglx.h"
|
||||||
#endif
|
#endif
|
||||||
|
#if USE_XI2
|
||||||
|
#include "X11/extensions/XInput2.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DEBUG_XWIN 0
|
#define DEBUG_XWIN 0
|
||||||
#define DEBUG_PIXMAP 0
|
#define DEBUG_PIXMAP 0
|
||||||
|
@ -1018,18 +1021,58 @@ ESetWindowBackground(Win win, unsigned int col)
|
||||||
void
|
void
|
||||||
ESelectInput(Win win, unsigned int event_mask)
|
ESelectInput(Win win, unsigned int event_mask)
|
||||||
{
|
{
|
||||||
|
#if USE_XI2
|
||||||
|
|
||||||
|
#define EVENTS_TO_XI \
|
||||||
|
(/* KeyPressMask | KeyReleaseMask | */ \
|
||||||
|
ButtonPressMask | ButtonReleaseMask | PointerMotionMask)
|
||||||
|
|
||||||
|
win->event_mask = event_mask;
|
||||||
|
|
||||||
|
if (Mode.server.extensions & XEXT_XI)
|
||||||
|
{
|
||||||
|
XIEventMask em;
|
||||||
|
unsigned char mask[(XI_LASTEVENT + 8) / 8];
|
||||||
|
|
||||||
|
em.deviceid = XIAllMasterDevices; /* XIAllDevices; */
|
||||||
|
em.mask_len = sizeof(mask);
|
||||||
|
em.mask = mask;
|
||||||
|
memset(mask, 0, sizeof(mask));
|
||||||
|
#if 0
|
||||||
|
if (event_mask & KeyPressMask)
|
||||||
|
XISetMask(mask, XI_KeyPress);
|
||||||
|
if (event_mask & KeyReleaseMask)
|
||||||
|
XISetMask(mask, XI_KeyRelease);
|
||||||
|
#endif
|
||||||
|
if (event_mask & ButtonPressMask)
|
||||||
|
XISetMask(mask, XI_ButtonPress);
|
||||||
|
if (event_mask & ButtonReleaseMask)
|
||||||
|
XISetMask(mask, XI_ButtonRelease);
|
||||||
|
if (event_mask & PointerMotionMask)
|
||||||
|
XISetMask(mask, XI_Motion);
|
||||||
|
XISelectEvents(disp, win->xwin, &em, 1);
|
||||||
|
event_mask &= ~EVENTS_TO_XI;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
XSelectInput(disp, win->xwin, event_mask);
|
XSelectInput(disp, win->xwin, event_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ESelectInputChange(Win win, unsigned int set, unsigned int clear)
|
ESelectInputChange(Win win, unsigned int set, unsigned int clear)
|
||||||
{
|
{
|
||||||
|
#if USE_XI2
|
||||||
|
win->event_mask |= set;
|
||||||
|
win->event_mask &= ~clear;
|
||||||
|
ESelectInput(win, win->event_mask);
|
||||||
|
#else
|
||||||
XWindowAttributes xwa;
|
XWindowAttributes xwa;
|
||||||
|
|
||||||
XGetWindowAttributes(disp, win->xwin, &xwa);
|
XGetWindowAttributes(disp, win->xwin, &xwa);
|
||||||
xwa.your_event_mask |= set;
|
xwa.your_event_mask |= set;
|
||||||
xwa.your_event_mask &= ~clear;
|
xwa.your_event_mask &= ~clear;
|
||||||
XSelectInput(disp, win->xwin, xwa.your_event_mask);
|
XSelectInput(disp, win->xwin, xwa.your_event_mask);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -111,6 +111,9 @@ struct _xwin {
|
||||||
Colormap cmap;
|
Colormap cmap;
|
||||||
Pixmap bgpmap;
|
Pixmap bgpmap;
|
||||||
unsigned int bgcol;
|
unsigned int bgcol;
|
||||||
|
#if USE_XI2
|
||||||
|
unsigned int event_mask;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
Win ELookupXwin(Window xwin);
|
Win ELookupXwin(Window xwin);
|
||||||
|
|
Loading…
Reference in New Issue