|
| 1 | +local ffi = require("ffi") |
| 2 | + |
| 3 | +local util = require("evdev.util") |
| 4 | + |
| 5 | +local libevdev_uinput = require("evdev.libevdev-uinput") |
| 6 | +local evdev_uinput_enum = libevdev_uinput.enum |
| 7 | +local evdev_uinput = libevdev_uinput.lib |
| 8 | + |
| 9 | +local libevdev_uinput_open_mode = evdev_uinput_enum.libevdev_uinput_open_mode |
| 10 | + |
| 11 | +---@class UInputDevice |
| 12 | +---@field device Device |
| 13 | +---@field uinput_dev ffi.cdata* |
| 14 | +local UInputDevice = {} |
| 15 | + |
| 16 | +---@param device Device |
| 17 | +---@param uinput_fd_or_pathname? number |
| 18 | +---@param flags? nil|number[] |
| 19 | +---@return UInputDevice |
| 20 | +local function init(class, device, uinput_fd_or_pathname, flags) |
| 21 | + ---@type UInputDevice |
| 22 | + local self = setmetatable({}, { __index = class }) |
| 23 | + |
| 24 | + local uinput_fd, fd_err = util.to_fd(uinput_fd_or_pathname, flags) |
| 25 | + if fd_err then |
| 26 | + return nil, fd_err |
| 27 | + end |
| 28 | + |
| 29 | + if not uinput_fd then |
| 30 | + uinput_fd = libevdev_uinput_open_mode.MANAGED |
| 31 | + end |
| 32 | + |
| 33 | + local uinput_dev_ptr = libevdev_uinput.ctype.libevdev_uinput_ptr() |
| 34 | + |
| 35 | + local rc = evdev_uinput.libevdev_uinput_create_from_device(device.dev, uinput_fd, uinput_dev_ptr) |
| 36 | + if rc < 0 then |
| 37 | + return nil, string.format("Error: %s", util.err_string(-rc)) |
| 38 | + end |
| 39 | + |
| 40 | + self.device = device |
| 41 | + self.uinput_dev = uinput_dev_ptr[0] |
| 42 | + |
| 43 | + ffi.gc(self.uinput_dev, evdev_uinput.libevdev_uinput_destroy) |
| 44 | + |
| 45 | + return self |
| 46 | +end |
| 47 | + |
| 48 | +---@param device Device |
| 49 | +---@param uinput_fd_or_pathname? number |
| 50 | +---@param flags? nil|number[] |
| 51 | +---@return UInputDevice |
| 52 | +function UInputDevice:new(device, uinput_fd_or_pathname, flags) |
| 53 | + return init(self, device, uinput_fd_or_pathname, flags) |
| 54 | +end |
| 55 | + |
| 56 | +---@return number |
| 57 | +function UInputDevice:fd() |
| 58 | + return evdev_uinput.libevdev_uinput_get_fd(self.uinput_dev) |
| 59 | +end |
| 60 | + |
| 61 | +---@return string |
| 62 | +function UInputDevice:syspath() |
| 63 | + return util.to_string(evdev_uinput.libevdev_uinput_get_syspath(self.uinput_dev)) |
| 64 | +end |
| 65 | + |
| 66 | +---@return string |
| 67 | +function UInputDevice:devnode() |
| 68 | + return util.to_string(evdev_uinput.libevdev_uinput_get_devnode(self.uinput_dev)) |
| 69 | +end |
| 70 | + |
| 71 | +---@param ev_type number |
| 72 | +---@param code number |
| 73 | +---@param value number |
| 74 | +---@return boolean success |
| 75 | +function UInputDevice:write_event(ev_type, code, value) |
| 76 | + local rc = evdev_uinput.libevdev_uinput_write_event(self.uinput_dev, ev_type, code, value) |
| 77 | + return rc == 0 |
| 78 | +end |
| 79 | + |
| 80 | +return UInputDevice |
0 commit comments