[PATCH evdev 1/2] Force x/y axes to exist on devices with any other axes (#44655)
Chase Douglas
chase.douglas at canonical.com
Fri Jan 13 00:00:02 PST 2012
On 01/13/2012 01:18 AM, Peter Hutterer wrote:
> Too much in the server relies on x/y to exist and to be axes 0 and 1. So if
> any relative axes exist, initialize REL_X/Y or ABS_X/Y as well.
>
> For servers up to 1.11: a scrollwheel-only device now has relative axes
> where it only had buttons before.
>
> For servers 1.12 or later: the device now has x/y in addition to the scroll
> axes.
>
> X.Org Bug 44655 <http://bugs.freedesktop.org/show_bug.cgi?id=44655>
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> src/evdev.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 43 insertions(+), 0 deletions(-)
>
> diff --git a/src/evdev.c b/src/evdev.c
> index 989a255..68e3c75 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -1958,6 +1958,38 @@ EvdevGrabDevice(InputInfoPtr pInfo, int grab, int ungrab)
> return TRUE;
> }
>
> +/**
> + * Some devices only have other axes (e.g. wheels), but we
> + * still need x/y for these. The server relies on devices having
> + * x/y as axes 0/1 and core/XI 1.x clients expect it too (#44655)
> + */
> +static void
> +EvdevForceXY(InputInfoPtr pInfo, int mode)
> +{
> + EvdevPtr pEvdev = pInfo->private;
> +
> + xf86IDrvMsg(pInfo, X_INFO, "Forcing %s x/y axes to exist.\n",
> + (mode == Relative) ? "relative" : "absolute");
> +
> + if (mode == Relative)
> + {
> + EvdevSetBit(pEvdev->rel_bitmask, REL_X);
> + EvdevSetBit(pEvdev->rel_bitmask, REL_Y);
> + } else if (mode == Absolute)
> + {
> + EvdevSetBit(pEvdev->abs_bitmask, ABS_X);
> + EvdevSetBit(pEvdev->abs_bitmask, ABS_Y);
> + pEvdev->absinfo[ABS_X].minimum = 0;
> + pEvdev->absinfo[ABS_X].maximum = 1000;
> + pEvdev->absinfo[ABS_X].value = 0;
> + pEvdev->absinfo[ABS_X].resolution = 0;
> + pEvdev->absinfo[ABS_Y].minimum = 0;
> + pEvdev->absinfo[ABS_Y].maximum = 1000;
> + pEvdev->absinfo[ABS_Y].value = 0;
> + pEvdev->absinfo[ABS_Y].resolution = 0;
> + }
> +}
> +
> static int
> EvdevProbe(InputInfoPtr pInfo)
> {
> @@ -2043,6 +2075,8 @@ EvdevProbe(InputInfoPtr pInfo)
> pEvdev->num_buttons = num_buttons;
> }
>
> + EvdevForceXY(pInfo, Relative);
> +
> if (!ignore_rel)
> {
> xf86IDrvMsg(pInfo, X_PROBED, "Found relative axes\n");
> @@ -2116,7 +2150,16 @@ EvdevProbe(InputInfoPtr pInfo)
> pEvdev->flags |= EVDEV_TOUCHSCREEN;
> pEvdev->flags |= EVDEV_BUTTON_EVENTS;
> }
> + } else {
> +#ifdef MULTITOUCH
> + if (!EvdevBitIsSet(pEvdev->abs_bitmask, ABS_MT_POSITION_X) ||
> + !EvdevBitIsSet(pEvdev->abs_bitmask, ABS_MT_POSITION_Y))
> +#endif
> + EvdevForceXY(pInfo, Absolute);
> }
> +
> +
> +
> }
>
> for (i = 0; i < BTN_MISC; i++) {
What ensures that the X and Y values of events are set for events? Or,
how are events delivered in the server if X and Y are always 0?
-- Chase
More information about the xorg-devel
mailing list