Auto-detects Wacom touch devices.
This commit is contained in:
parent
3dcae4341c
commit
f75117cf0f
8 changed files with 182 additions and 24 deletions
|
@ -36,12 +36,7 @@ static SDL_Touch **SDL_touchPads = NULL;
|
||||||
int
|
int
|
||||||
SDL_TouchInit(void)
|
SDL_TouchInit(void)
|
||||||
{
|
{
|
||||||
SDL_Touch touch;
|
|
||||||
touch.pressure_max = 0;
|
|
||||||
touch.pressure_min = 0;
|
|
||||||
touch.id = 0; //Should be function?
|
|
||||||
|
|
||||||
SDL_AddTouch(&touch, "Touch1");
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +133,9 @@ SDL_AddTouch(const SDL_Touch * touch, char *name)
|
||||||
SDL_strlcpy(SDL_touchPads[index]->name, name, length + 1);
|
SDL_strlcpy(SDL_touchPads[index]->name, name, length + 1);
|
||||||
|
|
||||||
SDL_touchPads[index]->num_fingers = 0;
|
SDL_touchPads[index]->num_fingers = 0;
|
||||||
|
SDL_touchPads[index]->max_fingers = 0;
|
||||||
|
SDL_touchPads[index]->fingers = NULL;
|
||||||
|
|
||||||
SDL_touchPads[index]->buttonstate = 0;
|
SDL_touchPads[index]->buttonstate = 0;
|
||||||
SDL_touchPads[index]->relative_mode = SDL_FALSE;
|
SDL_touchPads[index]->relative_mode = SDL_FALSE;
|
||||||
SDL_touchPads[index]->flush_motion = SDL_FALSE;
|
SDL_touchPads[index]->flush_motion = SDL_FALSE;
|
||||||
|
@ -261,16 +259,27 @@ SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add the touch to the list of touch */
|
/* Add the touch to the list of touch */
|
||||||
fingers = (SDL_Finger **) SDL_realloc(touch->fingers,
|
if(touch->num_fingers >= touch->max_fingers){
|
||||||
(touch->num_fingers + 1) * sizeof(*touch));
|
if(fingers == NULL) {
|
||||||
|
touch->max_fingers = 1;
|
||||||
|
fingers = (SDL_Finger **) SDL_malloc(sizeof(finger));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fingers = (SDL_Finger **) SDL_realloc(touch->fingers,
|
||||||
|
(touch->num_fingers + 1) * sizeof(finger));
|
||||||
|
touch->max_fingers = touch->num_fingers+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (!fingers) {
|
if (!fingers) {
|
||||||
SDL_OutOfMemory();
|
SDL_OutOfMemory();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
touch->fingers = fingers;
|
touch->fingers = fingers;
|
||||||
index = touch->num_fingers++;
|
index = touch->num_fingers;
|
||||||
|
touch->num_fingers++;
|
||||||
touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(*(touch->fingers[index])));
|
touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(*(touch->fingers[index])));
|
||||||
if (!touch->fingers[index]) {
|
if (!touch->fingers[index]) {
|
||||||
SDL_OutOfMemory();
|
SDL_OutOfMemory();
|
||||||
|
|
|
@ -61,6 +61,7 @@ struct SDL_Touch
|
||||||
SDL_bool flush_motion;
|
SDL_bool flush_motion;
|
||||||
|
|
||||||
int num_fingers;
|
int num_fingers;
|
||||||
|
int max_fingers;
|
||||||
SDL_Finger** fingers;
|
SDL_Finger** fingers;
|
||||||
|
|
||||||
void *driverdata;
|
void *driverdata;
|
||||||
|
|
100
src/video/x11/SDL_eventtouch.c
Normal file
100
src/video/x11/SDL_eventtouch.c
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2010 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
*/
|
||||||
|
#include "SDL_config.h"
|
||||||
|
#include "SDL_x11video.h"
|
||||||
|
#include "SDL_eventtouch.h"
|
||||||
|
#include "../../events/SDL_touch_c.h"
|
||||||
|
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
X11_InitTouch(_THIS)
|
||||||
|
{
|
||||||
|
printf("Initializing touch...\n");
|
||||||
|
|
||||||
|
FILE *fd;
|
||||||
|
fd = fopen("/proc/bus/input/devices","r");
|
||||||
|
|
||||||
|
char c;
|
||||||
|
int i = 0;
|
||||||
|
char line[256];
|
||||||
|
char tstr[256];
|
||||||
|
int vendor = -1,product = -1,event = -1;
|
||||||
|
while(!feof(fd)) {
|
||||||
|
if(fgets(line,256,fd) <=0) continue;
|
||||||
|
//printf("%s",line);
|
||||||
|
if(line[0] == '\n') {
|
||||||
|
if(vendor == 1386){
|
||||||
|
printf("Wacom... Assuming it is a touch device\n");
|
||||||
|
sprintf(tstr,"/dev/input/event%i",event);
|
||||||
|
printf("At location: %s\n",tstr);
|
||||||
|
|
||||||
|
SDL_Touch touch;
|
||||||
|
touch.pressure_max = 0;
|
||||||
|
touch.pressure_min = 0;
|
||||||
|
touch.id = event;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
touch.driverdata = SDL_malloc(sizeof(EventTouchData));
|
||||||
|
EventTouchData* data = (EventTouchData*)(touch.driverdata);
|
||||||
|
printf("Opening device...\n");
|
||||||
|
//printf("New Touch - DataPtr: %i\n",data);
|
||||||
|
data->eventStream = open(tstr,
|
||||||
|
O_RDONLY | O_NONBLOCK);
|
||||||
|
ioctl (data->eventStream, EVIOCGNAME (sizeof (tstr)), tstr);
|
||||||
|
printf ("Reading From : %s\n", tstr);
|
||||||
|
SDL_AddTouch(&touch, tstr);
|
||||||
|
|
||||||
|
}
|
||||||
|
vendor = -1;
|
||||||
|
product = -1;
|
||||||
|
event = -1;
|
||||||
|
}
|
||||||
|
else if(line[0] == 'I') {
|
||||||
|
i = 1;
|
||||||
|
while(line[i]) {
|
||||||
|
sscanf(&line[i],"Vendor=%x",&vendor);
|
||||||
|
sscanf(&line[i],"Product=%x",&product);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(line[0] == 'H') {
|
||||||
|
i = 1;
|
||||||
|
while(line[i]) {
|
||||||
|
sscanf(&line[i],"event%d",&event);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
X11_QuitTouch(_THIS)
|
||||||
|
{
|
||||||
|
SDL_TouchQuit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */
|
|
@ -35,8 +35,8 @@ typedef struct EventTouchData
|
||||||
} EventTouchData;
|
} EventTouchData;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//extern void X11_InitMouse(_THIS);
|
extern void X11_InitTouch(_THIS);
|
||||||
//extern void X11_QuitMouse(_THIS);
|
extern void X11_QuitTouch(_THIS);
|
||||||
|
|
||||||
#endif /* _SDL_eventtouch_h */
|
#endif /* _SDL_eventtouch_h */
|
||||||
|
|
||||||
|
|
|
@ -109,7 +109,6 @@ X11_DispatchEvent(_THIS)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Losing mouse coverage? */
|
/* Losing mouse coverage? */
|
||||||
case LeaveNotify:{
|
case LeaveNotify:{
|
||||||
#ifdef DEBUG_XEVENTS
|
#ifdef DEBUG_XEVENTS
|
||||||
|
@ -422,23 +421,16 @@ X11_PumpEvents(_THIS)
|
||||||
char name[256];
|
char name[256];
|
||||||
struct input_event ev[64];
|
struct input_event ev[64];
|
||||||
int size = sizeof (struct input_event);
|
int size = sizeof (struct input_event);
|
||||||
static int initd = 0; //TODO - HACK!
|
|
||||||
for(i = 0;i < SDL_GetNumTouch();++i) {
|
for(i = 0;i < SDL_GetNumTouch();++i) {
|
||||||
SDL_Touch* touch = SDL_GetTouchIndex(i);
|
SDL_Touch* touch = SDL_GetTouchIndex(i);
|
||||||
if(!touch) printf("Touch %i/%i DNE\n",i,SDL_GetNumTouch());
|
if(!touch) printf("Touch %i/%i DNE\n",i,SDL_GetNumTouch());
|
||||||
EventTouchData* data;
|
EventTouchData* data;
|
||||||
if(!initd){//data->eventStream <= 0) {
|
data = (EventTouchData*)(touch->driverdata);
|
||||||
touch->driverdata = SDL_malloc(sizeof(EventTouchData));
|
if(data == NULL) {
|
||||||
data = (EventTouchData*)(touch->driverdata);
|
printf("No driver data\n");
|
||||||
printf("Openning device...\n");
|
continue;
|
||||||
data->eventStream = open("/dev/input/wacom",
|
|
||||||
O_RDONLY | O_NONBLOCK);
|
|
||||||
ioctl (data->eventStream, EVIOCGNAME (sizeof (name)), name);
|
|
||||||
printf ("Reading From : %s\n", name);
|
|
||||||
initd = 1;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
data = (EventTouchData*)(touch->driverdata);
|
|
||||||
if(data->eventStream <= 0)
|
if(data->eventStream <= 0)
|
||||||
printf("Error: Couldn't open stream\n");
|
printf("Error: Couldn't open stream\n");
|
||||||
rd = read(data->eventStream, ev, size * 64);
|
rd = read(data->eventStream, ev, size * 64);
|
||||||
|
@ -469,6 +461,7 @@ X11_PumpEvents(_THIS)
|
||||||
data->finger = ev[i].value;
|
data->finger = ev[i].value;
|
||||||
break;
|
break;
|
||||||
case EV_SYN:
|
case EV_SYN:
|
||||||
|
printf("Id: %i\n",touch->id);
|
||||||
if(data->x >= 0 || data->y >= 0)
|
if(data->x >= 0 || data->y >= 0)
|
||||||
SDL_SendTouchMotion(touch->id,data->finger,
|
SDL_SendTouchMotion(touch->id,data->finger,
|
||||||
SDL_FALSE,data->x,data->y,
|
SDL_FALSE,data->x,data->y,
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
#include "SDL_video.h"
|
#include "SDL_video.h"
|
||||||
#include "SDL_mouse.h"
|
#include "SDL_mouse.h"
|
||||||
|
#include "SDL_eventtouch.h"
|
||||||
#include "../SDL_sysvideo.h"
|
#include "../SDL_sysvideo.h"
|
||||||
#include "../SDL_pixels_c.h"
|
#include "../SDL_pixels_c.h"
|
||||||
|
|
||||||
|
@ -269,6 +270,7 @@ X11_VideoInit(_THIS)
|
||||||
}
|
}
|
||||||
X11_InitMouse(_this);
|
X11_InitMouse(_this);
|
||||||
|
|
||||||
|
X11_InitTouch(_this);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,6 +291,7 @@ X11_VideoQuit(_THIS)
|
||||||
X11_QuitModes(_this);
|
X11_QuitModes(_this);
|
||||||
X11_QuitKeyboard(_this);
|
X11_QuitKeyboard(_this);
|
||||||
X11_QuitMouse(_this);
|
X11_QuitMouse(_this);
|
||||||
|
X11_QuitTouch(_this);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_bool
|
SDL_bool
|
||||||
|
|
|
@ -2,4 +2,6 @@ SDLTest : touchSimp.c touchPong.c
|
||||||
gcc touchTest.c -o touchTest `sdl-config --cflags --libs` -g
|
gcc touchTest.c -o touchTest `sdl-config --cflags --libs` -g
|
||||||
gcc touchSimp.c -o touchSimp `sdl-config --cflags --libs` -g
|
gcc touchSimp.c -o touchSimp `sdl-config --cflags --libs` -g
|
||||||
gcc touchPong.c -o touchPong `sdl-config --cflags --libs` -g
|
gcc touchPong.c -o touchPong `sdl-config --cflags --libs` -g
|
||||||
|
gcc parseDevicesTest.c -o parseDevicesTest -g
|
||||||
|
|
||||||
|
|
||||||
|
|
50
touchTest/parseDevicesTest.c
Normal file
50
touchTest/parseDevicesTest.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <linux/input.h>
|
||||||
|
|
||||||
|
|
||||||
|
int main(int agrc,char **argv)
|
||||||
|
{
|
||||||
|
FILE *fd;
|
||||||
|
fd = fopen("/proc/bus/input/devices","r");
|
||||||
|
|
||||||
|
char c;
|
||||||
|
int i = 0;
|
||||||
|
char line[256];
|
||||||
|
char tstr[256];
|
||||||
|
int vendor = -1,product = -1,event = -1;
|
||||||
|
while(!feof(fd)) {
|
||||||
|
fgets(line,256,fd);
|
||||||
|
//printf("%s",line);
|
||||||
|
if(line[0] == '\n') {
|
||||||
|
if(vendor == 1386){
|
||||||
|
printf("Wacom... Assuming it is a touch device\n");
|
||||||
|
sprintf(tstr,"/dev/input/event%i",event);
|
||||||
|
printf("At location: %s\n",tstr);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
vendor = -1;
|
||||||
|
product = -1;
|
||||||
|
event = -1;
|
||||||
|
}
|
||||||
|
else if(line[0] == 'I') {
|
||||||
|
i = 1;
|
||||||
|
while(line[i]) {
|
||||||
|
sscanf(&line[i],"Vendor=%x",&vendor);
|
||||||
|
sscanf(&line[i],"Product=%x",&product);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(line[0] == 'H') {
|
||||||
|
i = 1;
|
||||||
|
while(line[i]) {
|
||||||
|
sscanf(&line[i],"event%d",&event);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue