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 <dottedmag@dottedmag.net>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Keith Packard <keithp@keithp.com>
(cherry picked from commit 662594aeff)
This commit is contained in:
Mikhail Gusarov 2009-10-29 00:40:48 +06:00 committed by Peter Hutterer
parent 9ed5acec41
commit 171dc59ec5
1 changed files with 14 additions and 1 deletions

View File

@ -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;
}