class EventFile(object): """Read from a file containing raw recorded events.""" def __init__(self, fname, mode="r"): self._fo = open(fname, mode) self._eventq = Queue() def read(self, amt=None): # amt not used, provided for compatibility. """Read a single Event object from stream.""" if not self._eventq: if not self._fill(): return None return self._eventq.pop() def readall(self): ev = self.read() while ev: yield ev ev = self.read() def _fill(self): raw = self._fo.read(EVsize * 32) if raw: for i in xrange(len(raw)/EVsize): ev = Event() ev.decode(raw[i*EVsize:(i+1)*EVsize]) self._eventq.push(ev) return True else: return False
class EventFile(object): """Read from a file containing raw recorded events.""" def __init__(self, fname, mode="r"): self._fo = open(fname, mode) self._eventq = Queue() def read(self, amt=None): # amt not used, provided for compatibility. """Read a single Event object from stream.""" if not self._eventq: if not self._fill(): return None return self._eventq.pop() def readall(self): ev = self.read() while ev: yield ev ev = self.read() def _fill(self): raw = self._fo.read(EVsize * 32) if raw: for i in xrange(len(raw) / EVsize): ev = Event() ev.decode(raw[i * EVsize:(i + 1) * EVsize]) self._eventq.push(ev) return True else: return False
class EventDevice(object): DEVNAME = None # must match name string of device def __init__(self, fname=None): self._fd = None self.name = "" self._eventq = Queue() self.idbus = self.idvendor = self.idproduct = self.idversion = None if fname: self._open(fname) def __str__(self): if self.idbus is None: self.get_deviceid() return "%s: bus=0x%x, vendor=0x%x, product=0x%x, version=0x%x" % \ (self.name, self.idbus, self.idvendor, self.idproduct, self.idversion) def _fill(self): global EVsize try: raw = os.read(self._fd, EVsize * 32) except EOFError: self.close() else: if raw: for i in range(len(raw)/EVsize): ev = Event() ev.decode(raw[i*EVsize:(i+1)*EVsize]) self._eventq.push(ev) def open(self, start=0): assert self.DEVNAME is not None for d in range(start, 16): try: self._open("/dev/input/event%d" % (d,)) except IOError: pass else: if self.name.startswith(self.DEVNAME): break else: self.close() def _open(self, filename): self._fd = os.open(filename, os.O_RDWR) name = fcntl.ioctl(self._fd, EVIOCGNAME, chr(0) * 256) self.name = name.replace(chr(0), '') def fileno(self): return self._fd def close(self): if self._fd is not None: os.close(self._fd) self._fd = None self.name = "" def read(self): if not self._eventq: self._fill() return self._eventq.pop() def readall(self): ev = self.read() while ev: yield ev ev = self.read() def write(self, evtype, code, value): ev = Event(0.0, evtype, code, value) return os.write(self._fd, ev.encode()) def get_driverversion(self): ver = fcntl.ioctl(self._fd, EVIOCGVERSION, '\x00\x00\x00\x00') return struct.unpack(INT, ver)[0] def get_deviceid(self): ver = fcntl.ioctl(self._fd, EVIOCGID, '\x00\x00\x00\x00\x00\x00\x00\x00') self.idbus, self.idvendor, self.idproduct, self.idversion = struct.unpack(SHORT4, ver) return self.idbus, self.idvendor, self.idproduct, self.idversion def readable(self): return bool(self._fd) def writable(self): return False def priority(self): return False def handle_read_event(self): self._fill() def handle_write_event(self): pass def handle_priority_event(self): pass def handle_hangup_event(self): pass
class EventDevice(object): DEVNAME = None # must match name string of device def __init__(self, fname=None): self._fd = None self.name = "" self._eventq = Queue() self.idbus = self.idvendor = self.idproduct = self.idversion = None if fname: self._open(fname) def __str__(self): if self.idbus is None: self.get_deviceid() return "%s: bus=0x%x, vendor=0x%x, product=0x%x, version=0x%x" % \ (self.name, self.idbus, self.idvendor, self.idproduct, self.idversion) def _fill(self): global EVsize try: raw = os.read(self._fd, EVsize * 32) except EOFError: self.close() else: if raw: for i in range(len(raw) / EVsize): ev = Event() ev.decode(raw[i * EVsize:(i + 1) * EVsize]) self._eventq.push(ev) def open(self, start=0): assert self.DEVNAME is not None for d in range(start, 16): try: self._open("/dev/input/event%d" % (d, )) except IOError: pass else: if self.name.startswith(self.DEVNAME): break else: self.close() def _open(self, filename): self._fd = os.open(filename, os.O_RDWR) name = fcntl.ioctl(self._fd, EVIOCGNAME, chr(0) * 256) self.name = name.replace(chr(0), '') def fileno(self): return self._fd def close(self): if self._fd is not None: os.close(self._fd) self._fd = None self.name = "" def read(self): if not self._eventq: self._fill() return self._eventq.pop() def readall(self): ev = self.read() while ev: yield ev ev = self.read() def write(self, evtype, code, value): ev = Event(0.0, evtype, code, value) return os.write(self._fd, ev.encode()) def get_driverversion(self): ver = fcntl.ioctl(self._fd, EVIOCGVERSION, '\x00\x00\x00\x00') return struct.unpack(INT, ver)[0] def get_deviceid(self): ver = fcntl.ioctl(self._fd, EVIOCGID, '\x00\x00\x00\x00\x00\x00\x00\x00') self.idbus, self.idvendor, self.idproduct, self.idversion = struct.unpack( SHORT4, ver) return self.idbus, self.idvendor, self.idproduct, self.idversion def readable(self): return bool(self._fd) def writable(self): return False def priority(self): return False def handle_read_event(self): self._fill() def handle_write_event(self): pass def handle_priority_event(self): pass def handle_hangup_event(self): pass
class EventDevice(object): DEVNAME = None # must match name string of device def __init__(self, fname=None): self._fd = None self.name = "" self._eventq = Queue() self.idbus = self.idvendor = self.idproduct = self.idversion = None if fname: self.open(fname) self.initialize() def __str__(self): if self.idbus is None: self.get_deviceid() return "%s: bus=0x%x, vendor=0x%x, product=0x%x, version=0x%x\n %s" % \ (self.name, self.idbus, self.idvendor, self.idproduct, self.idversion, self.get_features()) def _fill(self): global EVsize try: raw = os.read(self._fd, EVsize * 32) except EOFError: self.close() else: if raw: for i in range(len(raw) / EVsize): ev = Event() ev.decode(raw[i * EVsize:(i + 1) * EVsize]) self._eventq.push(ev) def find(self, start=0, name=None): name = name or self.DEVNAME assert name is not None, "EventDevice: no name to find" for d in range(start, 16): filename = "/dev/input/event%d" % (d, ) if os.path.exists(filename): try: self.open(filename) except (OSError, IOError): # probably no permissions pass else: if name in self.name: return self.close() raise IOError("Input device %r not found." % (name, )) def open(self, filename): self._fd = os.open(filename, os.O_RDWR) name = fcntl.ioctl(self._fd, EVIOCGNAME, chr(0) * 256) self.name = name.replace(chr(0), '') def fileno(self): return self._fd def close(self): if self._fd is not None: os.close(self._fd) self._fd = None self.name = "" def read(self): if not self._eventq: self._fill() return self._eventq.pop() def readall(self): ev = self.read() while ev: yield ev ev = self.read() def write(self, evtype, code, value): ev = Event(0.0, evtype, code, value) return os.write(self._fd, ev.encode()) def get_driverversion(self): ver = fcntl.ioctl(self._fd, EVIOCGVERSION, '\x00\x00\x00\x00') return struct.unpack(INT, ver)[0] def get_deviceid(self): ver = fcntl.ioctl(self._fd, EVIOCGID, '\x00\x00\x00\x00\x00\x00\x00\x00') self.idbus, self.idvendor, self.idproduct, self.idversion = struct.unpack( SHORT4, ver) return self.idbus, self.idvendor, self.idproduct, self.idversion def get_features(self): caps = fcntl.ioctl(self._fd, EVIOCGBIT(0), '\x00\x00\x00\x00') caps = struct.unpack(INT, caps)[0] return Features(caps) def readable(self): return bool(self._fd) def writable(self): return False def priority(self): return False def read_handler(self): self._fill() def write_handler(self): pass def pri_handler(self): pass def hangup_handler(self): pass def initialize(self): pass
class EventDevice(object): DEVNAME = None # must match name string of device def __init__(self, fname=None): self._fd = None self.name = "" self._eventq = Queue() self.idbus = self.idvendor = self.idproduct = self.idversion = None if fname: self.open(fname) self.initialize() def __str__(self): if self.idbus is None: self.get_deviceid() return "%s: bus=0x%x, vendor=0x%x, product=0x%x, version=0x%x\n %s" % \ (self.name, self.idbus, self.idvendor, self.idproduct, self.idversion, self.get_features()) def _fill(self): global EVsize try: raw = os.read(self._fd, EVsize * 32) except EOFError: self.close() else: if raw: for i in range(len(raw)/EVsize): ev = Event() ev.decode(raw[i*EVsize:(i+1)*EVsize]) self._eventq.push(ev) def find(self, start=0, name=None): name = name or self.DEVNAME assert name is not None, "EventDevice: no name to find" for d in range(start, 16): filename = "/dev/input/event%d" % (d,) if os.path.exists(filename): try: self.open(filename) except (OSError, IOError): # probably no permissions pass else: if name in self.name: return self.close() raise IOError("Input device %r not found." % (name,)) def open(self, filename): self._fd = os.open(filename, os.O_RDWR) name = fcntl.ioctl(self._fd, EVIOCGNAME, chr(0) * 256) self.name = name.replace(chr(0), '') def fileno(self): return self._fd def close(self): if self._fd is not None: os.close(self._fd) self._fd = None self.name = "" def read(self): if not self._eventq: self._fill() return self._eventq.pop() def readall(self): ev = self.read() while ev: yield ev ev = self.read() def write(self, evtype, code, value): ev = Event(0.0, evtype, code, value) return os.write(self._fd, ev.encode()) def get_driverversion(self): ver = fcntl.ioctl(self._fd, EVIOCGVERSION, '\x00\x00\x00\x00') return struct.unpack(INT, ver)[0] def get_deviceid(self): ver = fcntl.ioctl(self._fd, EVIOCGID, '\x00\x00\x00\x00\x00\x00\x00\x00') self.idbus, self.idvendor, self.idproduct, self.idversion = struct.unpack(SHORT4, ver) return self.idbus, self.idvendor, self.idproduct, self.idversion def get_features(self): caps = fcntl.ioctl(self._fd, EVIOCGBIT(0), '\x00\x00\x00\x00') caps = struct.unpack(INT, caps)[0] return Features(caps) def readable(self): return bool(self._fd) def writable(self): return False def priority(self): return False def read_handler(self): self._fill() def write_handler(self): pass def pri_handler(self): pass def hangup_handler(self): pass def initialize(self): pass