#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <linux/input.h>
void main()
{
struct input_event ie;
unsigned short *pixel;
struct fb_var_screeninfo info;
unsigned int fd, fb, pad, scan, size, xy[2], count, vib;
if (setgid(0) || setuid(0) ||
!(fd = open("/dev/input/event2", O_RDONLY, 0)) ||
!(fb = open("/dev/graphics/fb0", O_RDWR, 0)) ||
ioctl(fb, FBIOGET_VSCREENINFO, &info)) return;
scan = (info.xres * (info.bits_per_pixel >> 3)) + 32;
void *buffer = mmap(NULL, size = info.yres * scan, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
while (read(fd, &ie, sizeof(ie)))
if (ie.type)
{
if ((ie.type == 3) && (ie.code < 2))
xy[ie.code] = ie.value;
count = 0;
if ((ie.type == 1) && (vib = open("/sys/devices/platform/msm_pmic_vibrator/enable", O_WRONLY, 0)))
{
count = 55;
write(vib, "55\n", 3);
close(vib);
}
do
{
for (int y = 0; y < info.yres; y++)
{
pixel = buffer + (y * scan);
for (int x = 0; x < info.xres; x++)
if ((x == xy[0]) || (y == xy[1]))
pixel[x] = 0xF800; // 565
}
fsync(fb);
if (count) usleep(55);
} while (count--);
}
munmap(buffer, size);
close(fb); close(fd);
}[/c]
Compilamos y ejecutamos;

Verificamos;

Explicación;
El anterior código accede a la pantalla táctil, a la información de pantalla (pixeles) y al vibrador del teléfono móvil. Lo que hace es sencillo; detecta cuando el usuario toca, suelta o mueve su dedo sobre la pantalla táctil realizando una intersección de dos líneas horizontal/vertical en dicho punto. Adicionalmente cuando comienza y finaliza el movimiento (osea ni bien se toca o suelta), enciende por unos milisegundos el motor del vibrador.
Las aplicaciones posibles del anterior ejemplo son; el realizar un pseudo-HOOK detectando una actividad específica en la pantalla táctil sin que nuestra aplicación sea la que esté corriendo en primer plano o tenga interfaz alguna. Y la segunda es la monitorización o grabado de lo que se ve en el display del dispositivo (en el mismo dispositivo claro está).
Salud