local awful = require "awful" local gtable = require "gears.table" local insightful = require "ui.insightful" local qbind = {} 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(insightful._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