| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- -- SPDX-License-Identifier: MIT
- --
- -- This is an example libinput plugin
- --
- -- This plugin delays any event with relative motion by the given DELAY
- -- by storing it in a table and replaying it via a timer callback later.
- -- UNCOMMENT THIS LINE TO ACTIVATE THE PLUGIN
- -- libinput:register({1})
- DELAY = 1500 * 1000 -- 1.5s
- next_timer_expiry = 0
- devices = {}
- function timer_expired(time_in_microseconds)
- next_timer_expiry = 0
- for device, frames in pairs(devices) do
- while #frames > 0 and frames[1].time <= time_in_microseconds do
- --- we don't have a current frame so it doesn't matter
- --- whether we prepend or append
- device:prepend_frame(frames[1].frame)
- table.remove(frames, 1)
- end
- local next_frame = frames[1]
- if next_frame and (next_timer_expiry == 0 or next_frame.time < next_timer_expiry) then
- next_timer_expiry = next_frame.time
- end
- end
- if next_timer_expiry ~= 0 then
- libinput:timer_set_absolute(next_timer_expiry)
- end
- end
- function frame(device, frame, timestamp)
- for _, v in ipairs(frame) do
- if v.usage == evdev.REL_X or v.usage == evdev.REL_Y then
- local next_time = timestamp + DELAY
- table.insert(devices[device], {
- time = next_time,
- frame = frame
- })
- if next_timer_expiry == 0 then
- next_timer_expiry = next_time
- libinput:timer_set_absolute(next_timer_expiry)
- end
- return {} -- discard frame
- end
- end
- return nil
- end
- function device_new(device)
- local usages = device:usages()
- if usages[evdev.REL_X] then
- devices[device] = {}
- device:connect("evdev-frame", frame)
- device:connect("device-removed", function(dev)
- devices[dev] = nil
- end)
- end
- end
- libinput:connect("new-evdev-device", device_new)
- libinput:connect("timer-expired", timer_expired)
|