From 662594aeff9d1767316f08600949c73ac5060d18 Mon Sep 17 00:00:00 2001 From: Mikhail Gusarov Date: Thu, 29 Oct 2009 00:40:48 +0600 Subject: [PATCH] kdrive: Grab evdev mouse/keyboard devices when X server is active Input events are directed to both vt and input devices by default. Unless input devices are grabbed, keyboard events fill it vt buffers and cause spontaneous wakeups in kernel tty layer when buffers are full. Signed-off-by: Mikhail Gusarov Reviewed-by: Peter Hutterer Signed-off-by: Keith Packard --- hw/kdrive/linux/evdev.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/hw/kdrive/linux/evdev.c b/hw/kdrive/linux/evdev.c index f6017ba51..096a2ddc3 100644 --- a/hw/kdrive/linux/evdev.c +++ b/hw/kdrive/linux/evdev.c @@ -243,7 +243,9 @@ EvdevPtrEnable (KdPointerInfo *pi) if (fd < 0) return BadMatch; - + if (ioctl (fd, EVIOCGRAB, 1) < 0) + perror ("Grabbing evdev mouse device failed"); + if (ioctl (fd, EVIOCGBIT(0 /*EV*/, sizeof (ev)), ev) < 0) { perror ("EVIOCGBIT 0"); @@ -335,6 +337,10 @@ EvdevPtrDisable (KdPointerInfo *pi) return; KdUnregisterFd (pi, ke->fd, TRUE); + + if (ioctl (ke->fd, EVIOCGRAB, 0) < 0) + perror ("Ungrabbing evdev mouse device failed"); + xfree (ke); pi->driverPrivate = 0; } @@ -425,6 +431,9 @@ EvdevKbdEnable (KdKeyboardInfo *ki) if (fd < 0) return BadMatch; + if (ioctl (fd, EVIOCGRAB, 1) < 0) + perror ("Grabbing evdev keyboard device failed"); + if (ioctl (fd, EVIOCGBIT(0 /*EV*/, sizeof (ev)), ev) < 0) { perror ("EVIOCGBIT 0"); close (fd); @@ -496,6 +505,10 @@ EvdevKbdDisable (KdKeyboardInfo *ki) return; KdUnregisterFd (ki, ke->fd, TRUE); + + if (ioctl (ke->fd, EVIOCGRAB, 0) < 0) + perror ("Ungrabbing evdev keyboard device failed"); + xfree (ke); ki->driverPrivate = 0; }