mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 04:43:53 +00:00
evdev: Extend EVIOCGRAB ioctl scope to cover sysmouse interface
of psm(4), ums(4) and sysmouse(4) drivers. EVIOCGRAB ioctl execution on /dev/input/event# device node gains exclusive access to this device to caller. It is used mostly for development purposes and remote control software. See e.g. https://reviews.freebsd.org/D30020 which is the reason of creation of this change. MFC after: 2 weeks Tested by: corvink Differential revision: https://reviews.freebsd.org/D30542
This commit is contained in:
parent
f556a05c49
commit
4a0db5e292
|
@ -5111,6 +5111,10 @@ psmsoftintr(void *arg)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Store last packet for reinjection if it has not been set already */
|
||||||
|
if (timevalisset(&sc->idletimeout) && sc->idlepacket.inputbytes == 0)
|
||||||
|
sc->idlepacket = *pb;
|
||||||
|
|
||||||
#ifdef EVDEV_SUPPORT
|
#ifdef EVDEV_SUPPORT
|
||||||
if (evdev_rcpt_mask & EVDEV_RCPT_HW_MOUSE &&
|
if (evdev_rcpt_mask & EVDEV_RCPT_HW_MOUSE &&
|
||||||
sc->hw.model != MOUSE_MODEL_ELANTECH &&
|
sc->hw.model != MOUSE_MODEL_ELANTECH &&
|
||||||
|
@ -5144,6 +5148,10 @@ psmsoftintr(void *arg)
|
||||||
evdev_push_mouse_btn(sc->evdev_r, ms.button);
|
evdev_push_mouse_btn(sc->evdev_r, ms.button);
|
||||||
evdev_sync(sc->evdev_r);
|
evdev_sync(sc->evdev_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((sc->evdev_a != NULL && evdev_is_grabbed(sc->evdev_a)) ||
|
||||||
|
(sc->evdev_r != NULL && evdev_is_grabbed(sc->evdev_r)))
|
||||||
|
goto next;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* scale values */
|
/* scale values */
|
||||||
|
@ -5164,10 +5172,6 @@ psmsoftintr(void *arg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store last packet for reinjection if it has not been set already */
|
|
||||||
if (timevalisset(&sc->idletimeout) && sc->idlepacket.inputbytes == 0)
|
|
||||||
sc->idlepacket = *pb;
|
|
||||||
|
|
||||||
ms.dx = x;
|
ms.dx = x;
|
||||||
ms.dy = y;
|
ms.dy = y;
|
||||||
ms.dz = z;
|
ms.dz = z;
|
||||||
|
|
|
@ -1094,6 +1094,17 @@ evdev_release_client(struct evdev_dev *evdev, struct evdev_client *client)
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
evdev_is_grabbed(struct evdev_dev *evdev)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* The function is intended to be called from evdev-unrelated parts of
|
||||||
|
* code like syscons-compatible parts of mouse and keyboard drivers.
|
||||||
|
* That makes unlocked read-only access acceptable.
|
||||||
|
*/
|
||||||
|
return (evdev->ev_grabber != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
evdev_repeat_callout(void *arg)
|
evdev_repeat_callout(void *arg)
|
||||||
{
|
{
|
||||||
|
|
|
@ -154,6 +154,7 @@ void evdev_set_repeat_params(struct evdev_dev *, uint16_t, int);
|
||||||
int evdev_set_report_size(struct evdev_dev *, size_t);
|
int evdev_set_report_size(struct evdev_dev *, size_t);
|
||||||
void evdev_set_flag(struct evdev_dev *, uint16_t);
|
void evdev_set_flag(struct evdev_dev *, uint16_t);
|
||||||
void *evdev_get_softc(struct evdev_dev *);
|
void *evdev_get_softc(struct evdev_dev *);
|
||||||
|
bool evdev_is_grabbed(struct evdev_dev *);
|
||||||
|
|
||||||
/* Multitouch related functions: */
|
/* Multitouch related functions: */
|
||||||
int evdev_mt_id_to_slot(struct evdev_dev *, int32_t);
|
int evdev_mt_id_to_slot(struct evdev_dev *, int32_t);
|
||||||
|
|
|
@ -295,6 +295,8 @@ sysmouse_event(mouse_info_t *info)
|
||||||
|
|
||||||
#ifdef EVDEV_SUPPORT
|
#ifdef EVDEV_SUPPORT
|
||||||
smdev_evdev_write(x, y, z, mouse_status.button);
|
smdev_evdev_write(x, y, z, mouse_status.button);
|
||||||
|
if (evdev_is_grabbed(sysmouse_evdev))
|
||||||
|
goto done;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!tty_opened(sysmouse_tty))
|
if (!tty_opened(sysmouse_tty))
|
||||||
|
|
|
@ -875,6 +875,10 @@ ums_put_queue(struct ums_softc *sc, int32_t dx, int32_t dy,
|
||||||
{
|
{
|
||||||
uint8_t buf[8];
|
uint8_t buf[8];
|
||||||
|
|
||||||
|
#ifdef EVDEV_SUPPORT
|
||||||
|
if (evdev_is_grabbed(sc->sc_evdev))
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
if (1) {
|
if (1) {
|
||||||
if (dx > 254)
|
if (dx > 254)
|
||||||
dx = 254;
|
dx = 254;
|
||||||
|
|
|
@ -249,6 +249,8 @@ sysmouse_process_event(mouse_info_t *mi)
|
||||||
|
|
||||||
#ifdef EVDEV_SUPPORT
|
#ifdef EVDEV_SUPPORT
|
||||||
sysmouse_evdev_store(x, y, z, sysmouse_status.button);
|
sysmouse_evdev_store(x, y, z, sysmouse_status.button);
|
||||||
|
if (evdev_is_grabbed(sysmouse_evdev))
|
||||||
|
goto done;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The first five bytes are compatible with MouseSystems. */
|
/* The first five bytes are compatible with MouseSystems. */
|
||||||
|
|
Loading…
Reference in a new issue