Skip to content

Commit 204aa16

Browse files
committed
feat: add evdev.uinput-device
1 parent 0278bee commit 204aa16

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

evdev/uinput-device.lua

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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

Comments
 (0)