1.5.0 (Mar 24, 2022)

  • Fix documentation (#163, #160).

  • Re-enable TTY echo at evtest exit (#155).

  • Fix ImportError: sys.meta_path is None, Python is likely shutting down (#154).

  • Closing the input device file descriptor in InputDevice.close() now happens in the main thread, instead of in a new thread (reverts #146).

  • Fix util.find_ecodes_by_regex not working across all supported Python versions (#152).

1.4.0 (Jan 16, 2021)

  • Fix InputDevice.set_absinfo to allow setting parameters to zero.

  • Fix off-by-one in ioctl_EVIOCG_bits, which causes value at the end of the list to not be reported back (#131).

  • Fix set_absinfo to allow setting parameters to zero (#128).

  • Fix leak when returning BlockingIOError from a read (#143).

  • Fix “There is no current event loop in thread” error for non asyncio code (#146).

  • Prevent InputDevice destructor from blocking (#145).

  • Add missing return codes to os.strerror() calls and fix force feedback example in docs (#138).

  • Add the util.find_ecodes_by_regex() helper function.

1.3.0 (Jan 12, 2020)

  • Fix build on 32bit arches with 64bit time_t

  • Add functionality to query device properties. See InputDevice.input_props and the input_props argument to Uinput.

  • KeyEvent received an allow_unknown constructor argument, which determines what will happen when an event code cannot be mapped to a keycode. The default and behavior so far has been to raise KeyError. If set to True, the keycode will be set to the event code formatted as a hex number.

  • Add InputDevice.set_absinfo() and InputDevice.absinfo().

  • Instruct the asyncio event loop to stop monitoring the fd of the input device when the device is closed.

1.2.0 (Apr 7, 2019)

  • Add UInput support for the resolution parameter in AbsInfo. This brings support for the new method of uinput device setup, which was introduced in Linux 4.5 (thanks to @LinusCDE).

  • Vendor and product identifiers can be greater or equal to 0x8000 (thanks @ivaradi).

1.1.2 (Sep 1, 2018)

  • Fix installation on kernels <= 4.4.

  • Fix uinput creation ignoring absinfo settings.

1.1.0 (Aug 27, 2018)

  • Add support for handling force-feedback effect uploads (many thanks to @ndreys).

  • Fix typo preventing ff effects that need left coefficients from working.

1.0.0 (Jun 02, 2018)

  • Prevent Uinput device creation raising Objects/longobject.c:415: bad argument to internal function when a non-complete AbsInfo structure is passed. All missing AbsInfo fields are set to 0.

  • Fix Uinput device creation raising KeyError when a capability filtered by default is not present.

  • The InputDevice.fn attribute was deprecated in favor of InputDevice.path. Using the former will show a DeprecationWarning, but would otherwise continue working as before.

  • Fix InputDevice comparison raising AttributeError due to a non-existant path attribute.

  • Fix asyncio support in Python 3.5+.

  • Uploading FF effect now works both on Python 2.7 and Python 3+.

  • Remove the asyncore example from the tutorial.

0.8.1 (Mar 24, 2018)

  • Fix Python 2 compatibility issue in with Uinput.from_device.

  • Fix minor evdev.evtest formatting issue.

0.8.0 (Mar 22, 2018)

  • Fix InputDevice comparison on Python 2.

  • The device path is now considered when comparing two devices.

  • Fix UInput.from_device not correctly merging the capabilities of selected devices.

  • The list of excluded event types in UInput.from_device is now configurable. For example:

    UInput.from_device(dev, filtered_types=(EV_SYN, EV_FF))

    In addition, ecodes.EV_FF is now excluded by default.

  • Add a context manager for grabbing access to a device - InputDevice.grab_context. For example:

    with dev.grab_context():
  • Add the InputDevice.uniq attribute, which contains the unique identifier of the device. As with phys, this attribute may be empty (i.e. ‘’).

0.7.0 (Jun 16, 2017)

  • InputDevice now accepts objects that support the path protocol. For example:

    pth = pathlib.Path('/dev/input/event0')
    dev = evdev.InputDevice(pth)
  • Support path protocol in InputDevice. This means that InputDevice instances can be passed to callers that expect a os.PathLike object.

  • Exceptions raised during InputDevice.async_read() (and similar) are now handled properly (i.e. an exception is set on the returned future instead of leaking that exception into the event loop) (Fixes #67).

0.6.4 (Oct 07, 2016)

  • Exclude ecodes.c from source distribution (Fixes #63).

0.6.3 (Oct 06, 2016)

  • Add the UInput.from_device class method, which allows uinput device to be created with the capabiltiies of one or more existing input devices:

    ui = UInput.from_device('/dev/input1', '/dev/input2', **constructor_kwargs)
  • Add the build_ecodes distutils command, which generates the ecodes.c extension module. The new way of overwriting the evdev header locations is:

    python build \
      build_ecodes --evdev-headers path/input.h:path/input-event-codes.h \
      build_ext --include-dirs  path/ \

    The build* and install commands no longer have to be part of the same command-line (i.e. running install will reuse the outputs of the last build).

0.6.1 (Jun 04, 2016)

  • Disable tty echoing while evtest is running.

  • Allow evtest to listen to more than one devices.

  • The script now allows the location of the input header files to be overwritten. For example:

    python build_ext \
      --evdev-headers path/input.h:path/input-event-codes.h \
      --include-dirs  path/ \

0.6.0 (Feb 14, 2016)

  • Asyncio and async/await support (many thanks to @paulo-raca).

  • Add the ability to set the phys property of uinput devices (thanks @paulo-raca).

  • Add a generic InputDevice.set() method (thanks @paulo-raca).

  • Distribute the evtest script along with evdev.

  • Fix issue with generating ecodes.c in recent kernels (>= 4.4.0).

  • Fix absinfo item indexes in UInput.uinput_create() (thanks @forsenonlhaimaisentito).

  • More robust comparison of InputDevice objects (thanks @isia).

0.5.0 (Jun 16, 2015)

  • Write access to the input device is no longer mandatory. Evdev will first try to open the device for reading and writing and fallback to read-only. Methods that require write access (e.g. set_led()) will raise EvdevError if the device is open only for reading.

0.4.7 (Oct 07, 2014)

  • Fallback to distutils if setuptools is not available.

0.4.6 (Oct 07, 2014)

  • Rework documentation and docstrings once more.

  • Fix install on Python 3.4 (works around issue21121).

  • Fix ioctl() requested buffer size (thanks Jakub Wojciech Klama).

0.4.5 (Jul 06, 2014)

  • Add method for returning a list of the currently active keys - InputDevice.active_keys() (thanks @spasche).

  • Fix a potential buffer overflow in ioctl_capabilities() (thanks @spasche).

0.4.4 (Jun 04, 2014)

  • Calling InputDevice.read_one() should always return None, when there is nothing to be read, even in case of a EAGAIN errno (thanks JPP).

0.4.3 (Dec 19, 2013)

  • Silence OSError in destructor (thanks @polyphemus).

  • Make InputDevice.close() work in cases in which stdin (fd 0) has been closed (thanks @polyphemus).

0.4.2 (Dec 13, 2013)

  • Rework documentation and docstrings.

  • Call InputDevice.close() from InputDevice.__del__().

0.4.1 (Jul 24, 2013)

  • Fix reference counting in InputDevice.device_read(), InputDevice.device_read_many() and ioctl_capabilities().

0.4.0 (Jul 01, 2013)

  • Add FF_* and FF_STATUS codes to ecodes() (thanks @bgilbert).

  • Reverse event code mappings (ecodes.{KEY,FF,REL,ABS} and etc.) will now map to a list of codes, whenever a value corresponds to multiple codes:

    >>> ecodes.KEY[152]
    >>> ecodes.KEY[30]
    ... 'KEY_A'
  • Set the state of a LED through InputDevice.set_led() (thanks @accek).

  • Open InputDevice.fd in O_RDWR mode from now on.

  • Fix segfault in InputDevice.device_read_many() (thanks @bgilbert).

0.3.3 (May 29, 2013)

  • Raise IOError from InputDevice.device_read() and InputDevice.device_read_many() when fails.

  • Several stability and style changes (thank you debian code reviewers).

0.3.2 (Apr 05, 2013)

  • Fix vendor id and product id order in DeviceInfo() (thanks @kived).

0.3.1 (Nov 23, 2012)

  • will return an empty tuple if the device has nothing to offer (instead of segfaulting).

  • Exclude unnecessary package data in sdist and bdist.

0.3.0 (Nov 06, 2012)

  • Add ability to set/get auto-repeat settings with EVIOC{SG}REP.

  • Add InputDevice.version() - the value of EVIOCGVERSION.

  • Add InputDevice.read_loop().

  • Add InputDevice.grab() and InputDevice.ungrab() - exposes EVIOCGRAB.

  • Add InputDevice.leds() - exposes EVIOCGLED.

  • Replace DeviceInfo class with a namedtuple.

  • Prevent InputDevice.read_one() from skipping events.

  • Rename AbsData to AbsInfo (as in struct input_absinfo).

0.2.0 (Aug 22, 2012)

  • Add the ability to set arbitrary device capabilities on uinput devices (defaults to all EV_KEY ecodes).

  • Add UInput.device which is an open InputDevice to the input device that uinput ‘spawns’.

  • Add UInput.capabilities() which is just a shortcut to UInput.device.capabilities().

  • Rename UInput.write() to UInput.write_event().

  • Add a simpler UInput.write(type, code, value)() method.

  • Make all UInput() constructor arguments optional (default device name is now py-evdev-uinput).

  • Add the ability to set absmin, absmax, absfuzz and absflat when specifying the uinput device’s capabilities.

  • Remove the nophys argument - if a device fails the EVIOCGPHYS ioctl, phys will equal the empty string.

  • Make InputDevice.capabilities() perform a EVIOCGABS ioctl for devices that support EV_ABS and return that info wrapped in an AbsData namedtuple.

  • Split ioctl_devinfo into ioctl_devinfo and ioctl_capabilities.

  • Split UInput.uinput_open() to UInput.uinput_open() and UInput.uinput_create()

  • Add more uinput usage examples and documentation.

  • Rewrite uinput tests.

  • Remove mouserel and mouseabs from UInput.

  • Tie the sphinx version and release to the distutils version.

  • Set ‘methods-before-attributes’ sorting in the docs.

  • Remove KEY_CNT and KEY_MAX from ecodes.keys().

0.1.1 (May 18, 2012)

  • Add events.keys, which is a combination of all BTN_ and KEY_ event codes.

  • ecodes.c was not generated when installing through pip.

0.1.0 (May 17, 2012)

Initial Release