Sophie

Sophie

distrib > Mageia > 3 > i586 > media > core-release-src > by-pkgid > add48b28eb34fb28a7d7e2451223f42d > files > 4

x11-driver-input-evtouch-0.8.8-14.mga3.src.rpm

commit f88ce643a4d343cc27ef6ef7e0bf148f885043ab
Author: Mattia Dongili <malattia@linux.it>
Date:   Sun Jan 24 15:45:51 2010 +0900

    04
    
    Build with 1.7. Also add some more probing taken from evdev.
    
    Signed-off-by: Mattia Dongili <malattia@linux.it>

Index: xserver-xorg-input-evtouch/evtouch.c
===================================================================
--- xserver-xorg-input-evtouch.orig/evtouch.c	2010-02-14 14:08:33.000000000 +0900
+++ xserver-xorg-input-evtouch/evtouch.c	2010-02-14 14:13:51.000000000 +0900
@@ -57,6 +57,7 @@
 #define NEED_EVENTS
 #include <X11/X.h>
 #include <X11/Xproto.h>
+#include <xserver-properties.h>
 
 #include "xf86.h"
 
@@ -129,7 +130,6 @@
         0
 };
 
-#ifdef XFree86LOADER
 static XF86ModuleVersionInfo VersionRec =
 {
         "evtouch",
@@ -164,9 +164,7 @@
 }
 
 
-XF86ModuleData evtouchModuleData = {&VersionRec, Plug, Unplug };
-
-#endif /* XFree86LOADER */
+_X_EXPORT XF86ModuleData evtouchModuleData = {&VersionRec, Plug, Unplug };
 
 
 static const char *default_options[] =
@@ -239,7 +237,7 @@
 
         priv->emulate3_timer_expired = TRUE;
         xf86UnblockSIGIO(sigstate);
-             
+
         return 0;
 }
 
@@ -339,7 +337,7 @@
 						     priv->cur_x, 
 						     priv->cur_y);
 			}
-		}			
+		}
 	}
 }
 
@@ -372,7 +370,7 @@
                     0, 0, 0, 0,
                     &priv->cur_x, &priv->cur_y);
 #endif
-	
+
         libtouchSetPos(priv->libtouch, priv->cur_x, priv->cur_y);
 }
 
@@ -394,7 +392,7 @@
                                                         priv->emulate3_timeout,
                                                         emulate3Timer,
                                                         local);
-                
+
                 if ( (ev->value == 1) && (ev->code == BTN_LEFT) ) {
                         priv->touch_flags |= LB_STAT;
                 }
@@ -419,7 +417,7 @@
                         DBGOUT(2, "EVTouch: Right Release\n");
                         priv->touch_flags &= ~RB_STAT;
                         SetBtnAction(priv, 3, BTN_RELEASE);
