Hi,

i updated the right button patch to the 0.0.5-3 package. there is also a
fix in the initialization. i told the xserver that there are only two
buttons but the right button is button 3 actually :-( now it also works
under fluxbox on my freerunner with had have a quite odd behavior
before. i hope that your problems with your shard vanished as well... so
we can get this bug report to an end.

regards
 Sebastian
--- xf86-input-tslib-0.0.5/src/tslib.c	2009-02-22 10:47:56.000000000 +0100
+++ xf86-input-tslib-0.0.5.my/src/tslib.c	2009-02-22 10:46:18.000000000 +0100
@@ -50,18 +50,24 @@
 #include <mipointer.h>
 
 #include <tslib.h>
+#include <sys/time.h>
+#include <time.h>
 
 #ifdef XFree86LOADER
 #include <xf86Module.h>
 #endif
 
-#define MAXBUTTONS 1
+#define MAXBUTTONS 3
+#define TIME23RDBUTTON 0.5
+#define MOVEMENT23RDBUTTON 4
 
 #define DEFAULT_HEIGHT		240
 #define DEFAULT_WIDTH		320
 
 enum { TSLIB_ROTATE_NONE=0, TSLIB_ROTATE_CW=270, TSLIB_ROTATE_UD=180, TSLIB_ROTATE_CCW=90 };
 
+enum button_state { BUTTON_NOT_PRESSED = 0, BUTTON_1_PRESSED = 1, BUTTON_3_CLICK = 3, BUTTON_3_CLICKED=4, BUTTON_EMULATION_OFF=-1 };
+
 struct ts_priv {
 	XISBuffer *buffer;
 	struct tsdev *ts;
@@ -70,6 +76,9 @@
 	int rotate;
 	int height;
 	int width;
+	enum button_state state;
+	struct timeval button_down_start;
+	int button_down_x,button_down_y;
 };
 
 static void
@@ -111,14 +120,30 @@
 	return TRUE;
 }
 
