Skip to content

Commit e77c00e

Browse files
committed
feat: add method :fd for evdev.device
1 parent 1587ba0 commit e77c00e

File tree

1 file changed

+54
-6
lines changed

1 file changed

+54
-6
lines changed

evdev/device.lua

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,10 @@ local Device = {}
1818

1919
---@param fd_or_pathname? number|string
2020
---@param flags? nil|number[]
21-
---@return Device
22-
local function init(class, fd_or_pathname, flags)
23-
---@type Device
24-
local self = setmetatable({}, { __index = class })
25-
26-
---@type nil|number
21+
---@return number fd, string|nil err
22+
local function get_fd(fd_or_pathname, flags)
2723
local fd
24+
2825
if type(fd_or_pathname) == "number" then
2926
fd = fd_or_pathname
3027
elseif type(fd_or_pathname) == "string" then
@@ -34,6 +31,21 @@ local function init(class, fd_or_pathname, flags)
3431
end
3532
end
3633

34+
return fd
35+
end
36+
37+
---@param fd_or_pathname? number|string
38+
---@param flags? nil|number[]
39+
---@return Device
40+
local function init(class, fd_or_pathname, flags)
41+
---@type Device
42+
local self = setmetatable({}, { __index = class })
43+
44+
local fd, fd_err = get_fd(fd_or_pathname, flags)
45+
if fd_err then
46+
return nil, fd_err
47+
end
48+
3749
if fd then
3850
local dev_ptr = libevdev.ctype.libevdev_ptr()
3951

@@ -42,6 +54,7 @@ local function init(class, fd_or_pathname, flags)
4254
return nil, string.format("Error: %s", util.err_string(-rc))
4355
end
4456

57+
self._fd = fd
4558
self.dev = dev_ptr[0]
4659
else
4760
self.dev = evdev.libevdev_new()
@@ -61,6 +74,41 @@ function Device:new(fd_or_pathname, flags)
6174
return init(self, fd_or_pathname, flags)
6275
end
6376

77+
---@param fd_or_pathname? number|string
78+
---@param flags? nil|number[]
79+
---@return number fd
80+
function Device:fd(fd_or_pathname, flags)
81+
if not fd_or_pathname then
82+
local fd = evdev.libevdev_get_fd(self.dev)
83+
if fd == -1 then
84+
self._fd = nil
85+
return nil
86+
end
87+
88+
self._fd = fd
89+
return self._fd
90+
end
91+
92+
local fd, fd_err = get_fd(fd_or_pathname, flags)
93+
if fd_err then
94+
return nil, fd_err
95+
end
96+
97+
local rc
98+
if self._fd then
99+
rc = evdev.libevdev_change_fd(self.dev, fd)
100+
else
101+
rc = evdev.libevdev_set_fd(self.dev, fd)
102+
end
103+
104+
if rc < 0 then
105+
return nil, string.format("Error: %s", util.err_string(-rc))
106+
end
107+
108+
self._fd = fd
109+
return self._fd
110+
end
111+
64112
---@param mode boolean|number `libevdev_grab_mode`
65113
---@return number
66114
function Device:grab(mode)

0 commit comments

Comments
 (0)