[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 8/9] input-linux: refine mouse detection
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PULL v2 8/9] input-linux: refine mouse detection |
Date: |
Wed, 13 Apr 2016 17:45:02 +0200 |
Read absolute and relative axis information, only classify
devices as mouse/tablet in case the x axis is present.
Signed-off-by: Gerd Hoffmann <address@hidden>
---
ui/input-linux.c | 30 +++++++++++++++++++++++++-----
1 file changed, 25 insertions(+), 5 deletions(-)
diff --git a/ui/input-linux.c b/ui/input-linux.c
index 9c921cc..1d33b5c 100644
--- a/ui/input-linux.c
+++ b/ui/input-linux.c
@@ -337,7 +337,7 @@ static void input_linux_event_mouse(void *opaque)
static void input_linux_complete(UserCreatable *uc, Error **errp)
{
InputLinux *il = INPUT_LINUX(uc);
- uint32_t evtmap;
+ uint32_t evtmap, relmap, absmap;
int rc, ver;
if (!il->evdev) {
@@ -359,16 +359,36 @@ static void input_linux_complete(UserCreatable *uc, Error
**errp)
}
rc = ioctl(il->fd, EVIOCGBIT(0, sizeof(evtmap)), &evtmap);
+ if (rc < 0) {
+ error_setg(errp, "%s: failed to read event bits", il->evdev);
+ goto err_close;
+ }
if (evtmap & (1 << EV_REL)) {
- /* has relative axis -> assume mouse */
+ rc = ioctl(il->fd, EVIOCGBIT(EV_REL, sizeof(relmap)), &relmap);
+ if (rc < 0) {
+ relmap = 0;
+ }
+ }
+
+ if (evtmap & (1 << EV_ABS)) {
+ ioctl(il->fd, EVIOCGBIT(EV_ABS, sizeof(absmap)), &absmap);
+ if (rc < 0) {
+ absmap = 0;
+ }
+ }
+
+ if ((evtmap & (1 << EV_REL)) &&
+ (relmap & (1 << REL_X))) {
+ /* has relative x axis -> assume mouse */
qemu_set_fd_handler(il->fd, input_linux_event_mouse, NULL, il);
- } else if (evtmap & (1 << EV_ABS)) {
- /* has absolute axis -> not supported */
+ } else if ((evtmap & (1 << EV_ABS)) &&
+ (absmap & (1 << ABS_X))) {
+ /* has absolute x axis -> not supported */
error_setg(errp, "tablet/touchscreen not supported");
goto err_close;
} else if (evtmap & (1 << EV_KEY)) {
- /* has keys/buttons (and no axis) -> assume keyboard */
+ /* has keys/buttons (and no x axis) -> assume keyboard */
qemu_set_fd_handler(il->fd, input_linux_event_keyboard, NULL, il);
} else {
/* Huh? What is this? */
--
1.8.3.1
- [Qemu-devel] [PULL v2 0/9] virtio-input; live migration support, various bugfixes, Gerd Hoffmann, 2016/04/13
- [Qemu-devel] [PULL v2 7/9] virtio-input: fix emulated tablet axis ranges, Gerd Hoffmann, 2016/04/13
- [Qemu-devel] [PULL v2 9/9] virtio-input: support absolute axis config in pass-through, Gerd Hoffmann, 2016/04/13
- [Qemu-devel] [PULL v2 6/9] virtio-input: add live migration support, Gerd Hoffmann, 2016/04/13
- [Qemu-devel] [PULL v2 2/9] move const_le{16, 23} to qemu/bswap.h, add comment, Gerd Hoffmann, 2016/04/13
- [Qemu-devel] [PULL v2 1/9] virtio-input: add parenthesis to const_le{16, 32}, Gerd Hoffmann, 2016/04/13
- [Qemu-devel] [PULL v2 3/9] virtio-input: add missing key mappings, Gerd Hoffmann, 2016/04/13
- [Qemu-devel] [PULL v2 8/9] input-linux: refine mouse detection,
Gerd Hoffmann <=
- [Qemu-devel] [PULL v2 5/9] virtio-input: implement pass-through evdev writes, Gerd Hoffmann, 2016/04/13
- [Qemu-devel] [PULL v2 4/9] virtio-input: retrieve EV_LED host config bits, Gerd Hoffmann, 2016/04/13
- Re: [Qemu-devel] [PULL v2 0/9] virtio-input; live migration support, various bugfixes, Peter Maydell, 2016/04/14