the OLPC XO grab button (triggering mouse scrolling using a keypress)

Erik Garrison erik at laptop.org
Wed Jul 9 14:12:51 PDT 2008


On Tue, Jul 01, 2008 at 03:52:09PM +0930, Peter Hutterer wrote:
> On Mon, Jun 30, 2008 at 07:35:16PM -0400, Erik Garrison wrote:
> > The keyboard has two buttons which are marked with a hand.  The
> > interested may see a schematic at
> > http://wiki.laptop.org/go/OLPC_Keyboard_layouts.  It was intended at
> > design time that pressing either of these buttons (Super_L and Super_R)
> > and simultaneously moving the mouse would trigger x and y scrolling in
> > X11 applications.
> > 
> > I'm curious if anyone knows of ways in which similar functionality has
> > been implemented elsewhere.  In general I'd like some advice about the
> > best place to implement this feature.
> 
> Just put a passive grab on the keys to receive the key press event and then,
> depending on what you mean by scrolling:
> - mouse wheel emulation
>   put a (sync) grab on the mouse and use XTestFakeButtonEvent on buttons
>   4/5/6/7 for to scroll. you'll need to mess around a bit with XAllowEvents,
>   but it should work.

This is the path which I have followed.

I am using the following calls to grab and ungrab the pointer:

  XGrabPointer( display,
                window,
                False,
                0,
                GrabModeAsync,
                GrabModeAsync,
                None,
                None,
                CurrentTime );

  XUngrabPointer(display, CurrentTime);


These calls issue a fake button 4 event:

  XTestFakeButtonEvent(display, button_num, True, CurrentTime);
  XTestFakeButtonEvent(display, button_num, False, CurrentTime);
  XFlush(display);


I spent a long time attempting to send the fake button events *while* I
am grabbing the pointer.  I have not found a configuration of
XGrabPointer which allows this to occur.  Is such a scheme even
possible?  Currently I have to ungrab the pointer, issue the fake button
press/release, and then re-grab.

Any advice would be quite helpful.

Thank you,
Erik



More information about the xorg mailing list