Reuse the routine that links tools with the same product ID devices
for different product ID devices to avoid duplicated code.

Signed-off-by: Ping Cheng <pi...@wacom.com>
---
 src/wcmConfig.c | 79 +++++++++++++++++++++++++--------------------------------
 1 file changed, 35 insertions(+), 44 deletions(-)

diff --git a/src/wcmConfig.c b/src/wcmConfig.c
index 2d19944..103fc15 100644
--- a/src/wcmConfig.c
+++ b/src/wcmConfig.c
@@ -388,8 +388,13 @@ wcmInitModel(InputInfoPtr pInfo)
 /**
  * Link the touch tool to the pen of the same device
  * so we can arbitrate the events when posting them.
+ *
+ * @param allow_different_id TRUE to check different product IDs
+ *
+ * @return True if found a touch tool for hybrid devices.
+ * false otherwise.
  */
-static void wcmLinkTouchAndPen(InputInfoPtr pInfo)
+static Bool wcmLinkTouchAndPen(InputInfoPtr pInfo, Bool allow_different_id)
 {
        WacomDevicePtr priv = pInfo->private;
        WacomCommonPtr common = priv->common;
@@ -397,50 +402,22 @@ static void wcmLinkTouchAndPen(InputInfoPtr pInfo)
        WacomCommonPtr tmpcommon = NULL;
        WacomDevicePtr tmppriv = NULL;
 
-       /* Lookup to find the associated pen and touch with same product id */
+       /* Lookup to find the associated pen and touch */
        for (; device != NULL; device = device->next)
        {
-               if (!strcmp(device->drv->driverName, "wacom"))
-               {
-                       tmppriv = (WacomDevicePtr) device->private;
-                       tmpcommon = tmppriv->common;
-
-                       /* skip the same tool or already linked devices */
-                       if ((tmppriv == priv) || tmpcommon->wcmTouchDevice)
-                               continue;
+               if (strcmp(device->drv->driverName, "wacom"))
+                       continue;
 
-                       if (tmpcommon->tablet_id == common->tablet_id)
-                       {
-                               if (IsTouch(tmppriv) && IsTablet(priv))
-                                       common->wcmTouchDevice = tmppriv;
-                               else if (IsTouch(priv) && IsTablet(tmppriv))
-                                       tmpcommon->wcmTouchDevice = priv;
-
-                               if (common->wcmTouchDevice ||
-                                               tmpcommon->wcmTouchDevice)
-                               {
-                                       TabletSetFeature(common, WCM_PENTOUCH);
-                                       TabletSetFeature(tmpcommon, 
WCM_PENTOUCH);
-                               }
-                       }
+               tmppriv = (WacomDevicePtr) device->private;
+               tmpcommon = tmppriv->common;
 
-                       if (common->wcmTouchDevice)
-                               return;
-               }
-       }
+               /* skip the same tool or already linked devices */
+               if ((tmppriv == priv) || tmpcommon->wcmTouchDevice)
+                       continue;
 
-       /* Lookup for pen and touch devices with different product ids */
-       for (; device != NULL; device = device->next)
-       {
-               if (!strcmp(device->drv->driverName, "wacom"))
+               if (((tmpcommon->tablet_id == common->tablet_id) && 
!allow_different_id) ||
+                  ((tmpcommon->tablet_id == common->tablet_id) && 
allow_different_id))
                {
-                       tmppriv = (WacomDevicePtr) device->private;
-                       tmpcommon = tmppriv->common;
-
-                       /* skip the same tool or already linked devices */
-                       if ((tmppriv == priv) || tmpcommon->wcmTouchDevice)
-                               continue;
-
                        if (IsTouch(tmppriv) && IsTablet(priv))
                                common->wcmTouchDevice = tmppriv;
                        else if (IsTouch(priv) && IsTablet(tmppriv))
@@ -451,11 +428,25 @@ static void wcmLinkTouchAndPen(InputInfoPtr pInfo)
                                TabletSetFeature(common, WCM_PENTOUCH);
                                TabletSetFeature(tmpcommon, WCM_PENTOUCH);
                        }
-
-                       if (common->wcmTouchDevice)
-                               return;
                }
+               if (common->wcmTouchDevice)
+                       return TRUE;
        }
+       return FALSE;
+}
+
+/**
+ * Update festures for tablets that support both pen and touch.
+ * Pen and touch of the same device can have same product id,
+ * such as Intuos and most Cintiq series; or different product
+ * ids, such as Cintiq 24HD. We look for pen and touch with same
+ * product id first. If we do not find a touch tool, devices
+ * with different product ids will be searched.
+ */
+static void wcmUpdatePenAndTouchInfo(InputInfoPtr pInfo)
+{
+       if (!wcmLinkTouchAndPen(pInfo, FALSE))
+               wcmLinkTouchAndPen(pInfo, TRUE);
 }
 
 /**
@@ -606,11 +597,11 @@ static int wcmPreInit(InputDriverPtr drv, InputInfoPtr 
pInfo, int flags)
                pInfo->fd = -1;
        }
 
-       /* only link them once per port. We need to try for both tablet tool
+       /* only update once per port. We need to try for both tablet tool
         * and touch since we do not know which tool will be added first.
         */
        if (IsTouch(priv) || (IsTablet(priv) && !common->wcmTouchDevice))
-               wcmLinkTouchAndPen(pInfo);
+               wcmUpdatePenAndTouchInfo(pInfo);
 
        free(type);
        free(oldname);
-- 
1.8.3.2


------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121051231&iu=/4140/ostg.clktrk
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to