rpms/xorg-x11-drv-synaptics/F-11 synaptics-1.1.0-nograb-fail.patch, NONE, 1.1 xorg-x11-drv-synaptics.spec, 1.29, 1.30

Peter Hutterer whot at fedoraproject.org
Tue May 5 02:09:07 UTC 2009


Author: whot

Update of /cvs/pkgs/rpms/xorg-x11-drv-synaptics/F-11
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv18135

Modified Files:
	xorg-x11-drv-synaptics.spec 
Added Files:
	synaptics-1.1.0-nograb-fail.patch 
Log Message:
* Tue May 05 2009 Peter Hutterer <peter.hutterer at redhat.com>  1.1.0-5
- synaptics-1.1.0-nograb-fail.patch: fail if the device cannot be grabbed
  (#499058)


synaptics-1.1.0-nograb-fail.patch:

--- NEW FILE synaptics-1.1.0-nograb-fail.patch ---
>From 28059f4290cd737235badc7fa59d3a7584fd8d6f Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer at who-t.net>
Date: Thu, 30 Apr 2009 16:03:43 +1000
Subject: [PATCH] eventcomm: if we can't grab the device, assume it's not a touchpad.

If a device is configured in the xorg.conf, it will get added once in the
config, once through HAL. Since we grab the device, the second device will be
mute. And confuses tools and users alike.

So let's just assume that if we can't grab the device, it doesn't exist.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

This patch squashes in the following upstream patches:
 a9a4439 If QueryHardware failed, return that failure and clean up.
 6dc7f5e Only try to free the timer if it's actually there.


---
 src/eventcomm.c    |   57 +++++++++++++++++++++++++++++++++++++++------------
 src/synaptics.c    |   18 ++++++++++++++-
 src/synapticsstr.h |    1 +
 3 files changed, 60 insertions(+), 16 deletions(-)

diff --git a/src/eventcomm.c b/src/eventcomm.c
index c0ca449..c1b1232 100644
--- a/src/eventcomm.c
+++ b/src/eventcomm.c
@@ -58,6 +58,14 @@
 static void
 EventDeviceOnHook(LocalDevicePtr local, SynapticsSHM *para)
 {
+    SynapticsPrivate *priv = (SynapticsPrivate *)local->private;
+    BOOL *need_grab;
+
+    if (!priv->proto_data)
+        priv->proto_data = xcalloc(1, sizeof(BOOL));
+
+    need_grab = (BOOL*)priv->proto_data;
+
     if (para->grab_event_device) {
 	/* Try to grab the event device so that data don't leak to /dev/input/mice */
 	int ret;
@@ -67,6 +75,8 @@ EventDeviceOnHook(LocalDevicePtr local, SynapticsSHM *para)
 		    local->name, errno);
 	}
     }
+
+    *need_grab = FALSE;
 }
 
 static void
@@ -75,44 +85,57 @@ EventDeviceOffHook(LocalDevicePtr local)
 }
 
 static Bool
-event_query_is_touchpad(int fd)
+event_query_is_touchpad(int fd, BOOL grab)
 {
-    int ret;
+    int ret = FALSE;
     unsigned long evbits[NBITS(EV_MAX)];
     unsigned long absbits[NBITS(ABS_MAX)];
     unsigned long keybits[NBITS(KEY_MAX)];
 
+    if (grab)
+    {
+        SYSCALL(ret = ioctl(fd, EVIOCGRAB, (pointer)1));
+        if (ret < 0)
+            return FALSE;
+    }
+
     /* Check for ABS_X, ABS_Y, ABS_PRESSURE and BTN_TOOL_FINGER */
 
     SYSCALL(ret = ioctl(fd, EVIOCGBIT(0, sizeof(evbits)), evbits));
     if (ret < 0)
-	return FALSE;
+	goto unwind;
     if (!TEST_BIT(EV_SYN, evbits) ||
 	!TEST_BIT(EV_ABS, evbits) ||
 	!TEST_BIT(EV_KEY, evbits))
-	return FALSE;
+	goto unwind;
 
     SYSCALL(ret = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits));
     if (ret < 0)
-	return FALSE;
+	goto unwind;
     if (!TEST_BIT(ABS_X, absbits) ||
 	!TEST_BIT(ABS_Y, absbits))
-	return FALSE;
+	goto unwind;
 
     SYSCALL(ret = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits));
     if (ret < 0)
-	return FALSE;
+	goto unwind;
 
     /* we expect touchpad either report raw pressure or touches */
     if (!TEST_BIT(ABS_PRESSURE, absbits) && !TEST_BIT(BTN_TOUCH, keybits))
-	return FALSE;
+	goto unwind;
     /* all Synaptics-like touchpad report BTN_TOOL_FINGER */
     if (!TEST_BIT(BTN_TOOL_FINGER, keybits))
-	return FALSE;
+	goto unwind;
     if (TEST_BIT(BTN_TOOL_PEN, keybits))
-	return FALSE;			    /* Don't match wacom tablets */
+	goto unwind;			    /* Don't match wacom tablets */
 
-    return TRUE;
+    ret = TRUE;
+
+unwind:
+    if (grab)
+        SYSCALL(ioctl(fd, EVIOCGRAB, (pointer)0));
+
+    return ret;
 }
 
 static void
