mirror of
https://github.com/X11Libre/xf86-input-evdev.git
synced 2026-04-14 11:44:16 +00:00
Compare commits
13 Commits
xf86-input
...
xf86-input
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e41befa83f | ||
|
|
34619347b7 | ||
|
|
1a031657b9 | ||
|
|
51575b60b1 | ||
|
|
f285567d37 | ||
|
|
af1d085877 | ||
|
|
8a9b1ec6b5 | ||
|
|
356565111a | ||
|
|
fff3a60fbf | ||
|
|
8f209ac60d | ||
|
|
a0d41af896 | ||
|
|
dea1d1a390 | ||
|
|
b59a1a25da |
@@ -23,7 +23,7 @@
|
||||
# Initialize Autoconf
|
||||
AC_PREREQ([2.60])
|
||||
AC_INIT([xf86-input-evdev],
|
||||
[2.8.0],
|
||||
[2.8.3],
|
||||
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
|
||||
[xf86-input-evdev])
|
||||
AC_CONFIG_SRCDIR([Makefile.am])
|
||||
|
||||
@@ -220,6 +220,12 @@ is mapped to the negative Y axis motion and button number
|
||||
.I N2
|
||||
is mapped to the positive Y axis motion. Default: "4 5". Property:
|
||||
"Evdev Wheel Emulation Axes".
|
||||
.TP 7
|
||||
.BI "Option \*qTypeName\*q \*q"type"\*q
|
||||
Specify the X Input 1.x type (see XListInputDevices(__libmansuffix__)).
|
||||
There is rarely a need to use this option, evdev will guess the device type
|
||||
based on the device's capabilities. This option is provided for devices that
|
||||
need quirks.
|
||||
|
||||
.SH SUPPORTED PROPERTIES
|
||||
The following properties are provided by the
|
||||
|
||||
@@ -97,7 +97,6 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
|
||||
EvdevPtr pEvdev = (EvdevPtr)pInfo->private;
|
||||
WheelAxisPtr pAxis = NULL, pOtherAxis = NULL;
|
||||
int value = pEv->value;
|
||||
int oldValue;
|
||||
|
||||
/* Has wheel emulation been configured to be enabled? */
|
||||
if (!pEvdev->emulateWheel.enabled)
|
||||
@@ -118,9 +117,13 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
|
||||
/* We don't want to intercept real mouse wheel events */
|
||||
if(pEv->type == EV_ABS) {
|
||||
int axis = pEvdev->abs_axis_map[pEv->code];
|
||||
oldValue = valuator_mask_get(pEvdev->vals, axis);
|
||||
valuator_mask_set(pEvdev->vals, axis, value);
|
||||
value -= oldValue; /* make value into a differential measurement */
|
||||
int oldValue;
|
||||
|
||||
if (axis > -1 && valuator_mask_fetch(pEvdev->old_vals, axis, &oldValue)) {
|
||||
valuator_mask_set(pEvdev->vals, axis, value);
|
||||
value -= oldValue; /* make value into a differential measurement */
|
||||
} else
|
||||
value = 0; /* avoid a jump on the first touch */
|
||||
}
|
||||
|
||||
switch(pEv->code) {
|
||||
@@ -392,7 +395,7 @@ EvdevWheelEmuSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
|
||||
|
||||
inertia = *((CARD16*)val->data);
|
||||
|
||||
if (inertia < 0)
|
||||
if (inertia <= 0)
|
||||
return BadValue;
|
||||
|
||||
if (!checkonly)
|
||||
|
||||
104
src/evdev.c
104
src/evdev.c
@@ -96,7 +96,7 @@
|
||||
|
||||
static const char *evdevDefaults[] = {
|
||||
"XkbRules", "evdev",
|
||||
"XkbModel", "evdev",
|
||||
"XkbModel", "pc104", /* the right model for 'us' */
|
||||
"XkbLayout", "us",
|
||||
NULL
|
||||
};
|
||||
@@ -493,31 +493,39 @@ EvdevProcessValuators(InputInfoPtr pInfo)
|
||||
EvdevPtr pEvdev = pInfo->private;
|
||||
int *delta = pEvdev->delta;
|
||||
|
||||
/* convert to relative motion for touchpads */
|
||||
if (pEvdev->abs_queued && (pEvdev->flags & EVDEV_RELATIVE_MODE)) {
|
||||
if (pEvdev->in_proximity) {
|
||||
if (valuator_mask_isset(pEvdev->vals, 0))
|
||||
{
|
||||
if (valuator_mask_isset(pEvdev->old_vals, 0))
|
||||
delta[REL_X] = valuator_mask_get(pEvdev->vals, 0) -
|
||||
valuator_mask_get(pEvdev->old_vals, 0);
|
||||
valuator_mask_set(pEvdev->old_vals, 0,
|
||||
valuator_mask_get(pEvdev->vals, 0));
|
||||
}
|
||||
if (valuator_mask_isset(pEvdev->vals, 1))
|
||||
{
|
||||
if (valuator_mask_isset(pEvdev->old_vals, 1))
|
||||
delta[REL_Y] = valuator_mask_get(pEvdev->vals, 1) -
|
||||
valuator_mask_get(pEvdev->old_vals, 1);
|
||||
valuator_mask_set(pEvdev->old_vals, 1,
|
||||
valuator_mask_get(pEvdev->vals, 1));
|
||||
if (pEvdev->abs_queued) {
|
||||
/* convert to relative motion for touchpads */
|
||||
if (pEvdev->flags & EVDEV_RELATIVE_MODE) {
|
||||
if (pEvdev->in_proximity) {
|
||||
if (valuator_mask_isset(pEvdev->vals, 0))
|
||||
{
|
||||
if (valuator_mask_isset(pEvdev->old_vals, 0))
|
||||
delta[REL_X] = valuator_mask_get(pEvdev->vals, 0) -
|
||||
valuator_mask_get(pEvdev->old_vals, 0);
|
||||
valuator_mask_set(pEvdev->old_vals, 0,
|
||||
valuator_mask_get(pEvdev->vals, 0));
|
||||
}
|
||||
if (valuator_mask_isset(pEvdev->vals, 1))
|
||||
{
|
||||
if (valuator_mask_isset(pEvdev->old_vals, 1))
|
||||
delta[REL_Y] = valuator_mask_get(pEvdev->vals, 1) -
|
||||
valuator_mask_get(pEvdev->old_vals, 1);
|
||||
valuator_mask_set(pEvdev->old_vals, 1,
|
||||
valuator_mask_get(pEvdev->vals, 1));
|
||||
}
|
||||
} else {
|
||||
valuator_mask_zero(pEvdev->old_vals);
|
||||
}
|
||||
valuator_mask_zero(pEvdev->vals);
|
||||
pEvdev->abs_queued = 0;
|
||||
pEvdev->rel_queued = 1;
|
||||
} else {
|
||||
valuator_mask_zero(pEvdev->old_vals);
|
||||
int val;
|
||||
if (valuator_mask_fetch(pEvdev->vals, 0, &val))
|
||||
valuator_mask_set(pEvdev->old_vals, 0, val);
|
||||
if (valuator_mask_fetch(pEvdev->vals, 1, &val))
|
||||
valuator_mask_set(pEvdev->old_vals, 1, val);
|
||||
}
|
||||
valuator_mask_zero(pEvdev->vals);
|
||||
pEvdev->abs_queued = 0;
|
||||
pEvdev->rel_queued = 1;
|
||||
}
|
||||
|
||||
if (pEvdev->rel_queued) {
|
||||
@@ -1157,7 +1165,7 @@ EvdevKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl)
|
||||
};
|
||||
|
||||
InputInfoPtr pInfo;
|
||||
struct input_event ev[ArrayLength(bits)];
|
||||
struct input_event ev[ArrayLength(bits) + 1];
|
||||
int i;
|
||||
|
||||
memset(ev, 0, sizeof(ev));
|
||||
@@ -1169,6 +1177,10 @@ EvdevKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl)
|
||||
ev[i].value = (ctrl->leds & bits[i].xbit) > 0;
|
||||
}
|
||||
|
||||
ev[i].type = EV_SYN;
|
||||
ev[i].code = SYN_REPORT;
|
||||
ev[i].value = 0;
|
||||
|
||||
write(pInfo->fd, ev, sizeof ev);
|
||||
}
|
||||
|
||||
@@ -1267,7 +1279,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int want_scroll_axes)
|
||||
for (j = 0; j < ArrayLength(mt_axis_mappings); j++)
|
||||
{
|
||||
if (mt_axis_mappings[j].mt_code == axis &&
|
||||
BitIsOn(pEvdev->abs_bitmask, mt_axis_mappings[j].code))
|
||||
EvdevBitIsSet(pEvdev->abs_bitmask, mt_axis_mappings[j].code))
|
||||
{
|
||||
mt_axis_mappings[j].needs_mapping = TRUE;
|
||||
skip = TRUE;
|
||||
@@ -1283,6 +1295,15 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int want_scroll_axes)
|
||||
num_axes--;
|
||||
}
|
||||
}
|
||||
|
||||
/* device only has mt-axes. the kernel should give us ABS_X etc for
|
||||
backwards compat but some devices don't have it. */
|
||||
if (num_axes == 0 && num_mt_axes > 0) {
|
||||
xf86IDrvMsg(pInfo, X_ERROR,
|
||||
"found only multitouch-axes. That shouldn't happen.\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SMOOTH_SCROLLING
|
||||
@@ -1675,7 +1696,7 @@ EvdevAddRelValuatorClass(DeviceIntPtr device)
|
||||
if (axis == REL_WHEEL)
|
||||
SetScrollValuator(device, axnum, SCROLL_TYPE_VERTICAL, -1.0, SCROLL_FLAG_PREFERRED);
|
||||
else if (axis == REL_DIAL)
|
||||
SetScrollValuator(device, axnum, SCROLL_TYPE_VERTICAL, -1.0, SCROLL_FLAG_NONE);
|
||||
SetScrollValuator(device, axnum, SCROLL_TYPE_HORIZONTAL, 1.0, SCROLL_FLAG_NONE);
|
||||
else if (axis == REL_HWHEEL)
|
||||
SetScrollValuator(device, axnum, SCROLL_TYPE_HORIZONTAL, 1.0, SCROLL_FLAG_NONE);
|
||||
#endif
|
||||
@@ -1974,12 +1995,10 @@ EvdevCache(InputInfoPtr pInfo)
|
||||
int i, len;
|
||||
struct input_id id;
|
||||
|
||||
char name[1024] = {0};
|
||||
unsigned long bitmask[NLONGS(EV_CNT)] = {0};
|
||||
unsigned long key_bitmask[NLONGS(KEY_CNT)] = {0};
|
||||
unsigned long rel_bitmask[NLONGS(REL_CNT)] = {0};
|
||||
unsigned long abs_bitmask[NLONGS(ABS_CNT)] = {0};
|
||||
unsigned long led_bitmask[NLONGS(LED_CNT)] = {0};
|
||||
|
||||
|
||||
if (ioctl(pInfo->fd, EVIOCGID, &id) < 0)
|
||||
@@ -1991,13 +2010,6 @@ EvdevCache(InputInfoPtr pInfo)
|
||||
pEvdev->id_vendor = id.vendor;
|
||||
pEvdev->id_product = id.product;
|
||||
|
||||
if (ioctl(pInfo->fd, EVIOCGNAME(sizeof(name) - 1), name) < 0) {
|
||||
xf86IDrvMsg(pInfo, X_ERROR, "ioctl EVIOCGNAME failed: %s\n", strerror(errno));
|
||||
goto error;
|
||||
}
|
||||
|
||||
strcpy(pEvdev->name, name);
|
||||
|
||||
len = ioctl(pInfo->fd, EVIOCGBIT(0, sizeof(bitmask)), bitmask);
|
||||
if (len < 0) {
|
||||
xf86IDrvMsg(pInfo, X_ERROR, "ioctl EVIOCGBIT for bitmask failed: %s\n",
|
||||
@@ -2025,15 +2037,6 @@ EvdevCache(InputInfoPtr pInfo)
|
||||
|
||||
memcpy(pEvdev->abs_bitmask, abs_bitmask, len);
|
||||
|
||||
len = ioctl(pInfo->fd, EVIOCGBIT(EV_LED, sizeof(led_bitmask)), led_bitmask);
|
||||
if (len < 0) {
|
||||
xf86IDrvMsg(pInfo, X_ERROR, "ioctl EVIOCGBIT for EV_LED failed: %s\n",
|
||||
strerror(errno));
|
||||
goto error;
|
||||
}
|
||||
|
||||
memcpy(pEvdev->led_bitmask, led_bitmask, len);
|
||||
|
||||
/*
|
||||
* Do not try to validate absinfo data since it is not expected
|
||||
* to be static, always refresh it in evdev structure.
|
||||
@@ -2548,6 +2551,9 @@ EvdevUnInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
|
||||
/* Release string allocated in EvdevOpenDevice. */
|
||||
free(pEvdev->device);
|
||||
pEvdev->device = NULL;
|
||||
|
||||
free(pEvdev->type_name);
|
||||
pEvdev->type_name = NULL;
|
||||
}
|
||||
xf86DeleteInput(pInfo, flags);
|
||||
}
|
||||
@@ -2579,6 +2585,8 @@ EvdevAlloc(void)
|
||||
pEvdev->rel_axis_map[0] = 0;
|
||||
pEvdev->rel_axis_map[1] = 1;
|
||||
|
||||
pEvdev->type_name = NULL;
|
||||
|
||||
return pEvdev;
|
||||
}
|
||||
|
||||
@@ -2623,6 +2631,14 @@ EvdevPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Overwrite type_name with custom-defined one (#62831).
|
||||
Note: pInfo->type_name isn't freed so we need to manually do this
|
||||
*/
|
||||
pEvdev->type_name = xf86SetStrOption(pInfo->options,
|
||||
"TypeName",
|
||||
pInfo->type_name);
|
||||
pInfo->type_name = pEvdev->type_name;
|
||||
|
||||
EvdevAddDevice(pInfo);
|
||||
|
||||
if (pEvdev->flags & EVDEV_BUTTON_EVENTS)
|
||||
|
||||
@@ -235,12 +235,10 @@ typedef struct {
|
||||
OsTimerPtr reopen_timer;
|
||||
|
||||
/* Cached info from device. */
|
||||
char name[1024];
|
||||
unsigned long bitmask[NLONGS(EV_CNT)];
|
||||
unsigned long key_bitmask[NLONGS(KEY_CNT)];
|
||||
unsigned long rel_bitmask[NLONGS(REL_CNT)];
|
||||
unsigned long abs_bitmask[NLONGS(ABS_CNT)];
|
||||
unsigned long led_bitmask[NLONGS(LED_CNT)];
|
||||
struct input_absinfo absinfo[ABS_CNT];
|
||||
|
||||
/* minor/major number */
|
||||
@@ -251,6 +249,8 @@ typedef struct {
|
||||
EventQueueRec queue[EVDEV_MAXQUEUE];
|
||||
|
||||
enum fkeymode fkeymode;
|
||||
|
||||
char *type_name;
|
||||
} EvdevRec, *EvdevPtr;
|
||||
|
||||
/* Event posting functions */
|
||||
|
||||
Reference in New Issue
Block a user