XInput2: getting window-relative coordinates?

Florian Echtler floe at
Sat Apr 18 01:54:31 PDT 2009

> > However, the second one (controlled by touchpad) reports values in the
> > range (1472,1408) to (5472,4448). This is also reported in the Xorg.log
> > by the synaptics driver. How can I map these to screen coordinates? As
> > the pointer still moves in screen coordinates, the mapping must already
> > exist somewhere, I assume.. 
> > I know that this is quite beta still, so I'd be very grateful about some
> > hints..
> right, so the rule for coordinates is:
> event_x,event_y, root_x, root_y are in absolute screen coordinates. or should
> be anyway.
Okay, sounds good. However, there seem to be some glitches hidden
somewhere. I'm running libXi, inputproto, xinput and xorg-server from
Peter's repo and libXext, libX11, libxcb, xproto, xcb-proto and
xextproto from master. The rest is from the Gentoo stable distro.

- for XI_Enter/XI_Leave, this looks as expected, with one exception.
  Here's what "xinput test-xi2" shows for those events:

  EVENT type 7
    windows: root 0x7e event 0x3600001 child 0x0
    mode: NotifyNormal (detail NotifyAncestor)
    flags:  [same screen]
    modifiers: locked 0x0 latched 0x0 base 0x0
    group: locked 0x0 latched 0x0 base 0x0
    root x/y:  134.00 / 243.00
    event x/y: 133.00 / 133.00

  Note that event x/y are equal. This is _always_ the case, and always
  corresponds to the window-local x coordinate. I grepped through libXi,
  but couldn't find anything obviously wrong. 

- for XI_Motion, the root x/y and event x/y fields are always (0/0) and
  (-372/-372), sometimes also (0/0) and (-1/-1). Should these fields be
  also valid for XI_Motion?

> the data in *valuators OTOH is in device-coordinates. this may be screen
> coordinates for relative devices, and device coordinates for absolute devices.
> You need to get the axis information through XIQueryDevice() first, and do the
> scaling on the client-side if you need it.
Ah, okay. Does it matter whether I select AllDevices or
AllMasterDevices? Here's the code which I use to select my events:

FGAPI void FGAPIENTRY glutRegisterDevices() {

	XIDeviceEventMask mask;
	unsigned char flags[2] = { 0, 0 };

	Display* dpy = fgDisplay.Display;
	Window* win = glutGetXWindow();

	/* Select for motion events */
	mask.deviceid = AllMasterDevices;
	mask.mask_len = 2;
	mask.mask = flags;

	SetBit(mask.mask, XI_Enter);
	SetBit(mask.mask, XI_Motion);
	SetBit(mask.mask, XI_ButtonPress);
	SetBit(mask.mask, XI_ButtonRelease);
	SetBit(mask.mask, XI_Leave);

	XISelectEvent( dpy, *win, &mask, 1 );

Did I miss anything here?

Yours, Florian
0666 - Filemode of the Beast

More information about the xorg mailing list