1
0

10-delay-motion.lua 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. -- SPDX-License-Identifier: MIT
  2. --
  3. -- This is an example libinput plugin
  4. --
  5. -- This plugin delays any event with relative motion by the given DELAY
  6. -- by storing it in a table and replaying it via a timer callback later.
  7. -- UNCOMMENT THIS LINE TO ACTIVATE THE PLUGIN
  8. -- libinput:register({1})
  9. DELAY = 1500 * 1000 -- 1.5s
  10. next_timer_expiry = 0
  11. devices = {}
  12. function timer_expired(time_in_microseconds)
  13. next_timer_expiry = 0
  14. for device, frames in pairs(devices) do
  15. while #frames > 0 and frames[1].time <= time_in_microseconds do
  16. --- we don't have a current frame so it doesn't matter
  17. --- whether we prepend or append
  18. device:prepend_frame(frames[1].frame)
  19. table.remove(frames, 1)
  20. end
  21. local next_frame = frames[1]
  22. if next_frame and (next_timer_expiry == 0 or next_frame.time < next_timer_expiry) then
  23. next_timer_expiry = next_frame.time
  24. end
  25. end
  26. if next_timer_expiry ~= 0 then
  27. libinput:timer_set_absolute(next_timer_expiry)
  28. end
  29. end
  30. function frame(device, frame, timestamp)
  31. for _, v in ipairs(frame) do
  32. if v.usage == evdev.REL_X or v.usage == evdev.REL_Y then
  33. local next_time = timestamp + DELAY
  34. table.insert(devices[device], {
  35. time = next_time,
  36. frame = frame
  37. })
  38. if next_timer_expiry == 0 then
  39. next_timer_expiry = next_time
  40. libinput:timer_set_absolute(next_timer_expiry)
  41. end
  42. return {} -- discard frame
  43. end
  44. end
  45. return nil
  46. end
  47. function device_new(device)
  48. local usages = device:usages()
  49. if usages[evdev.REL_X] then
  50. devices[device] = {}
  51. device:connect("evdev-frame", frame)
  52. device:connect("device-removed", function(dev)
  53. devices[dev] = nil
  54. end)
  55. end
  56. end
  57. libinput:connect("new-evdev-device", device_new)
  58. libinput:connect("timer-expired", timer_expired)