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