aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/quarrel/bind.lua
blob: 4cb5d4422d918baa6881a08d5c3c8e7a2ddf6ec4 (plain)
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
57
58
59
60
61
62
63
local awful = require "awful"
local gtable = require "gears.table"
local qstore = require "quarrel.store"

local qbind = {}

qstore.bindings = {}

local function get_binding_function(trigger)
    if type(trigger) == "number" and trigger <= 5 and trigger > 0 then
        return "button"
    elseif type(trigger) == "string" then
        return "key"
    end
    error("trigger can only be a mouse button or a key", 2)
end

local function translate_binding(binding, trigger, multiple)
    local value = nil
    if multiple then
        value = trigger[2]
        trigger = trigger[1]
    end

    local awful_binding = {
        modifiers = binding.mods,
        [get_binding_function(trigger)] = trigger,
        on_press = multiple and function(...) binding.press(value, ...) end or binding.press
    }

    if binding.desc then
        awful_binding.description = binding.desc
    end
    if binding.group then
        awful_binding.group = binding.group
    end

    return awful[get_binding_function(trigger)](awful_binding)
end

function qbind:new(binding)
    if not binding.hidden then table.insert(qstore.bindings, binding) end
    binding.mods = binding.mods or {}

    local awful_bindings = {}

    if type(binding.triggers) == "table" then
        for _, trigger in ipairs(binding.triggers) do
            table.insert(awful_bindings, translate_binding(binding, trigger, true))
        end
    elseif type(binding.triggers) == "string" or type(binding.triggers) == "number" then
        return translate_binding(binding, binding.triggers, false)
    else
        error("binding.triggers can only be a string or a table")
    end

    -- for some reason multi-trigger bindings only work if i do this
    -- i spent a day debugging this
    -- thanks awesome
    return gtable.join(table.unpack(awful_bindings))
end

return qbind