@@ -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 )
6275end
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
66114function Device :grab (mode )
0 commit comments