File: 10-pointer-go-slower.lua

package info (click to toggle)
libinput 1.30.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 8,404 kB
  • sloc: ansic: 104,881; python: 3,570; sh: 183; makefile: 37; cpp: 7
file content (56 lines) | stat: -rw-r--r-- 1,498 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
-- SPDX-License-Identifier: MIT
--
-- An example plugin to make the pointer go three times as slow
--
-- Install this file in /etc/libinput/plugins and
--
-- UNCOMMENT THIS LINE TO ACTIVATE THE PLUGIN
-- libinput:register({1})
remainders = {}

function split(v)
    if math.abs(v) >= 1.0 then
        local i = math.floor(math.abs(v))
        local r = math.abs(v) % 1.0
        if v < 0.0 then
            i = -i
            r = -r
        end
        return i, r
    else
        return 0, v
    end
end

function decelerate(device, x, y)
    local remainder = remainders[device]
    local rx, ry = 0, 0
    if x ~= 0.0 then
        rx, remainder.x = split(remainder.x + x/3.0)
    end
    if y ~= 0.0 then
        ry, remainder.y = split(remainder.y + y/3.0)
    end

    return rx, ry
end

libinput:connect("new-evdev-device", function(device)
    local usages = device:usages()
    if usages[evdev.REL_X] then
        remainders[device] = { x = 0.0, y = 0.0 }
        device:connect("evdev-frame", function(device, frame, timestamp)
            for _, v in ipairs(frame) do
                if v.usage == evdev.REL_X then
                    v.value, _ = decelerate(device, v.value, 0.0)
                elseif v.usage == evdev.REL_Y then
                    _, v.value = decelerate(device, 0.0, v.value)
                end
            end
            return frame
        end)
        device:connect("device-removed", function(dev)
            remainders[dev] = nil
        end)
    end
end)