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
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -138,6 +133,9 @@ SDL_AddTouch(const SDL_Touch * touch, char *name)
|
|||
SDL_strlcpy(SDL_touchPads[index]->name, name, length + 1);
|
||||
|
||||
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]->relative_mode = 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 */
|
||||
if(touch->num_fingers >= touch->max_fingers){
|
||||
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(*touch));
|
||||
(touch->num_fingers + 1) * sizeof(finger));
|
||||
touch->max_fingers = touch->num_fingers+1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!fingers) {
|
||||
SDL_OutOfMemory();
|
||||
return -1;
|
||||
}
|
||||
|
||||
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])));
|
||||
if (!touch->fingers[index]) {
|
||||
SDL_OutOfMemory();
|
||||
|
|
|
@ -61,6 +61,7 @@ struct SDL_Touch
|
|||
SDL_bool flush_motion;
|
||||
|
||||
int num_fingers;
|
||||
int max_fingers;
|
||||
SDL_Finger** fingers;
|
||||
|
||||
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;
|
||||
#endif
|
||||
|
||||
//extern void X11_InitMouse(_THIS);
|
||||
//extern void X11_QuitMouse(_THIS);
|
||||
extern void X11_InitTouch(_THIS);
|
||||
extern void X11_QuitTouch(_THIS);
|
||||
|
||||
#endif /* _SDL_eventtouch_h */
|
||||
|
||||
|
|
|
@ -109,7 +109,6 @@ X11_DispatchEvent(_THIS)
|
|||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
/* Losing mouse coverage? */
|
||||
case LeaveNotify:{
|
||||
#ifdef DEBUG_XEVENTS
|
||||
|
@ -422,23 +421,16 @@ X11_PumpEvents(_THIS)
|
|||
char name[256];
|
||||
struct input_event ev[64];
|
||||
int size = sizeof (struct input_event);
|
||||
static int initd = 0; //TODO - HACK!
|
||||
|
||||
for(i = 0;i < SDL_GetNumTouch();++i) {
|
||||
SDL_Touch* touch = SDL_GetTouchIndex(i);
|
||||
if(!touch) printf("Touch %i/%i DNE\n",i,SDL_GetNumTouch());
|
||||
EventTouchData* data;
|
||||
if(!initd){//data->eventStream <= 0) {
|
||||
touch->driverdata = SDL_malloc(sizeof(EventTouchData));
|
||||
data = (EventTouchData*)(touch->driverdata);
|
||||
printf("Openning device...\n");
|
||||
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;
|
||||
if(data == NULL) {
|
||||
printf("No driver data\n");
|
||||
continue;
|
||||
}
|
||||
else
|
||||
data = (EventTouchData*)(touch->driverdata);
|
||||
if(data->eventStream <= 0)
|
||||
printf("Error: Couldn't open stream\n");
|
||||
rd = read(data->eventStream, ev, size * 64);
|
||||
|
@ -469,6 +461,7 @@ X11_PumpEvents(_THIS)
|
|||
data->finger = ev[i].value;
|
||||
break;
|
||||
case EV_SYN:
|
||||
printf("Id: %i\n",touch->id);
|
||||
if(data->x >= 0 || data->y >= 0)
|
||||
SDL_SendTouchMotion(touch->id,data->finger,
|
||||
SDL_FALSE,data->x,data->y,
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_mouse.h"
|
||||
#include "SDL_eventtouch.h"
|
||||
#include "../SDL_sysvideo.h"
|
||||
#include "../SDL_pixels_c.h"
|
||||
|
||||
|
@ -269,6 +270,7 @@ X11_VideoInit(_THIS)
|
|||
}
|
||||
X11_InitMouse(_this);
|
||||
|
||||
X11_InitTouch(_this);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -289,6 +291,7 @@ X11_VideoQuit(_THIS)
|
|||
X11_QuitModes(_this);
|
||||
X11_QuitKeyboard(_this);
|
||||
X11_QuitMouse(_this);
|
||||
X11_QuitTouch(_this);
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
|
|
|
@ -2,4 +2,6 @@ SDLTest : touchSimp.c touchPong.c
|
|||
gcc touchTest.c -o touchTest `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 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