Package: xserver-xorg-input-evdev Version: 1:2.0.8-1 Severity: normal
I've configured xorg to access my bluetooth mouse with evdev, but each time the mouse goes idle (after a few minutes of inactivity), the driver try to reconnect N times each 100ms and then definitly close the device. The attached patch allow infinite attempts, and allow set the delay between attempts in xorg.conf Maybe there is a better way to do achieve this bluetooth mouse reconnection ? -- working InputDevice section from my xorg.conf Section "InputDevice" Identifier "Configured Mouse" Driver "evdev" Option "CorePointer" Option "Device" "/dev/input/by-path/pci-0000:00:1d.7-usb-0:acl000xxxxxxxx-event-" Option "SendCoreEvents" "true" Option "ReopenAttempts" "0" Option "ReopenDelay" "1000" EndSection -- System Information: Debian Release: 5.0 APT prefers testing APT policy: (900, 'testing') Architecture: amd64 (x86_64) Kernel: Linux 2.6.26-1-amd64 (SMP w/2 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages xserver-xorg-input-evdev depends on: ii libc6 2.7-16 GNU C Library: Shared libraries ii xserver-xorg-core 2:1.4.2-9 Xorg X server - core server xserver-xorg-input-evdev recommends no packages. xserver-xorg-input-evdev suggests no packages. -- no debconf information
diff --git a/src/evdev.c b/src/evdev.c index d186be0..6b7d71e 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -182,8 +182,13 @@ EvdevReopenTimer(OsTimerPtr timer, CARD32 time, pointer arg) { if (EvdevCacheCompare(pInfo, TRUE) == Success) { - xf86Msg(X_INFO, "%s: Device reopened after %d attempts.\n", pInfo->name, - pEvdev->reopen_attempts - pEvdev->reopen_left + 1); + if (pEvdev->reopen_attempts>0) + { + xf86Msg(X_INFO, "%s: Device reopened after %d attempts.\n", pInfo->name, + pEvdev->reopen_attempts - pEvdev->reopen_left + 1); + } else { + xf86Msg(X_INFO, "%s: Device reopened.\n", pInfo->name); + } EvdevOn(pInfo->dev); } else { @@ -197,9 +202,12 @@ EvdevReopenTimer(OsTimerPtr timer, CARD32 time, pointer arg) return 0; } - pEvdev->reopen_left--; + if (pEvdev->reopen_attempts) + { + pEvdev->reopen_left--; + } - if (!pEvdev->reopen_left) + if (!pEvdev->reopen_left && (pEvdev->reopen_attempts>0)) { xf86Msg(X_ERROR, "%s: Failed to reopen device after %d attempts.\n", pInfo->name, pEvdev->reopen_attempts); @@ -230,13 +238,13 @@ EvdevReadInput(InputInfoPtr pInfo) * event, so len != sizeof ev is an error. */ xf86Msg(X_ERROR, "%s: Read error: %s\n", pInfo->name, strerror(errno)); - if (errno == ENODEV) /* May happen after resume */ + if (errno == ENODEV) /* May happen after resume (or when the device goes idle)*/ { xf86RemoveEnabledDevice(pInfo); close(pInfo->fd); pInfo->fd = -1; pEvdev->reopen_left = pEvdev->reopen_attempts; - pEvdev->reopen_timer = TimerSet(NULL, 0, 100, EvdevReopenTimer, pInfo); + pEvdev->reopen_timer = TimerSet(NULL, 0, pEvdev->reopen_delay, EvdevReopenTimer, pInfo); } break; } @@ -932,7 +940,7 @@ EvdevOn(DeviceIntPtr device) if (pInfo->fd == -1) { pEvdev->reopen_left = pEvdev->reopen_attempts; - pEvdev->reopen_timer = TimerSet(NULL, 0, 100, EvdevReopenTimer, pInfo); + pEvdev->reopen_timer = TimerSet(NULL, 0, pEvdev->reopen_delay, EvdevReopenTimer, pInfo); } else { xf86AddEnabledDevice(pInfo); @@ -1302,6 +1310,7 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags) } pEvdev->reopen_attempts = xf86SetIntOption(pInfo->options, "ReopenAttempts", 10); + pEvdev->reopen_delay = xf86SetIntOption(pInfo->options, "ReopenDelay", 100); pEvdev->noXkb = noXkbExtension; /* parse the XKB options during kbd setup */ diff --git a/src/evdev.h b/src/evdev.h index 9f16b81..1554ee3 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -71,7 +70,8 @@ typedef struct { Time expires; /* time of expiry */ Time timeout; } emulateMB; - int reopen_attempts; /* max attempts to re-open after read failure */ + int reopen_delay; /* delay between attempts to re-open after read failure */ + int reopen_attempts; /* max attempts to re-open after read failure (0 = infinite) */ int reopen_left; /* number of attempts left to re-open the device */ OsTimerPtr reopen_timer;