/libevdev.nim

Raw NIM wrapper around libevdev

Primary LanguageNimrodMIT LicenseMIT

libevdev.nim

This is a raw wrapper around the libevdev library, used for reading events from the Linux event subsystem, such as keyboards, mice and touchscreens.

https://www.freedesktop.org/wiki/Software/libevdev/

I use it for reading events from an ads7846 touchscreen on a Raspberry Pi.

Example:

import strutils, os, posix
import libevdev, linux/input

proc main() =
  var found = false
  var evdev: ptr libevdev

  for device in walkPattern("/dev/input/event*"):
    let fd = open(device, O_RDONLY or O_NONBLOCK)
    if fd < 0:
      raiseOSError(OSErrorCode(errno), "could not open $1" % device)

    let ret = libevdev_new_from_fd(fd, addr evdev)
    if ret < 0:
      raiseOSError(OSErrorCode(errno), "could not create libevdev device for $1" % device)

    if libevdev_has_event_type(evdev, EV_REL):
      # looks like a mouse
      found = true
      break
    discard close(fd)

  if not found: quit("no devices")

  while true:
    var ev: input_event
    let rc = libevdev_next_event(evdev, cuint(LIBEVDEV_READ_FLAG_NORMAL), addr ev)
    if rc == cint(LIBEVDEV_READ_STATUS_SUCCESS):
      echo "Event: $1 $2 $3" % [
        $libevdev_event_type_get_name(ev.ev_type),
        $libevdev_event_code_get_name(ev.ev_type, ev.code),
        $ev.value]

main()

Assuming you are a member of the "input" group, you can run this with: nim c -r --passL:"-levdev" example.nim