aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/ui/insightful/init.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/awesome/ui/insightful/init.lua')
-rw-r--r--.config/awesome/ui/insightful/init.lua273
1 files changed, 273 insertions, 0 deletions
diff --git a/.config/awesome/ui/insightful/init.lua b/.config/awesome/ui/insightful/init.lua
new file mode 100644
index 0000000..4ed6099
--- /dev/null
+++ b/.config/awesome/ui/insightful/init.lua
@@ -0,0 +1,273 @@
+local awful = require "awful"
+local gtable = require "gears.table"
+local h = require "misc.helpers"
+local vars = require "misc.vars"
+local wibox = require "wibox"
+local rubato = require "lib.rubato"
+local btn = awful.button.names
+
+local first_time = true
+local mouse = "󰍽 "
+
+local insightful = {}
+
+insightful._toggled = false
+insightful._bindings = {}
+insightful._selected_group = ""
+
+insightful._keymap = {
+ Control = "Control",
+ Mod1 = "Alt",
+ ISO_Level3_Shift = "Alt Gr",
+ Mod4 = "Super",
+ Insert = "Insert",
+ Delete = "Delete",
+ Next = "Page Up",
+ Prior = "Page Down",
+ Left = "",
+ Up = "",
+ Right = "",
+ Down = "",
+ KP_End = "1",
+ KP_Down = "#2",
+ KP_Next = "#3",
+ KP_Left = "#4",
+ KP_Begin = "#5",
+ KP_Right = "#6",
+ KP_Home = "#7",
+ KP_Up = "#8",
+ KP_Prior = "#9",
+ KP_Insert = "#0",
+ KP_Delete = "#.",
+ KP_Divide = "#/",
+ KP_Multiply = "#*",
+ KP_Subtract = "#-",
+ KP_Add = "#+",
+ KP_Enter = "#Enter",
+ Escape = "Esc",
+ Tab = "Tab",
+ space = "Space",
+ Return = "Enter",
+ dead_acute = "´",
+ dead_circumflex = "^",
+ dead_grave = "`",
+ XF86MonBrightnessUp = "🔆+",
+ XF86MonBrightnessDown = "🔅-",
+ XF86AudioRaiseVolume = "ﱛ",
+ XF86AudioLowerVolume = "ﱜ",
+ XF86AudioMute = "ﱝ",
+ XF86AudioPlay = "⏯",
+ XF86AudioPrev = "⏮",
+ XF86AudioNext = "⏭",
+ XF86AudioStop = "⏹",
+ [tostring(btn.LEFT)] = mouse .. "Left",
+ [tostring(btn.MIDDLE)] = mouse .. "Middle",
+ [tostring(btn.RIGHT)] = mouse .. "Right"
+}
+
+insightful._widget = h.popup {
+ visible = false,
+ ontop = true,
+ placement = awful.placement.centered,
+ minimum_height = screen[1].geometry.height / 2,
+ minimum_width = screen[1].geometry.width / 2,
+ widget = {
+ layout = wibox.layout.fixed.vertical,
+ spacing = vars.big_padding,
+ id = "layout_container"
+ }
+}
+
+function insightful:_generate()
+ local grouped_binds = {}
+ local layout_container = insightful._widget.widget.layout_container
+
+ for _, keybind in ipairs(self._bindings) do
+ local group = keybind.group or "general"
+ local group_exists = grouped_binds[group] ~= nil
+
+ if not group_exists then
+ grouped_binds[group] = {}
+ end
+
+ table.insert(grouped_binds[group], {
+ mods = keybind.mods,
+ triggers = keybind.triggers,
+ desc = keybind.desc
+ })
+ end
+
+ for group, keybinds in h.opairs(grouped_binds) do
+ local group_layout = {
+ spacing = vars.padding,
+ layout = wibox.layout.fixed.vertical
+ }
+
+ for _, keybind in ipairs(keybinds) do
+ local key_layout = {
+ layout = wibox.layout.fixed.horizontal
+ }
+
+ local key_and_desc_layout = {
+ nil, -- key
+ nil,
+ nil, -- description?
+ layout = wibox.layout.align.horizontal
+ }
+
+ for _, mod in ipairs(keybind.mods) do
+ table.insert(key_layout, 1, h.styled {
+ widget = wibox.container.background,
+ bg = vars.colors.bright.black,
+ border_width = 0,
+ {
+ widget = wibox.container.margin,
+ margins = vars.padding,
+ {
+ widget = wibox.widget.textbox,
+ text = insightful._keymap[mod] or mod
+ }
+ }
+ })
+ table.insert(key_layout, 2, {
+ widget = wibox.widget.textbox,
+ text = " + "
+ })
+ end
+
+ if type(keybind.triggers) == "string" or type(keybind.triggers) == "number" then
+ table.insert(key_layout, {
+ widget = wibox.widget.textbox,
+ text = insightful._keymap[tostring(keybind.triggers)] or keybind.triggers
+ })
+ elseif type(keybind.triggers) == "table" then
+ local display_trigger = {}
+ for _, trigger in ipairs(keybind.triggers) do
+ table.insert(display_trigger, insightful._keymap[trigger[1]] or trigger[1])
+ end
+ table.insert(key_layout, {
+ widget = wibox.widget.textbox,
+ text = table.concat(display_trigger, "/")
+ })
+ end
+
+ if keybind.desc then
+ key_and_desc_layout[3] = {
+ widget = wibox.container.background,
+ fg = vars.colors.dim.fg,
+ {
+ widget = wibox.widget.textbox,
+ text = keybind.desc
+ }
+ }
+ end
+
+ key_and_desc_layout[1] = key_layout
+
+ table.insert(group_layout, key_and_desc_layout)
+ end
+
+ layout_container:add {
+ {
+ {
+ widget = wibox.container.background,
+ bg = vars.colors.yellow,
+ fg = vars.colors.bg,
+ shape = vars.shape,
+ {
+ widget = wibox.container.margin,
+ margins = vars.padding,
+ {
+ widget = wibox.widget.textbox,
+ text = group
+ }
+ }
+ },
+ nil,
+ layout = wibox.layout.align.horizontal
+ },
+ group_layout,
+ spacing = vars.padding,
+ layout = wibox.layout.fixed.vertical
+ }
+ end
+end
+
+local timed = rubato.timed {
+ duration = vars.anim_duration,
+ intro = vars.anim_intro,
+ pos = 0,
+ subscribed = function(pos)
+ insightful._widget.opacity = pos
+
+ if pos == 0 then
+ insightful._widget.visible = false
+ else
+ insightful._widget.visible = true
+ end
+ end
+}
+
+function insightful:toggle()
+ if first_time then
+ insightful:_generate_widget()
+ first_time = false
+ end
+
+ timed.target = insightful._toggled and 0 or 1
+ insightful._toggled = not insightful._toggled
+end
+
+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 insightful:bind(binding)
+ local awful_bindings = {}
+ table.insert(self._bindings, binding)
+
+ 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 insightful