Using touch screen pressure data

(demidgarded)
m (use <source>)
Line 1: Line 1:
This code snippet demonstrates how to get pressure data to xlib application.
This code snippet demonstrates how to get pressure data to xlib application.
Xsp extension provides 'rawmode' which is used when touchscreen is calibrated, in this mode it is possible to receive pressure information. This can be used as a workaround because we don't have Xi there (at least yet).
Xsp extension provides 'rawmode' which is used when touchscreen is calibrated, in this mode it is possible to receive pressure information. This can be used as a workaround because we don't have Xi there (at least yet).
-
<pre>
+
<source lang="c">
#include <X11/X.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xlib.h>
Line 190: Line 190:
   return 0;
   return 0;
}
}
-
 
+
</source>
-
</pre>
+
[[Category: Development]]
[[Category: Development]]

Revision as of 12:17, 31 May 2010

This code snippet demonstrates how to get pressure data to xlib application. Xsp extension provides 'rawmode' which is used when touchscreen is calibrated, in this mode it is possible to receive pressure information. This can be used as a workaround because we don't have Xi there (at least yet).

#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
 
#include <X11/extensions/Xsp.h>
 
#define uint unsigned int
 
Display *dpy;
Window win;
int screen;
int xres;
int yres;
 
/* device specific data */
#define DEV_X_DELTA 3378
#define DEV_Y_DELTA 3080
#define DEV_X_CORRECTION -300
#define DEV_Y_CORRECTION -454
 
/**
   translate raw device coordinates to screen coordinates
*/
#define TRANSLATE_RAW_COORDS(x, y) \
{ \
  * x += DEV_X_CORRECTION;\
  * y += DEV_Y_CORRECTION;\
  * x = xres - (xres * *x) / DEV_X_DELTA;\
  * y = yres - (yres * *y) / DEV_Y_DELTA;\
}
 
/**
   set foreground color of default gc
*/
static void
setcolor(uint r, uint g, uint b)
{
  XColor col;
  col.red   = r;
  col.green = g;
  col.blue  = b;
  XAllocColor(dpy,
              DefaultColormap (dpy, screen),
              &col);
  XSetForeground(dpy,
                 DefaultGC (dpy, screen),
                 col.pixel);
}
 
/**
   main program
*/
int
main (int argc, char *argv
{
  long key_pressed;
 
  XEvent event;
  XSPRawTouchscreenEvent xsp_event;
 
  int xsp_event_base=-1;
  int xsp_error_base=-1;
  int xsp_major=-1;
  int xsp_minor=-1;
 
  int t_x=0;
  int t_y=0;
 
  int circle_angle = 360*64;
 
  uint radius=0;
  uint done = 0;
 
  Atom atoms_WINDOW_STATE;
  Atom atoms_WINDOW_STATE_FULLSCREEN;
 
  /* open X display */
  dpy = XOpenDisplay(0);
 
  if (!dpy)
    goto exit;
 
  screen = DefaultScreen   (dpy);
  xres   = ScreenOfDisplay (dpy, DefaultScreen(dpy))->width;
  yres   = ScreenOfDisplay (dpy, DefaultScreen(dpy))->height;
 
  atoms_WINDOW_STATE
    = XInternAtom(dpy, "_NET_WM_STATE",False);
  atoms_WINDOW_STATE_FULLSCREEN
    = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN",False);
 
  /* create the Window */
  win = XCreateSimpleWindow(dpy, RootWindow(dpy, screen), 0, 0,
                            xres, yres, 0,
                            BlackPixel(dpy, screen),
                            WhitePixel(dpy, screen));
 
  /* Set the wmhints needed for fullscreen */
  XChangeProperty(dpy, win, atoms_WINDOW_STATE, XA_ATOM, 32,
                  PropModeReplace,
                  (unsigned char *) &atoms_WINDOW_STATE_FULLSCREEN, 1);
 
  /* get xsp event base */
  XSPQueryExtension(dpy,
                    &xsp_event_base,
                    &xsp_error_base,
                    &xsp_major,
                    &xsp_minor);
 
  if (xsp_event_base < 0)
    goto exit;
 
  /* activate raw touchscreen data */
  XSPSetTSRawMode(dpy, True);
 
  XSelectInput(dpy, win, StructureNotifyMask | ExposureMask | KeyPressMask);
  XMapWindow(dpy, win);
  XClearWindow(dpy, win);
 
  XFlush(dpy);
 
  /* clean queue */
  XSync(dpy, True);
 
  setcolor(0, 0, 0);
  while (!done)
  {
    /* if there are events */
    if (XEventsQueued(dpy, QueuedAfterReading) > 0)
    {
      XNextEvent(dpy, &event);
 
      /* if it's xsp event */
      if (event.type == xsp_event_base)
        {
          memcpy(&xsp_event, &event,
                 sizeof(XSPRawTouchscreenEvent));
 
          t_x = xsp_event.x;
          t_y = xsp_event.y;
 
          /* translate raw coordinates */
          TRANSLATE_RAW_COORDS(&t_x, &t_y);
 
          /* draw filled circle in translated coords,
             using pressure for size */
          radius = xsp_event.pressure - 100;
          if (radius < 0)
            radius = 1;
 
          XFillArc(dpy,
                   win,
                   DefaultGC(dpy, screen),
                   t_x-radius,
                   t_y-radius,
                   radius+radius,
                   radius+radius,
                   0 ,
                   circle_angle);
 
          XFlush(dpy);
        }
      else
        {
          /* some other event */
          switch (event.type)
            {
            case KeyPress :
              done = 1;
              break;
 
            default :
              break;
 
            }
        }
    }
  }
 
  exit :
 
  /* set back normal event mode */
  XSPSetTSRawMode(dpy, False);
 
  XCloseDisplay(dpy);
  return 0;
}