@@ -219,7 +242,10 @@ event_query_axis_ranges(LocalDevicePtr local)
 static Bool
 EventQueryHardware(LocalDevicePtr local, struct SynapticsHwInfo *synhw)
 {
-    if (!event_query_is_touchpad(local->fd))
+    SynapticsPrivate *priv = (SynapticsPrivate *)local->private;
+    BOOL *need_grab = (BOOL*)priv->proto_data;
+
+    if (!event_query_is_touchpad(local->fd, (need_grab) ? *need_grab : TRUE))
 	return FALSE;
 
     xf86Msg(X_PROBED, "%s touchpad found\n", local->name);
@@ -376,7 +402,10 @@ static int EventDevOnly(const struct dirent *dir) {
 static void
 EventReadDevDimensions(LocalDevicePtr local)
 {
-    if (event_query_is_touchpad(local->fd))
+    SynapticsPrivate *priv = (SynapticsPrivate *)local->private;
+    BOOL *need_grab = (BOOL*)priv->proto_data;
+
+    if (event_query_is_touchpad(local->fd, (need_grab) ? *need_grab : TRUE))
 	event_query_axis_ranges(local);
     event_query_info(local);
 }
@@ -412,7 +441,7 @@ EventAutoDevProbe(LocalDevicePtr local)
 			if (fd < 0)
 				continue;
 
-			if (event_query_is_touchpad(fd)) {
+			if (event_query_is_touchpad(fd, TRUE)) {
 				touchpad_found = TRUE;
 			    xf86Msg(X_PROBED, "%s auto-dev sets device to %s\n",
 				    local->name, fname);
diff --git a/src/synaptics.c b/src/synaptics.c
index ee1239a..1a241ae 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -637,6 +637,7 @@ SynapticsPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
 	XisbFree(priv->comm.buffer);
     free_param_data(priv);
     xfree(priv->timer);
+    xfree(priv->proto_data);
     xfree(priv);
     local->private = NULL;
     return local;
@@ -650,7 +651,11 @@ static void SynapticsUnInit(InputDriverPtr drv,
                             InputInfoPtr   local,
                             int            flags)
 {
-    xfree(((SynapticsPrivate *)local->private)->timer);
+    SynapticsPrivate *priv = ((SynapticsPrivate *)local->private);
+    if (priv && priv->timer)
+        xfree(priv->timer);
+    if (priv && priv->proto_data)
+        xfree(priv->proto_data);
     xfree(local->private);
     local->private = NULL;
     xf86DeleteInput(local, 0);
@@ -727,7 +732,15 @@ DeviceOn(DeviceIntPtr dev)
     xf86FlushInput(local->fd);
 
     /* reinit the pad */
-    QueryHardware(local);
+    if (!QueryHardware(local))
+    {
+        XisbFree(priv->comm.buffer);
+        priv->comm.buffer = NULL;
+        xf86CloseSerial(local->fd);
+        local->fd = -1;
+        return !Success;
+    }
+
     xf86AddEnabledDevice(local);
     dev->public.on = TRUE;
 
@@ -2202,6 +2215,7 @@ QueryHardware(LocalDevicePtr local)
     } else {
 	xf86Msg(X_PROBED, "%s: no supported touchpad found\n", local->name);
 	priv->proto_ops->DeviceOffHook(local);
+	return FALSE;
     }
 
     return TRUE;
diff --git a/src/synapticsstr.h b/src/synapticsstr.h
index f518c11..b5083f2 100644
--- a/src/synapticsstr.h
+++ b/src/synapticsstr.h
@@ -92,6 +92,7 @@ typedef struct _SynapticsPrivateRec
     SynapticsSHM *synpara;		/* Current parameter settings. Will point to
 					   shared memory if shm_config is true */
     struct SynapticsProtocolOperations* proto_ops;
+    void *proto_data;
 
     struct SynapticsHwState hwState;
 
-- 
1.6.3.rc1.1.g81c43.dirty



Index: xorg-x11-drv-synaptics.spec
===================================================================
RCS file: /cvs/pkgs/rpms/xorg-x11-drv-synaptics/F-11/xorg-x11-drv-synaptics.spec,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -p -r1.29 -r1.30
--- xorg-x11-drv-synaptics.spec	4 May 2009 23:42:04 -0000	1.29
+++ xorg-x11-drv-synaptics.spec	5 May 2009 02:08:37 -0000	1.30
@@ -7,7 +7,7 @@
 Name:           xorg-x11-drv-synaptics
 Summary:        Xorg X11 Synaptics touchpad input driver
 Version:        1.1.0
-Release:        4%{?dist}
+Release:        5%{?dist}
 URL:            http://www.x.org
 License:        MIT
 Group:          User Interface/X Hardware Support
@@ -21,6 +21,8 @@ Source2:        make-git-snapshot.sh
 Patch1:         synaptics-1.1.0-synclient-64.patch
 Patch2:		synaptics-1.1.0-allocate-timer-early.patch
 Patch3:         synaptics-1.1.0-edges.patch
+# https://bugzilla.redhat.com/show_bug.cgi?id=499058
+Patch4:         synaptics-1.1.0-nograb-fail.patch
 
 ExcludeArch:    s390 s390x
 
@@ -81,6 +83,7 @@ Features:
 %patch1 -p1
 %patch2 -p1
 %patch3 -p1
+%patch4 -p1
 
 %build
 autoreconf -v --install --force || exit 1
@@ -129,6 +132,10 @@ Development files for the Synaptics Touc
 
 
 %changelog
+* Tue May 05 2009 Peter Hutterer <peter.hutterer at redhat.com>  1.1.0-5
+- synaptics-1.1.0-nograb-fail.patch: fail if the device cannot be grabbed
+  (#499058)
+
 * Tue May 05 2009 Peter Hutterer <peter.hutterer at redhat.com> 1.1.0-4
 - synaptics-1.1.0-edges.patch: Set default edge sizes depending on model
   (#494766).




More information about the fedora-extras-commits mailing list