[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freedesktop-xorg-devel
Subject:    [xserver] kdrive: Grab evdev mouse/keyboard devices when X
From:       peter.hutterer () who-t ! net (Peter Hutterer)
Date:       2009-10-29 0:30:55
Message-ID: 20091029003054.GH13320 () barra ! bne ! redhat ! com
[Download RAW message or body]

On Thu, Oct 29, 2009 at 12:40:48AM +0600, Mikhail Gusarov wrote:
> 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 at dottedmag.net>
> ---
>  hw/kdrive/linux/evdev.c |   15 ++++++++++++++-
>  1 files changed, 14 insertions(+), 1 deletions(-)
> 
> diff --git a/hw/kdrive/linux/evdev.c b/hw/kdrive/linux/evdev.c
> index f6017ba..096a2dd 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;
>  }
> -- 
> 1.6.5

Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

Cheers,
  Peter

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic