Using touch screen pressure data

 
(4 intermediate revisions not shown)
Line 1: Line 1:
-
Sample Program:
+
This code snippet demonstrates how to get pressure data to xlib application.
-
<pre>
+
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).
-
/**
+
<source lang="c">
-
  This program 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/X.h>
#include <X11/Xlib.h>
#include <X11/Xlib.h>
Line 66: Line 56:
*/
*/
int
int
-
main (int argc, char *argv
+
main (int argc, char *argv)
{
{
   long key_pressed;
   long key_pressed;
Line 200: Line 190:
   return 0;
   return 0;
}
}
 +
</source>
-
</pre>
+
[[Category: Development]]
-
 
+
-
[[Category: HowTos]]
+
-
[[Category:Midgard wiki]]
+

Latest revision as of 21:31, 29 January 2011

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;
}