-                }                                
+                }
         } else {
                 if (ev->code == BTN_LEFT) {
                         SetBtnAction(priv, 1, ev->value);
@@ -478,26 +476,98 @@
         return;
 }
 
-
-
+#define TestBit(bit, array) ((array[(bit) / LONG_BITS]) & (1L << ((bit) % LONG_BITS)))
+#define ArrayLength(a) (sizeof(a) / (sizeof((a)[0])))
 
 static Bool
 QueryHardware (LocalDevicePtr local)
 {
-        DBGOUT(2, "EVTouch: %s\n", __FUNCTION__);
-
-        return Success;
+    EVTouchPrivatePtr priv = (EVTouchPrivatePtr) (local->private);
+    size_t len;
+    int i, num_buttons;
+
+    DBGOUT(2, "EVTouch: %s\n", __FUNCTION__);
+
+    if (ioctl(local->fd, EVIOCGNAME(sizeof(priv->name) - 1), priv->name) < 0) {
+	    xf86Msg(X_ERROR, "ioctl EVIOCGNAME failed: %s\n", strerror(errno));
+	    goto error;
+    }
+
+    len = ioctl(local->fd, EVIOCGBIT(0, sizeof(priv->bitmask)), priv->bitmask);
+    if (len < 0) {
+	    xf86Msg(X_ERROR, "%s: ioctl EVIOCGBIT failed: %s\n",
+			    local->name, strerror(errno));
+	    goto error;
+    }
+
+    len = ioctl(local->fd, EVIOCGBIT(EV_REL, sizeof(priv->rel_bitmask)), priv->rel_bitmask);
+    if (len < 0) {
+	    xf86Msg(X_ERROR, "%s: ioctl EVIOCGBIT failed: %s\n",
+			    local->name, strerror(errno));
+	    goto error;
+    }
+
+    len = ioctl(local->fd, EVIOCGBIT(EV_ABS, sizeof(priv->abs_bitmask)), priv->abs_bitmask);
+    if (len < 0) {
+	    xf86Msg(X_ERROR, "%s: ioctl EVIOCGBIT failed: %s\n",
+			    local->name, strerror(errno));
+	    goto error;
+    }
+
+    len = ioctl(local->fd, EVIOCGBIT(EV_KEY, sizeof(priv->key_bitmask)), priv->key_bitmask);
+    if (len < 0) {
+	    xf86Msg(X_ERROR, "%s: ioctl EVIOCGBIT failed: %s\n",
+			    local->name, strerror(errno));
+	    goto error;
+    }
+
+    num_buttons = 0;
+
+    /* count all buttons */
+    for (i = BTN_MISC; i < BTN_JOYSTICK; i++)
+    {
+        if (TestBit(i, priv->key_bitmask))
+        {
+            if (i > num_buttons)
+                num_buttons = i;
+        }
+    }
+    if (num_buttons)
+    {
+        priv->flags |= EVTOUCH_BUTTON_EVENTS;
+        priv->num_buttons = num_buttons;
+        xf86Msg(X_INFO, "%s: Found %d mouse buttons\n", local->name,
+                num_buttons);
+    }
+
+    for (i = 0; i < REL_MAX; i++) {
+        if (TestBit(i, priv->rel_bitmask)) {
+            xf86Msg(X_INFO, "%s: Found relative axes\n", local->name);
+            priv->flags |= EVTOUCH_RELATIVE_EVENTS;
+            break;
+        }
+    }
+
+    for (i = 0; i < ABS_MAX; i++) {
+        if (TestBit(i, priv->abs_bitmask)) {
+            xf86Msg(X_INFO, "%s: Found absolute axes\n", local->name);
+            priv->flags |= EVTOUCH_ABSOLUTE_EVENTS;
+            break;
+        }
+    }
+
+    return Success;
+error:
+    return (!Success);
 }
 
 
-
-
 static Bool
 DeviceOn (DeviceIntPtr dev)
 {
         LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate;
         EVTouchPrivatePtr priv = (EVTouchPrivatePtr) (local->private);
-        
+
         local->fd = xf86OpenSerial(local->options);
 
         DBGOUT(2, "EVTouch: %s\n", __FUNCTION__ );
@@ -512,8 +582,7 @@
 
         DBG (9, XisbTrace (priv->buffer, 1));
 
-
-        if (!priv->buffer) 
+        if (!priv->buffer)
         {
                 xf86CloseSerial(local->fd);
                 local->fd = -1;
@@ -531,7 +600,6 @@
         if (ioctl(local->fd, EVIOCGRAB, (void *)1))
                 xf86Msg(X_ERROR, "%s: Unable to grab device (%s).\n", local->name, strerror(errno));
 
-
 #ifndef XFREE86_V4
         xf86AddEnabledDevice(local);
 #else
@@ -544,8 +612,6 @@
 }
 
 
-
-
 static Bool
 DeviceOff (DeviceIntPtr dev)
 {
@@ -555,7 +621,7 @@
         DBGOUT(2, "EVTouch: %s\n", __FUNCTION__ );
 
         if (local->fd != -1)
-        { 
+        {
                 ioctl(local->fd, EVIOCGRAB, (void *)0);
                 xf86RemoveEnabledDevice (local);
                 if (priv->buffer)
@@ -577,6 +643,73 @@
 }
 
 
+static Atom *EvtouchInitButtonLabels(void)
+{
+#ifdef HAVE_LABELS
+    Atom *labels = xalloc(EV_MAX_BUTTONS * sizeof(Atom));
+
+    /* initialize the 5 button labels used by this driver */
+    labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+    labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+    labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+    labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
+    labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+
+    return labels;
+#endif
+}
+
+static char* abs_labels[] = {
+    AXIS_LABEL_PROP_ABS_X,
+    AXIS_LABEL_PROP_ABS_Y,
+    AXIS_LABEL_PROP_ABS_Z,
+    AXIS_LABEL_PROP_ABS_WHEEL
+};
+static char* rel_labels[] = {
+    AXIS_LABEL_PROP_REL_X,
+    AXIS_LABEL_PROP_REL_Y,
+    AXIS_LABEL_PROP_REL_Z,
+    AXIS_LABEL_PROP_REL_WHEEL
+};
+
+static void
+EvtouchInitAxesLabels(EVTouchPrivatePtr pEVTouch, int natoms, Atom *atoms)
+{
+#ifdef HAVE_LABELS
+    Atom atom;
+    int axis;
+    char **labels;
+    int labels_len = 0;
+    char *misc_label;
+
+    if (pEVTouch->flags & EVTOUCH_ABSOLUTE_EVENTS)
+    {
+        labels     = abs_labels;
+        labels_len = ArrayLength(abs_labels);
+        misc_label = AXIS_LABEL_PROP_ABS_MISC;
+    } else if ((pEVTouch->flags & EVTOUCH_RELATIVE_EVENTS))
+    {
+        labels     = rel_labels;
+        labels_len = ArrayLength(rel_labels);
+        misc_label = AXIS_LABEL_PROP_REL_MISC;
+    }
+
+    memset(atoms, 0, natoms * sizeof(Atom));
+
+    /* Now fill the ones we know */
+    for (axis = 0; axis < labels_len; axis++)
+    {
+        if (pEVTouch->axis_map[axis] == -1)
+            continue;
+
+        atom = XIGetKnownProperty(labels[axis]);
+        if (!atom) /* Should not happen */
+            continue;
+
+        atoms[pEVTouch->axis_map[axis]] = atom;
+    }
+#endif
+}
 
 
 static Bool
@@ -585,6 +718,7 @@
         DBGOUT(2, "EVTouch: %s\n", __FUNCTION__);
         LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate;
         EVTouchPrivatePtr priv = (EVTouchPrivatePtr) (local->private);
+	Atom *labels, *atoms;
         unsigned char map[EV_MAX_BUTTONS];
         int i;
 
@@ -593,7 +727,7 @@
 
         priv->btn_count = EV_MAX_BUTTONS;
 
-        /* 
+        /*
          * these have to be here instead of in the SetupProc, because when the
          * SetupProc is run at server startup, screenInfo is not setup yet
          */
@@ -603,9 +737,9 @@
         priv->screen_height = pScrn->virtualY;
         priv->pViewPort_X0  = &(pScrn->frameX0);   /* initialize the pointers to the viewport coords */
         if ( (priv->screen_width != priv->phys_width) ||
-             (priv->screen_height != priv->phys_height) ) 
+             (priv->screen_height != priv->phys_height) )
               priv->virtual = 1;
-        else  
+        else
                 priv->virtual = 0;
 
         priv->pViewPort_Y0  = &(pScrn->frameY0);
@@ -620,24 +754,29 @@
         DBGOUT(2, "EVTouch: MaxValue H,V: %d %d\n", pScrn->maxHValue, pScrn->maxVValue);
 
         priv->screen_width = screenInfo.screens[priv->screen_num]->width;
-        priv->screen_height = screenInfo.screens[priv->screen_num]->height;        
+        priv->screen_height = screenInfo.screens[priv->screen_num]->height;
 
-        /* 
+        /*
          * Device reports button press for 5 buttons.
          */
-        if (InitButtonClassDeviceStruct (dev, EV_MAX_BUTTONS, map) == FALSE)
+	labels = EvtouchInitButtonLabels();
+        if (InitButtonClassDeviceStruct (dev, EV_MAX_BUTTONS,
+#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
+				labels,
+#endif
+				map) == FALSE)
         {
                 ErrorF("Unable to allocate EVTouch touchscreen ButtonClassDeviceStruct\n");
                 return BadAlloc;
-        } 
+        }
 
-        DBGOUT(2, "EVTouch: %s btn_count=%d\n", __FUNCTION__, 
+        DBGOUT(2, "EVTouch: %s btn_count=%d\n", __FUNCTION__,
                priv->btn_count);
         priv->btn_actions = xcalloc(priv->btn_count, sizeof(BtnAction));
-        memset(priv->btn_actions, 0, 
+        memset(priv->btn_actions, 0,
                priv->btn_count * sizeof(BtnAction));
-        
-        DBGOUT(2, "EVTouch: %s btn_count=%d\n", __FUNCTION__, 
+
+        DBGOUT(2, "EVTouch: %s btn_count=%d\n", __FUNCTION__,
                priv->btn_count);
 
         if (InitFocusClassDeviceStruct(dev) == FALSE) {
@@ -645,13 +784,18 @@
                 return !Success;
         }
 
-        /* 
+        /*
          * Device reports motions on 2 axes in absolute coordinates.
          * Axes min and max values are reported in raw coordinates.
          */
+	atoms = xalloc(2 * sizeof(Atom));
+	EvtouchInitAxesLabels(priv, 2, atoms);
+
         if (InitValuatorClassDeviceStruct(dev, 2,
 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0
                                           xf86GetMotionEvents,
+#elif GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
+					  atoms,
 #endif
                                           local->history_size, Absolute) == FALSE)
         {
@@ -660,12 +804,20 @@
         }
 
 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 2
-        xf86InitValuatorAxisStruct(dev, 0, 0, priv->screen_width,
+        xf86InitValuatorAxisStruct(dev, 0,
+#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
+			           atoms[0],
+#endif
+			           0, priv->screen_width,
                                    1024,
                                    EV_AXIS_MIN_RES /* min_res */ ,
                                    EV_AXIS_MAX_RES /* max_res */ );
         xf86InitValuatorDefaults(dev, 0);
-        xf86InitValuatorAxisStruct(dev, 1, 0, priv->screen_height,
+        xf86InitValuatorAxisStruct(dev, 1,
+#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
+			           atoms[1],
+#endif
+                                   0, priv->screen_height,
                                    1024,
                                    EV_AXIS_MIN_RES /* min_res */ ,
                                    EV_AXIS_MAX_RES /* max_res */ );
@@ -682,7 +834,6 @@
 	priv->raw_y=priv->cur_y;
         libtouchSetPos(priv->libtouch, priv->cur_x, priv->cur_y);
 
-        
         if (InitProximityClassDeviceStruct (dev) == FALSE)
         {
                 ErrorF ("Unable to allocate EVTouch touchscreen ProximityClassDeviceStruct\n");
@@ -695,7 +846,7 @@
                 return !Success;
         }
 
-        /* 
+        /*
          * Allocate the motion events buffer.
          */
         xf86MotionHistoryAllocate (local);
@@ -765,7 +916,7 @@
                 if (sizeof(priv->ev) == count) {
                         count = 0;
                         EVTouchDumpPacketToLog(priv);
-                        
+
                         return Success;
                 }
         }
Index: xserver-xorg-input-evtouch/evtouch.h
===================================================================
--- xserver-xorg-input-evtouch.orig/evtouch.h	2010-02-14 14:01:43.000000000 +0900
+++ xserver-xorg-input-evtouch/evtouch.h	2010-02-14 14:08:34.000000000 +0900
@@ -35,6 +35,22 @@
 #define DBGOUT(lvl, ...)
 #endif
 
+#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
+#define HAVE_PROPERTIES 1
+
+/* 1.6 has properties, but no labels */
+#ifdef AXIS_LABEL_PROP
+#define HAVE_LABELS
+#else
+#undef HAVE_LABELS
+#endif
+
+#endif
+
+#define LONG_BITS (sizeof(long) * 8)
+/* Number of longs needed to hold the given number of bits */
+#define NLONGS(x) (((x) + LONG_BITS - 1) / LONG_BITS)
+
 /******************************************************************************
  *  Definitions
  *  structs, typedefs, #defines, enums
@@ -52,6 +68,10 @@
 
 #define EV_MAX_BUTTONS        5
 
+#define EVTOUCH_BUTTON_EVENTS		0x01
+#define EVTOUCH_RELATIVE_EVENTS		0x02
+#define EVTOUCH_ABSOLUTE_EVENTS		0x04
+
 #define TOUCHED 0x01
 #define X_COORD 0x02
 #define Y_COORD 0x04
@@ -80,6 +100,8 @@
         int min_rel_y;  /* Minimum y reported by calibration        */
         int max_rel_y;  /* Maximum y                    */
 
+	int axis_map[max(ABS_CNT, REL_CNT)]; /* Map evtouch <axis> to index */
+
         int drag_timer;
         Bool emulate3;
         int emulate3_timeout;
@@ -129,10 +151,10 @@
         int screen_num;    /* Screen associated with the device */
         int screen_width;   /* Width of the associated X screen  */
         int screen_height;   /* Height of the screen              */
-        
+
         XISBuffer *buffer;
         struct input_event ev; /* packet being/just read */
-        
+
         int packeti;    /* index into packet */
         Bool cs7flag;
         Bool binary_pkt;   /* indicates packet was a binary touch */
@@ -141,6 +163,16 @@
 
         LibTouchRecPtr libtouch;
         LocalDevicePtr local;
+
+	/* Cached info from device. */
+	int flags;
+	int num_buttons;
+	char name[1024];
+	unsigned long bitmask[NLONGS(EV_CNT)];
+	unsigned long key_bitmask[NLONGS(KEY_CNT)];
+	unsigned long rel_bitmask[NLONGS(REL_CNT)];
+	unsigned long abs_bitmask[NLONGS(ABS_CNT)];
+
 } EVTouchPrivateRec, *EVTouchPrivatePtr;