feat(awful: hotkeys widget): merge hotkeys with the same modifiers and descriptions
This commit is contained in:
parent
19437930a2
commit
8a9ae1a073
|
@ -36,7 +36,6 @@ end
|
||||||
|
|
||||||
|
|
||||||
local widget = {
|
local widget = {
|
||||||
hide_without_description = true,
|
|
||||||
title_font = "Monospace Bold 9",
|
title_font = "Monospace Bold 9",
|
||||||
description_font = "Monospace 8",
|
description_font = "Monospace 8",
|
||||||
width = dpi(1200),
|
width = dpi(1200),
|
||||||
|
@ -89,6 +88,13 @@ local widget = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
--- Don't show hotkeys without descriptions.
|
||||||
|
widget.hide_without_description = true
|
||||||
|
|
||||||
|
--- Merge hotkey records into one if they have the same modifiers and
|
||||||
|
-- description.
|
||||||
|
widget.merge_duplicates = true
|
||||||
|
|
||||||
|
|
||||||
local cached_wiboxes = {}
|
local cached_wiboxes = {}
|
||||||
local cached_awful_keys = nil
|
local cached_awful_keys = nil
|
||||||
|
@ -132,11 +138,24 @@ local function add_hotkey(key, data, target)
|
||||||
local group = data.group or "none"
|
local group = data.group or "none"
|
||||||
group_list[group] = true
|
group_list[group] = true
|
||||||
if not target[group] then target[group] = {} end
|
if not target[group] then target[group] = {} end
|
||||||
table.insert(
|
local new_key = {
|
||||||
target[group],
|
key = (widget.labels[key] or key),
|
||||||
{hotkey= joined_mods .. (widget.labels[key] or key),
|
mod = joined_mods,
|
||||||
description=data.description}
|
description = data.description
|
||||||
)
|
}
|
||||||
|
local index = data.description or "none" -- or use its hash?
|
||||||
|
if not target[group][index] then
|
||||||
|
target[group][index] = new_key
|
||||||
|
else
|
||||||
|
if widget.merge_duplicates and joined_mods == target[group][index].mod then
|
||||||
|
target[group][index].key = target[group][index].key .. "/" .. new_key.key
|
||||||
|
else
|
||||||
|
while target[group][index] do
|
||||||
|
index = index .. " "
|
||||||
|
end
|
||||||
|
target[group][index] = new_key
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -144,10 +163,15 @@ local function sort_hotkeys(target)
|
||||||
-- @TODO: add sort by 12345qwertyasdf etc
|
-- @TODO: add sort by 12345qwertyasdf etc
|
||||||
for group, _ in pairs(group_list) do
|
for group, _ in pairs(group_list) do
|
||||||
if target[group] then
|
if target[group] then
|
||||||
|
local sorted_table = {}
|
||||||
|
for index, key in pairs(target[group]) do
|
||||||
|
table.insert(sorted_table, key)
|
||||||
|
end
|
||||||
table.sort(
|
table.sort(
|
||||||
target[group],
|
sorted_table,
|
||||||
function(a,b) return a.hotkey<b.hotkey end
|
function(a,b) return (a.mod or '')..a.key<(b.mod or '')..b.key end
|
||||||
)
|
)
|
||||||
|
target[group] = sorted_table
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -238,8 +262,9 @@ local function create_wibox(s, available_groups)
|
||||||
local max_label_content = ""
|
local max_label_content = ""
|
||||||
local joined_labels = ""
|
local joined_labels = ""
|
||||||
for i, key in ipairs(_keys) do
|
for i, key in ipairs(_keys) do
|
||||||
local length = string.len(key.hotkey) + string.len(key.description)
|
local hotkey = (key.mod or '')..(key.key or '')
|
||||||
local rendered_hotkey = markup.font(widget.title_font, key.hotkey.." ") ..
|
local length = string.len(hotkey) + string.len(key.description)
|
||||||
|
local rendered_hotkey = markup.font(widget.title_font, hotkey.." ") ..
|
||||||
(markup.font(widget.description_font, key.description) or "")
|
(markup.font(widget.description_font, key.description) or "")
|
||||||
if length > max_label_width then
|
if length > max_label_width then
|
||||||
max_label_width = length
|
max_label_width = length
|
||||||
|
@ -386,8 +411,7 @@ end
|
||||||
--- Add hotkey descriptions for third-party applications.
|
--- Add hotkey descriptions for third-party applications.
|
||||||
-- @tparam table hotkeys Table with bindings,
|
-- @tparam table hotkeys Table with bindings,
|
||||||
-- see `awful.hotkeys_popup.key.vim` as an example.
|
-- see `awful.hotkeys_popup.key.vim` as an example.
|
||||||
-- @tparam[opt] bool nosort Do not sort hotkeys alphabetically.
|
function widget.add_hotkeys(hotkeys)
|
||||||
function widget.add_hotkeys(hotkeys, nosort)
|
|
||||||
for group, bindings in pairs(hotkeys) do
|
for group, bindings in pairs(hotkeys) do
|
||||||
for _, binding in ipairs(bindings) do
|
for _, binding in ipairs(bindings) do
|
||||||
local modifiers = binding.modifiers
|
local modifiers = binding.modifiers
|
||||||
|
@ -402,11 +426,10 @@ function widget.add_hotkeys(hotkeys, nosort)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not nosort then
|
sort_hotkeys(widget.additional_hotkeys)
|
||||||
sort_hotkeys(widget.additional_hotkeys)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
return widget
|
return widget
|
||||||
|
|
||||||
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
||||||
|
|
Loading…
Reference in New Issue