mirror of
https://github.com/X11Libre/xf86-input-evdev.git
synced 2026-04-14 11:44:16 +00:00
Compare commits
10 Commits
xf86-input
...
xf86-input
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1dd61111ad | ||
|
|
231061d004 | ||
|
|
425ed6017a | ||
|
|
7251e42dfb | ||
|
|
551db5b86e | ||
|
|
bb8bde7456 | ||
|
|
7b1267f7f1 | ||
|
|
e08b033276 | ||
|
|
7c1971d9e7 | ||
|
|
9a6952dafe |
@@ -23,7 +23,7 @@
|
||||
# Initialize Autoconf
|
||||
AC_PREREQ([2.60])
|
||||
AC_INIT([xf86-input-evdev],
|
||||
[2.10.2],
|
||||
[2.10.5],
|
||||
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
|
||||
[xf86-input-evdev])
|
||||
AC_CONFIG_SRCDIR([Makefile.am])
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
#define EVDEV_PROP_MIDBUTTON "Evdev Middle Button Emulation"
|
||||
/* CARD32 */
|
||||
#define EVDEV_PROP_MIDBUTTON_TIMEOUT "Evdev Middle Button Timeout"
|
||||
/* CARD8 */
|
||||
#define EVDEV_PROP_MIDBUTTON_BUTTON "Evdev Middle Button Button"
|
||||
|
||||
/* Wheel emulation */
|
||||
/* BOOL */
|
||||
|
||||
@@ -94,6 +94,11 @@ Sets the timeout (in milliseconds) that the driver waits before deciding
|
||||
if two buttons where pressed "simultaneously" when 3 button emulation is
|
||||
enabled. Default: 50. Property: "Evdev Middle Button Timeout".
|
||||
.TP 7
|
||||
.BI "Option \*qEmulate3Button\*q \*q" integer \*q
|
||||
Specifies the physical button number to be emitted if middle button emulation
|
||||
is triggered.
|
||||
Default: 2. Property: "Evdev Middle Button Button".
|
||||
.TP 7
|
||||
.BI "Option \*qEmulateWheel\*q \*q" boolean \*q
|
||||
Enable/disable "wheel" emulation. Wheel emulation means emulating button
|
||||
press/release events when the mouse is moved while a specific real button
|
||||
@@ -283,6 +288,9 @@ value.
|
||||
.BI "Evdev Middle Button Timeout"
|
||||
1 16-bit positive value.
|
||||
.TP 7
|
||||
.BI "Evdev Middle Button Button"
|
||||
1 8-bit value, allowed range 0-32, 0 disables the button.
|
||||
.TP 7
|
||||
.BI "Evdev Wheel Emulation"
|
||||
1 boolean value (8 bit, 0 or 1).
|
||||
.TP 7
|
||||
|
||||
68
src/emuMB.c
68
src/emuMB.c
@@ -45,6 +45,7 @@
|
||||
|
||||
static Atom prop_mbemu = 0; /* Middle button emulation on/off property */
|
||||
static Atom prop_mbtimeout = 0; /* Middle button timeout property */
|
||||
static Atom prop_mbbuton = 0; /* Middle button target button property */
|
||||
/*
|
||||
* Lets create a simple finite-state machine for 3 button emulation:
|
||||
*
|
||||
@@ -184,14 +185,21 @@ int
|
||||
EvdevMBEmuTimer(InputInfoPtr pInfo)
|
||||
{
|
||||
EvdevPtr pEvdev = pInfo->private;
|
||||
int sigstate;
|
||||
int id;
|
||||
int mapped_id;
|
||||
|
||||
sigstate = xf86BlockSIGIO ();
|
||||
#if HAVE_THREADED_INPUT
|
||||
input_lock();
|
||||
#else
|
||||
int sigstate = xf86BlockSIGIO();
|
||||
#endif
|
||||
|
||||
pEvdev->emulateMB.pending = FALSE;
|
||||
if ((id = stateTab[pEvdev->emulateMB.state][4][0]) != 0) {
|
||||
EvdevPostButtonEvent(pInfo, abs(id),
|
||||
mapped_id = abs(id);
|
||||
if (mapped_id == 2)
|
||||
mapped_id = pEvdev->emulateMB.button;
|
||||
EvdevPostButtonEvent(pInfo, mapped_id,
|
||||
(id >= 0) ? BUTTON_PRESS : BUTTON_RELEASE);
|
||||
pEvdev->emulateMB.state =
|
||||
stateTab[pEvdev->emulateMB.state][4][2];
|
||||
@@ -200,7 +208,11 @@ EvdevMBEmuTimer(InputInfoPtr pInfo)
|
||||
pEvdev->emulateMB.state);
|
||||
}
|
||||
|
||||
xf86UnblockSIGIO (sigstate);
|
||||
#if HAVE_THREADED_INPUT
|
||||
input_unlock();
|
||||
#else
|
||||
xf86UnblockSIGIO(sigstate);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -219,6 +231,7 @@ EvdevMBEmuFilterEvent(InputInfoPtr pInfo, int button, BOOL press)
|
||||
{
|
||||
EvdevPtr pEvdev = pInfo->private;
|
||||
int id;
|
||||
int mapped_id;
|
||||
int *btstate;
|
||||
int ret = FALSE;
|
||||
|
||||
@@ -237,7 +250,10 @@ EvdevMBEmuFilterEvent(InputInfoPtr pInfo, int button, BOOL press)
|
||||
|
||||
if ((id = stateTab[pEvdev->emulateMB.state][*btstate][0]) != 0)
|
||||
{
|
||||
EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
|
||||
mapped_id = abs(id);
|
||||
if (mapped_id == 2)
|
||||
mapped_id = pEvdev->emulateMB.button;
|
||||
EvdevQueueButtonEvent(pInfo, mapped_id, (id >= 0));
|
||||
ret = TRUE;
|
||||
}
|
||||
if ((id = stateTab[pEvdev->emulateMB.state][*btstate][1]) != 0)
|
||||
@@ -261,9 +277,7 @@ EvdevMBEmuFilterEvent(InputInfoPtr pInfo, int button, BOOL press)
|
||||
}
|
||||
|
||||
|
||||
void EvdevMBEmuWakeupHandler(pointer data,
|
||||
int i,
|
||||
pointer LastSelectMask)
|
||||
void EvdevMBEmuWakeupHandler(WAKEUP_HANDLER_ARGS)
|
||||
{
|
||||
InputInfoPtr pInfo = (InputInfoPtr)data;
|
||||
EvdevPtr pEvdev = (EvdevPtr)pInfo->private;
|
||||
@@ -277,9 +291,7 @@ void EvdevMBEmuWakeupHandler(pointer data,
|
||||
}
|
||||
}
|
||||
|
||||
void EvdevMBEmuBlockHandler(pointer data,
|
||||
struct timeval **waitTime,
|
||||
pointer LastSelectMask)
|
||||
void EvdevMBEmuBlockHandler(BLOCK_HANDLER_ARGS)
|
||||
{
|
||||
InputInfoPtr pInfo = (InputInfoPtr) data;
|
||||
EvdevPtr pEvdev= (EvdevPtr) pInfo->private;
|
||||
@@ -298,12 +310,23 @@ void
|
||||
EvdevMBEmuPreInit(InputInfoPtr pInfo)
|
||||
{
|
||||
EvdevPtr pEvdev = (EvdevPtr)pInfo->private;
|
||||
int bt;
|
||||
|
||||
pEvdev->emulateMB.enabled = xf86SetBoolOption(pInfo->options,
|
||||
"Emulate3Buttons",
|
||||
FALSE);
|
||||
pEvdev->emulateMB.timeout = xf86SetIntOption(pInfo->options,
|
||||
"Emulate3Timeout", 50);
|
||||
bt = xf86SetIntOption(pInfo->options, "Emulate3Button", 2);
|
||||
if (bt < 0 || bt > EVDEV_MAXBUTTONS) {
|
||||
xf86IDrvMsg(pInfo, X_WARNING, "Invalid Emulate3Button value: %d\n",
|
||||
bt);
|
||||
xf86IDrvMsg(pInfo, X_WARNING, "Middle button emulation disabled.\n");
|
||||
|
||||
pEvdev->emulateMB.enabled = FALSE;
|
||||
}
|
||||
|
||||
pEvdev->emulateMB.button = bt;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -335,6 +358,7 @@ EvdevMBEmuSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
|
||||
{
|
||||
InputInfoPtr pInfo = dev->public.devicePrivate;
|
||||
EvdevPtr pEvdev = pInfo->private;
|
||||
int bt;
|
||||
|
||||
if (atom == prop_mbemu)
|
||||
{
|
||||
@@ -350,6 +374,18 @@ EvdevMBEmuSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
|
||||
|
||||
if (!checkonly)
|
||||
pEvdev->emulateMB.timeout = *((CARD32*)val->data);
|
||||
} else if (atom == prop_mbbuton)
|
||||
{
|
||||
if (val->format != 8 || val->size != 1 || val->type != XA_INTEGER)
|
||||
return BadMatch;
|
||||
|
||||
bt = *((CARD8*)val->data);
|
||||
|
||||
if (bt < 0 || bt > EVDEV_MAXBUTTONS)
|
||||
return BadValue;
|
||||
|
||||
if (!checkonly)
|
||||
pEvdev->emulateMB.button = bt;
|
||||
}
|
||||
|
||||
return Success;
|
||||
@@ -387,5 +423,15 @@ EvdevMBEmuInitProperty(DeviceIntPtr dev)
|
||||
return;
|
||||
XISetDevicePropertyDeletable(dev, prop_mbtimeout, FALSE);
|
||||
|
||||
prop_mbbuton = MakeAtom(EVDEV_PROP_MIDBUTTON_BUTTON,
|
||||
strlen(EVDEV_PROP_MIDBUTTON_BUTTON),
|
||||
TRUE);
|
||||
rc = XIChangeDeviceProperty(dev, prop_mbbuton, XA_INTEGER, 8, PropModeReplace, 1,
|
||||
&pEvdev->emulateMB.button, FALSE);
|
||||
|
||||
if (rc != Success)
|
||||
return;
|
||||
XISetDevicePropertyDeletable(dev, prop_mbbuton, FALSE);
|
||||
|
||||
XIRegisterPropertyHandler(dev, EvdevMBEmuSetProperty, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -89,12 +89,19 @@ Evdev3BEmuTimer(OsTimerPtr timer, CARD32 time, pointer arg)
|
||||
InputInfoPtr pInfo = (InputInfoPtr)arg;
|
||||
EvdevPtr pEvdev = pInfo->private;
|
||||
struct emulate3B *emu3B = &pEvdev->emulate3B;
|
||||
int sigstate = 0;
|
||||
|
||||
sigstate = xf86BlockSIGIO ();
|
||||
#if HAVE_THREADED_INPUT
|
||||
input_lock();
|
||||
#else
|
||||
int sigstate = xf86BlockSIGIO();
|
||||
#endif
|
||||
emu3B->state = EM3B_EMULATING;
|
||||
Evdev3BEmuPostButtonEvent(pInfo, emu3B->button, BUTTON_PRESS);
|
||||
xf86UnblockSIGIO (sigstate);
|
||||
#if HAVE_THREADED_INPUT
|
||||
input_unlock();
|
||||
#else
|
||||
xf86UnblockSIGIO(sigstate);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
15
src/evdev.c
15
src/evdev.c
@@ -784,7 +784,6 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
|
||||
|
||||
if (ev->code >= ABS_MT_SLOT) {
|
||||
EvdevProcessTouchEvent(pInfo, ev);
|
||||
pEvdev->abs_queued = 1;
|
||||
} else if (!pEvdev->mt_mask) {
|
||||
map = pEvdev->abs_axis_map[ev->code];
|
||||
|
||||
@@ -796,6 +795,7 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
|
||||
pEvdev->rel_queued = 1;
|
||||
}
|
||||
} else {
|
||||
valuator_mask_set(pEvdev->abs_vals, map, value);
|
||||
pEvdev->abs_queued = 1;
|
||||
}
|
||||
}
|
||||
@@ -1107,6 +1107,7 @@ EvdevKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl)
|
||||
InputInfoPtr pInfo;
|
||||
struct input_event ev[ArrayLength(bits) + 1];
|
||||
int i;
|
||||
int rc;
|
||||
|
||||
memset(ev, 0, sizeof(ev));
|
||||
|
||||
@@ -1121,7 +1122,9 @@ EvdevKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl)
|
||||
ev[i].code = SYN_REPORT;
|
||||
ev[i].value = 0;
|
||||
|
||||
write(pInfo->fd, ev, sizeof ev);
|
||||
rc = write(pInfo->fd, ev, sizeof ev);
|
||||
if (rc != sizeof ev)
|
||||
xf86IDrvMsg(pInfo, X_ERROR, "Failed to set keyboard controls: %s\n", strerror(errno));
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -1234,7 +1237,7 @@ EvdevCountMTAxes(EvdevPtr pEvdev, int *num_mt_axes_total,
|
||||
return;
|
||||
|
||||
/* Absolute multitouch axes: adjust mapping and axes counts. */
|
||||
for (axis = ABS_MT_SLOT; axis < ABS_MAX; axis++)
|
||||
for (axis = ABS_MT_SLOT; axis <= ABS_MAX; axis++)
|
||||
{
|
||||
int j;
|
||||
Bool skip = FALSE;
|
||||
@@ -1284,7 +1287,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes)
|
||||
goto out;
|
||||
|
||||
/* Find number of absolute axis, including MT ones, will decrease later. */
|
||||
for (i = 0; i < ABS_MAX; i++)
|
||||
for (i = 0; i <= ABS_MAX; i++)
|
||||
if (libevdev_has_event_code(pEvdev->dev, EV_ABS, i))
|
||||
num_axes++;
|
||||
|
||||
@@ -1452,7 +1455,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes)
|
||||
}
|
||||
|
||||
for (i = 0; i < num_touches; i++) {
|
||||
for (axis = ABS_MT_TOUCH_MAJOR; axis < ABS_MAX; axis++) {
|
||||
for (axis = ABS_MT_TOUCH_MAJOR; axis <= ABS_MAX; axis++) {
|
||||
if (pEvdev->abs_axis_map[axis] >= 0) {
|
||||
int val = pEvdev->mtdev ? 0 : libevdev_get_current_slot(pEvdev->dev);
|
||||
/* XXX: read initial values from mtdev when it adds support
|
||||
@@ -1665,7 +1668,7 @@ EvdevAddRelValuatorClass(DeviceIntPtr device, int num_scroll_axes)
|
||||
if (!libevdev_has_event_type(pEvdev->dev, EV_REL))
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < REL_MAX; i++) {
|
||||
for (i = 0; i <= REL_MAX; i++) {
|
||||
if (i == REL_WHEEL || i == REL_HWHEEL || i == REL_DIAL)
|
||||
continue;
|
||||
|
||||
|
||||
17
src/evdev.h
17
src/evdev.h
@@ -67,6 +67,18 @@
|
||||
#define LogMessageVerbSigSafe xf86MsgVerb
|
||||
#endif
|
||||
|
||||
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 23
|
||||
#define HAVE_THREADED_INPUT 1
|
||||
#endif
|
||||
|
||||
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 24
|
||||
#define BLOCK_HANDLER_ARGS void *data, void *waitTime
|
||||
#define WAKEUP_HANDLER_ARGS void *data, int i
|
||||
#else
|
||||
#define BLOCK_HANDLER_ARGS pointer data, struct timeval **waitTime, pointer LastSelectMask
|
||||
#define WAKEUP_HANDLER_ARGS void *data, int i, pointer LastSelectMask
|
||||
#endif
|
||||
|
||||
#define EVDEV_MAXBUTTONS 32
|
||||
#define EVDEV_MAXQUEUE 32
|
||||
|
||||
@@ -184,6 +196,7 @@ typedef struct {
|
||||
int state; /* state machine (see bt3emu.c) */
|
||||
Time expires; /* time of expiry */
|
||||
Time timeout;
|
||||
uint8_t button; /* phys button to emit */
|
||||
} emulateMB;
|
||||
/* Third mouse button emulation */
|
||||
struct emulate3B {
|
||||
@@ -260,8 +273,8 @@ unsigned int EvdevUtilButtonEventToButtonNumber(EvdevPtr pEvdev, int code);
|
||||
/* Middle Button emulation */
|
||||
int EvdevMBEmuTimer(InputInfoPtr);
|
||||
BOOL EvdevMBEmuFilterEvent(InputInfoPtr, int, BOOL);
|
||||
void EvdevMBEmuWakeupHandler(pointer, int, pointer);
|
||||
void EvdevMBEmuBlockHandler(pointer, struct timeval**, pointer);
|
||||
void EvdevMBEmuWakeupHandler(WAKEUP_HANDLER_ARGS);
|
||||
void EvdevMBEmuBlockHandler(BLOCK_HANDLER_ARGS);
|
||||
void EvdevMBEmuPreInit(InputInfoPtr);
|
||||
void EvdevMBEmuOn(InputInfoPtr);
|
||||
void EvdevMBEmuFinalize(InputInfoPtr);
|
||||
|
||||
Reference in New Issue
Block a user