--- SDL_fbevents.c.org	2003-09-02 19:20:44.000000000 +0900
+++ SDL_fbevents.c	2003-09-05 23:27:46.000000000 +0900
@@ -60,7 +60,13 @@
 #ifndef GPM_NODE_FIFO
 #define GPM_NODE_FIFO	"/dev/gpmdata"
 #endif
+#define POINTERCAL "/etc/pointercal"
 
+static struct SDL_cal {
+	long ok;
+	long a, b, c, d, e, f, s;
+	long rotate;
+} cal = { 0 };
 
 /* The translation tables from a console scancode to a SDL keysym */
 #define NUM_VGAKEYMAPS	(1<<KG_CAPSSHIFT)
@@ -317,6 +323,7 @@
 	MOUSE_MS,
 	MOUSE_BM,
 	MOUSE_ELO,
+	TS_SLC7X0,
 	NUM_MOUSE_DRVS
 } mouse_drv = MOUSE_NONE;
 
@@ -500,6 +507,9 @@
 	mousedev = getenv("SDL_MOUSEDEV");
 	mouse_fd = -1;
 
+	const char *sdl_rot_flag;
+	sdl_rot_flag = getenv("SDL_FBROT");
+
 	/* ELO TOUCHSCREEN SUPPORT */
 
 	if( (mousedrv != NULL) && (strcmp(mousedrv, "ELO") == 0) ) {
@@ -601,9 +611,39 @@
 			mouse_drv = MOUSE_MS;
 		}
 	}
+	/* Default to a SLC7X0 touch screen */
+	if ( mouse_fd < 0 ) {
+		mousedev = "/dev/ts";
+		mouse_fd = open(mousedev, O_RDONLY, 0);
+		if ( mouse_fd >= 0 ) {
+			FILE *pcal;
+			cal.ok = 0;
+			pcal = fopen(POINTERCAL, "r");
+			if(pcal == NULL){
+				fprintf(stderr, "Warning: cannot open " POINTERCAL ".\n");
+			}else{
+				int n;
+				n = fscanf(pcal, "%d %d %d %d %d %d %d",
+					   &cal.a, &cal.b, &cal.c, &cal.d, &cal.e, &cal.f, &cal.s);
+				if(n != 7){
+				    fprintf(stderr, "Warning: " POINTERCAL " is unknown format.\n");
+				}else{
+				    cal.ok = 1;
+				}
+				fclose(pcal);
+			}
+			if ( sdl_rot_flag == NULL ) {
+				cal.rotate = 0;
+			} else {
+				cal.rotate = atoi(sdl_rot_flag);
+			}
+			mouse_drv = TS_SLC7X0;
+		}
+	}
 	if ( mouse_fd < 0 ) {
 		mouse_drv = MOUSE_NONE;
 	}
+
 	return(mouse_fd);
 }
 
@@ -678,6 +718,10 @@
 			packetsize = ELO_PACKET_SIZE;
 			relative = 0;
 			break;
+		case TS_SLC7X0:
+			packetsize = 8;
+			relative = 0;
+			break;
 		case NUM_MOUSE_DRVS:
 			/* Uh oh.. */
 			packetsize = 0;
@@ -810,6 +854,25 @@
 			*/
 
 			case MOUSE_ELO:
+			case TS_SLC7X0:
+				/* Get current mouse state */
+				button = ((mousebuf[i+1] << 8)+mousebuf[i])/500;
+		  		dx = (mousebuf[i+3] << 8)+mousebuf[i+2];
+		  		dy = (mousebuf[i+5] << 8)+mousebuf[i+4];
+				if(cal.ok){
+					long X, Y;
+					X = (cal.a * dx + cal.b * dy + cal.c) / cal.s;
+					Y = (cal.d * dx + cal.e * dy + cal.f) / cal.s;
+					dx = X;
+					dy = Y;
+				}
+				if(cal.rotate == 3){
+					int tmp;
+					tmp=dx;
+					dx = dy;
+					dy = 480-tmp;
+				}
+				break;
 			case NUM_MOUSE_DRVS:
 				/* Uh oh.. */
 				dx = 0;
