mirror of
https://github.com/X11Libre/xf86-input-evdev.git
synced 2026-04-14 11:44:16 +00:00
Compare commits
8 Commits
release/25
...
xf86-input
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aff7228d97 | ||
|
|
c695234c5c | ||
|
|
79d4956add | ||
|
|
7e9809837c | ||
|
|
d07692a4af | ||
|
|
1073cd4fdc | ||
|
|
486bbdc481 | ||
|
|
73e5eba8cd |
@@ -22,7 +22,7 @@
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
AC_INIT([xf86-input-evdev],
|
||||
2.1.99.1,
|
||||
2.2.1,
|
||||
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
|
||||
xf86-input-evdev)
|
||||
|
||||
|
||||
52
src/evdev.c
52
src/evdev.c
@@ -263,8 +263,17 @@ PostKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value)
|
||||
static char warned[KEY_CNT];
|
||||
|
||||
/* Filter all repeated events from device.
|
||||
We'll do softrepeat in the server */
|
||||
if (value == 2)
|
||||
We'll do softrepeat in the server, but only since 1.6 */
|
||||
if (value == 2
|
||||
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) <= 2
|
||||
&& (ev->code == KEY_LEFTCTRL || ev->code == KEY_RIGHTCTRL ||
|
||||
ev->code == KEY_LEFTSHIFT || ev->code == KEY_RIGHTSHIFT ||
|
||||
ev->code == KEY_LEFTALT || ev->code == KEY_RIGHTALT ||
|
||||
ev->code == KEY_LEFTMETA || ev->code == KEY_RIGHTMETA ||
|
||||
ev->code == KEY_CAPSLOCK || ev->code == KEY_NUMLOCK ||
|
||||
ev->code == KEY_SCROLLLOCK) /* XXX windows keys? */
|
||||
#endif
|
||||
)
|
||||
return;
|
||||
|
||||
if (code > 255)
|
||||
@@ -333,6 +342,9 @@ EvdevReopenTimer(OsTimerPtr timer, CARD32 time, pointer arg)
|
||||
return 100; /* come back in 100 ms */
|
||||
}
|
||||
|
||||
#define ABS_X_VALUE 0x1
|
||||
#define ABS_Y_VALUE 0x2
|
||||
#define ABS_VALUE 0x4
|
||||
/**
|
||||
* Take one input event and process it accordingly.
|
||||
*/
|
||||
@@ -383,7 +395,12 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
|
||||
if (ev->code > ABS_MAX)
|
||||
break;
|
||||
pEvdev->vals[pEvdev->axis_map[ev->code]] = value;
|
||||
abs = 1;
|
||||
if (ev->code == ABS_X)
|
||||
abs |= ABS_X_VALUE;
|
||||
else if (ev->code == ABS_Y)
|
||||
abs |= ABS_Y_VALUE;
|
||||
else
|
||||
abs |= ABS_VALUE;
|
||||
break;
|
||||
|
||||
case EV_KEY:
|
||||
@@ -434,17 +451,20 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
|
||||
case EV_SYN:
|
||||
/* convert to relative motion for touchpads */
|
||||
if (abs && (pEvdev->flags & EVDEV_TOUCHPAD)) {
|
||||
abs = 0;
|
||||
if (pEvdev->tool) { /* meaning, touch is active */
|
||||
if (pEvdev->old_vals[0] != -1)
|
||||
delta[REL_X] = pEvdev->vals[0] - pEvdev->old_vals[0];
|
||||
if (pEvdev->old_vals[1] != -1)
|
||||
delta[REL_Y] = pEvdev->vals[1] - pEvdev->old_vals[1];
|
||||
pEvdev->old_vals[0] = pEvdev->vals[0];
|
||||
pEvdev->old_vals[1] = pEvdev->vals[1];
|
||||
if (abs & ABS_X_VALUE)
|
||||
pEvdev->old_vals[0] = pEvdev->vals[0];
|
||||
if (abs & ABS_Y_VALUE)
|
||||
pEvdev->old_vals[1] = pEvdev->vals[1];
|
||||
} else {
|
||||
pEvdev->old_vals[0] = pEvdev->old_vals[1] = -1;
|
||||
}
|
||||
abs = 0;
|
||||
rel = 1;
|
||||
}
|
||||
|
||||
if (rel) {
|
||||
@@ -527,6 +547,10 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
|
||||
}
|
||||
}
|
||||
|
||||
#undef ABS_X_VALUE
|
||||
#undef ABS_Y_VALUE
|
||||
#undef ABS_VALUE
|
||||
|
||||
/* just a magic number to reduce the number of reads */
|
||||
#define NUM_EVENTS 16
|
||||
|
||||
@@ -1126,12 +1150,17 @@ EvdevInitButtonMapping(InputInfoPtr pInfo)
|
||||
static int
|
||||
EvdevInit(DeviceIntPtr device)
|
||||
{
|
||||
int i;
|
||||
InputInfoPtr pInfo;
|
||||
EvdevPtr pEvdev;
|
||||
|
||||
pInfo = device->public.devicePrivate;
|
||||
pEvdev = pInfo->private;
|
||||
|
||||
/* clear all axis_map entries */
|
||||
for(i = 0; i < max(ABS_CNT,REL_CNT); i++)
|
||||
pEvdev->axis_map[i]=-1;
|
||||
|
||||
if (pEvdev->flags & EVDEV_KEYBOARD_EVENTS)
|
||||
EvdevAddKeyClass(device);
|
||||
if (pEvdev->flags & EVDEV_BUTTON_EVENTS)
|
||||
@@ -1462,9 +1491,9 @@ EvdevProbe(InputInfoPtr pInfo)
|
||||
TestBit(ABS_Y, pEvdev->abs_bitmask)) {
|
||||
xf86Msg(X_INFO, "%s: Found x and y absolute axes\n", pInfo->name);
|
||||
pEvdev->flags |= EVDEV_ABSOLUTE_EVENTS;
|
||||
if (!TestBit(ABS_PRESSURE, pEvdev->abs_bitmask) &&
|
||||
TestBit(BTN_TOUCH, pEvdev->key_bitmask)) {
|
||||
if (num_buttons) {
|
||||
if (TestBit(ABS_PRESSURE, pEvdev->abs_bitmask) ||
|
||||
TestBit(BTN_TOUCH, pEvdev->key_bitmask)) {
|
||||
if (num_buttons || TestBit(BTN_TOOL_FINGER, pEvdev->key_bitmask)) {
|
||||
xf86Msg(X_INFO, "%s: Found absolute touchpad\n", pInfo->name);
|
||||
pEvdev->flags |= EVDEV_TOUCHPAD;
|
||||
memset(pEvdev->old_vals, -1, sizeof(int) * pEvdev->num_vals);
|
||||
@@ -1490,7 +1519,10 @@ EvdevProbe(InputInfoPtr pInfo)
|
||||
if (has_axes && num_buttons) {
|
||||
pInfo->flags |= XI86_POINTER_CAPABLE | XI86_SEND_DRAG_EVENTS |
|
||||
XI86_CONFIGURED;
|
||||
if (TestBit(ABS_PRESSURE, pEvdev->abs_bitmask)) {
|
||||
if (pEvdev->flags & EVDEV_TOUCHPAD) {
|
||||
xf86Msg(X_INFO, "%s: Configuring as touchpad\n", pInfo->name);
|
||||
pInfo->type_name = XI_TOUCHPAD;
|
||||
} else if (TestBit(ABS_PRESSURE, pEvdev->abs_bitmask)) {
|
||||
xf86Msg(X_INFO, "%s: Configuring as tablet\n", pInfo->name);
|
||||
pInfo->type_name = XI_TABLET;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user