+struct timeval TimevalDiff(struct timeval a, struct timeval b)
+{
+	struct timeval t;
+	t.tv_sec = a.tv_sec-b.tv_sec;
+	t.tv_usec = a.tv_usec - b.tv_usec;
+	if (t.tv_usec < 0) {
+		t.tv_sec--;
+		t.tv_usec += 1000000;
+	}
+    return t;
+}
+
 static void ReadInput (LocalDevicePtr local)
 {
 	struct ts_priv *priv = (struct ts_priv *) (local->private);
 	struct ts_sample samp;
 	int ret;
 	int x,y;
+	struct timeval now;
 
 	while((ret = ts_read(priv->ts, &samp, 1)) == 1) {
+	 	gettimeofday(&now, NULL);
+	 	struct timeval pressureTime = TimevalDiff(now,priv->button_down_start);
+
 		if(samp.pressure) {
 			int tmp_x = samp.x;
 
@@ -149,13 +174,85 @@
 
 		}
 
-		if(!!priv->lastp != !!samp.pressure) {
-			priv->lastp = samp.pressure;
-
-			xf86PostButtonEvent(local->dev, TRUE,
-				1, !!samp.pressure, 0, 2,
-				priv->lastx,
-				priv->lasty);
+  
+ 	 	/* button pressed state machine
+ 	 	 * if pressed than press button 1, start timer and remember the tab position
+ 	 	 * if pressed longer than TIME23RDBUTTON and it is not moved more than MOVEMENT23RDBUTTON release button 1 and click button 3
+ 	 	 * if still pressed do nothing until the pressure is released
+ 	 	 */
+ 	 	switch (priv->state) {
+             case BUTTON_EMULATION_OFF :
+                 if(priv->lastp != samp.pressure) {
+                     priv->lastp = samp.pressure;
+     
+                     xf86PostButtonEvent(local->dev, TRUE,
+                         1, !!samp.pressure, 0, 2,
+                         priv->lastx,
+                         priv->lasty);
+                 }
+                 break;
+ 	 		case BUTTON_NOT_PRESSED :
+ 	 			if (samp.pressure) {
+ 	 				priv->button_down_start = now;
+ 	 				priv->button_down_y = samp.y;
+ 	 				priv->button_down_x = samp.x;
+ 	 				priv->state = BUTTON_1_PRESSED;
+ 	 				//ErrorF("b1 down");
+ 	 				xf86PostButtonEvent(local->dev, TRUE,
+ 	 					priv->state, TRUE, 0, 2,
+ 	 					priv->lastx,
+ 	 					priv->lasty);
+ 	 			}
+ 	 			break;
+ 	 		case BUTTON_1_PRESSED :
+ 	 			if (samp.pressure) {	
+ 	 				//ErrorF("%d %d ",pressureTime.tv_sec,pressureTime.tv_usec);
+ 	 				if ((((double)pressureTime.tv_sec)+(((double)pressureTime.tv_usec)*1e-6) > TIME23RDBUTTON) &&
+ 	 				   (abs(priv->lastx-priv->button_down_x) < MOVEMENT23RDBUTTON &&
+ 	 				    abs(priv->lasty-priv->button_down_y) < MOVEMENT23RDBUTTON))
+ 	 				{
+ 	 					//ErrorF("b1 up");
+ 	 					xf86PostButtonEvent(local->dev, TRUE,
+ 	 						priv->state, FALSE, 0, 2,
+ 	 						priv->lastx,
+ 	 						priv->lasty);
+ 	 					priv->state = BUTTON_3_CLICK;
+ 	 					//ErrorF("b3 down");
+ 	 					xf86PostButtonEvent(local->dev, TRUE,
+ 	 						priv->state, TRUE, 0, 2,
+ 	 						priv->lastx,
+ 	 						priv->lasty);
+ 	 				} 
+ 	 				if (abs(priv->lastx-priv->button_down_x) > MOVEMENT23RDBUTTON ||
+ 	 				    abs(priv->lasty-priv->button_down_y) > MOVEMENT23RDBUTTON) {
+ 	 					priv->button_down_start = now;
+ 	 					priv->button_down_y = samp.y;
+ 	 					priv->button_down_x = samp.x;
+ 	 					//ErrorF("b1 state reset");
+ 	 				}
+ 	 			} else {
+ 	 				//ErrorF("b1 up");
+ 	 				xf86PostButtonEvent(local->dev, TRUE,
+ 	 					priv->state, FALSE, 0, 2,
+ 	 					priv->lastx,
+ 	 					priv->lasty);
+ 	 				priv->state = BUTTON_NOT_PRESSED;
+ 	 			}
+ 	 			break;
+ 	 		case BUTTON_3_CLICK :
+ 	 			//ErrorF("b3 up");
+ 	 			xf86PostButtonEvent(local->dev, TRUE,
+ 	 				priv->state, FALSE, 0, 2,
+ 	 				priv->lastx,
+ 	 				priv->lasty);
+ 	 			priv->state = BUTTON_3_CLICKED;
+ 	 			break;
+ 	 		case BUTTON_3_CLICKED :
+ 	 			if (!samp.pressure) {
+ 	 				//ErrorF("b3 free");
+ 	 				priv->state = BUTTON_NOT_PRESSED;
+ 	 			}
+ 	 			break;
 		}
 	}
 
@@ -358,6 +455,11 @@
 
 	pInfo->fd = ts_fd(priv->ts);
 
+	priv->state = BUTTON_NOT_PRESSED;
+	if (xf86SetIntOption(pInfo->options, "EmulateRightButton", 0) == 0) {
+		priv->state = BUTTON_EMULATION_OFF;
+	}
+		
 	/* Mark the device configured */
 	pInfo->flags |= XI86_CONFIGURED;
 

Reply via email to