From 32768f8acd49f49a3daa7965fc2672ca13306780 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 4 Sep 2008 18:41:13 +0930 Subject: Attempt to re-open devices on read errors. Coming back from resume may leave us with a file descriptor that can be opened but fails on the first read (ENODEV). In this case, try to open the device until it becomes available or until the predefined count expires. To be safe, we cache the information from the device and compare against it when we re-open. This way we ensure that if the topology changes under us, we don't open a completely different device. If a device has changed, we disable it. Adds option "ReopenAttempts" Conflicts: man/evdev.man src/evdev.c src/evdev.h --- src/evdev.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/evdev.h') diff --git a/src/evdev.h b/src/evdev.h index cad1eed..9f16b81 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -40,7 +40,11 @@ #include #endif +#define LONG_BITS (sizeof(long) * 8) +#define NBITS(x) (((x) + LONG_BITS - 1) / LONG_BITS) + typedef struct { + const char *device; int kernel24; int screen; int min_x, min_y, max_x, max_y; @@ -67,6 +71,18 @@ typedef struct { Time expires; /* time of expiry */ Time timeout; } emulateMB; + int reopen_attempts; /* max attempts to re-open after read failure */ + int reopen_left; /* number of attempts left to re-open the device */ + OsTimerPtr reopen_timer; + + /* Cached info from device. */ + char name[1024]; + long bitmask[NBITS(EV_MAX)]; + long key_bitmask[NBITS(KEY_MAX)]; + long rel_bitmask[NBITS(REL_MAX)]; + long abs_bitmask[NBITS(ABS_MAX)]; + long led_bitmask[NBITS(LED_MAX)]; + struct input_absinfo absinfo[ABS_MAX]; } EvdevRec, *EvdevPtr; /* Middle Button emulation */ -- cgit v1.2.3