[RFC XI 2.1 - xinput 3/3] Add experimental multitouch support from XI 2.1

Peter Hutterer peter.hutterer at who-t.net
Thu Nov 18 22:46:26 PST 2010


On Fri, Nov 12, 2010 at 05:35:17PM -0500, Chase Douglas wrote:
> From: Daniel Stone <daniel at fooishbar.org>
> 
> This patch adds experimental support for listening to touch streams
> (TouchBegin, TouchMotion and TouchEnd) with test-xi2, as well as showing
> TouchClass information with list.
> 
> Signed-off-by: Daniel Stone <daniel at fooishbar.org>
> Signed-off-by: Chase Douglas <chase.douglas at canonical.com>
> ---
>  src/list.c     |   26 ++++++++++++++++++++++++++
>  src/test_xi2.c |    8 +++++++-
>  2 files changed, 33 insertions(+), 1 deletions(-)
> 
> diff --git a/src/list.c b/src/list.c
> index 8633c62..fa3ffcc 100644
> --- a/src/list.c
> +++ b/src/list.c
> @@ -24,6 +24,9 @@
>  #include "xinput.h"
>  #include <string.h>
>  #include <X11/extensions/XIproto.h> /* for XI_Device***ChangedNotify */
> +#ifdef HAVE_XI2
> +#include <X11/extensions/XI2proto.h> /* for XITouch* */
> +#endif
>  
>  static void
>  print_info(Display* dpy, XDeviceInfo	*info, Bool shortformat)
> @@ -178,6 +181,29 @@ print_classes_xi2(Display* display, XIAnyClassInfo **classes,
>                      XFree(name);
>                  }
>                  break;
> +            case XITouchClass:
> +                {
> +                    XITouchClassInfo *t = (XITouchClassInfo *)classes[i];
> +
> +                    printf("\t\tMultitouch capable (max %d touches):\n",
> +                           t->num_touches);
> +                    printf("\t\t  Mode: %s\n",
> +                           t->mode == XIDirectTouch ? "direct" : "dependent");
> +                }
> +                break;
> +            case XITouchValuatorClass:
> +                {
> +                    XITouchValuatorClassInfo *tv =
> +                        (XITouchValuatorClassInfo *)classes[i];
> +                    char *name = tv->label ?
> +                        XGetAtomName(display, tv->label) : NULL;
> +
> +                    printf("\t\tDetail for Touch Valuator %d:\n", tv->number);
> +                    printf("\t\t  Label: %s\n",  (name) ? name : "None");
> +                    printf("\t\t  Range: %f - %f\n", tv->min, tv->max);
> +                    printf("\t\t  Resolution: %d units/m\n", tv->resolution);
> +                }
> +                break;
>          }
>      }
>  
> diff --git a/src/test_xi2.c b/src/test_xi2.c
> index 30bb0fa..ba92d27 100644
> --- a/src/test_xi2.c
> +++ b/src/test_xi2.c
> @@ -279,6 +279,9 @@ static const char* type_to_name(int evtype)
>          case XI_RawButtonPress:   name = "RawButtonPress";      break;
>          case XI_RawButtonRelease: name = "RawButtonRelease";    break;
>          case XI_RawMotion:        name = "RawMotion";           break;
> +        case XI_TouchBegin:       name = "TouchBegin";          break;
> +        case XI_TouchEnd:         name = "TouchEnd";            break;
> +        case XI_TouchMotion:      name = "TouchMotion";         break;
>          default:
>                                    name = "unknown event type"; break;
>      }
> @@ -301,7 +304,7 @@ test_xi2(Display	*display,
>  
>      /* Select for motion events */
>      mask.deviceid = XIAllDevices;
> -    mask.mask_len = XIMaskLen(XI_RawMotion);
> +    mask.mask_len = XIMaskLen(XI_TouchMotion);
>      mask.mask = calloc(mask.mask_len, sizeof(char));
>      XISetMask(mask.mask, XI_ButtonPress);
>      XISetMask(mask.mask, XI_ButtonRelease);
> @@ -315,6 +318,9 @@ test_xi2(Display	*display,
>      XISetMask(mask.mask, XI_FocusOut);
>      XISetMask(mask.mask, XI_HierarchyChanged);
>      XISetMask(mask.mask, XI_PropertyEvent);
> +    XISetMask(mask.mask, XI_TouchBegin);
> +    XISetMask(mask.mask, XI_TouchMotion);
> +    XISetMask(mask.mask, XI_TouchEnd);
>      XISelectEvents(display, win, &mask, 1);
>      XMapWindow(display, win);
>      XSync(display, False);
> -- 
> 1.7.1

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


More information about the xorg-devel mailing list