development kernel tree: Changes to 'andy'

git at git.openmoko.org git at git.openmoko.org
Wed Aug 13 13:21:15 CEST 2008


Rebased ref, commits from common ancestor:
commit 6c8cac7aff344b545ddcb89f8365473b39044064
Author: Andy Green <andy at openmoko.com>
Date:   Wed Aug 13 12:21:00 2008 +0100

    fix-eviocgrab-switch-type.patch
    
    Signed-off-by: Andy Green <andy at openmoko.com>

commit d4ed36d017e38d09266ced9224e836a15a2334ef
Author: Neil Brown <neilb at suse.de>
Date:   Wed Aug 13 12:21:00 2008 +0100

    fix-EVIOCGRAB-redone.patch
    
    On Wednesday August 13, mickey at openmoko.org wrote:
    > Am Mittwoch 13 August 2008 09:13:43 schrieb Neil Brown:
    > > Hi I just spent some time trying to figure out why the EVIOCGRAB ioctl
    > > wasn't behaving was I expected and I finally stumbled on to this
    > > patch, which substantially changes the behaviour of EVIOCGRAB.
    > >
    > > Would it be possible to find out what the purpose of this patch is (it
    > > unfortunately contains no documentation)?
    >
    > See http://lkml.org/lkml/2006/8/12/64
    
    Thanks for the pointer!  Interesting reading.
    
    So this is a 2 year old issue (almost to the day!) which does not
    appear to have been properly resolved yet.  Sad.
    
    An input device (e.g. touch pad, key board) can be attached to
    multiple handlers (/dev/mouseX, console, etc) one of which can be
    evdev which provides the /dev/input/event* files.
    evdev can support multiple clients on a single device, as multiple
    processes can open /dev/input/eventX.  The each get to see all the
    events.
    
    EVIOCGRAB is an ioctl on an evdev device which causes all events to go
    to that handler, and that client, exclusively.
    
    It is being used for two distinct purposes.
    
    1/ Stop events going to other handlers, so that e.g. absolute touchpad
       events don't get mapped to relative mouse events.  Keyboard events
       processed by X server don't get processed by console and control-C
       kills the X server.
    2/ Stop events going to any other client, so they can e.g. be mapped
       and fed back into a uinput device,
    
    So there are three levels of grab that are required:
    
     0/ no grab : all events go to all handlers and all clients
     1/ evdev grab: events only go to evdev, but can then go to any
           client of evdev
     2/ total grab:  events only go to the specific evdev client that
           requested the grab.
    
    
    0 is the default
    mainline allows you to select 2 but not 1.
    this patch allows you to select 1, but not 2.
    
    It seems that the "obvious" thing to do is to interpret the argument
    to EVIOCGRAB to select between these options.
    We cannot use 0, 1, 2 as above - despite the fact that it makes sense
    - because that would be a regression: working programs would break.
    Maybe it's best to use 0, 2, 1 and document it clearly.  The chance of
    anyone using 2 already has got to be very close to zero.
    
    We would then need to change the drivers in the X server to use '2'
    rather than '1', and (I think) everyone would be happy.
    
    Below is my proposed patch which provides the functionality of
    the patch in question without causing any regressions.
    It also fixes two minor buglets in the original.
    
    If anyone would like to comment, I'd appreciate it.  If I hear nothing
    bad I'll propose it to Dimitry Torokhov on some appropriate list.
    
    Thanks,
    NeilBrown





More information about the commitlog mailing list