Initial commit
This commit is contained in:
128
lib/freedesktop/menu.lua
Normal file
128
lib/freedesktop/menu.lua
Normal file
@@ -0,0 +1,128 @@
|
||||
--[[
|
||||
|
||||
Awesome-Freedesktop
|
||||
Freedesktop.org compliant desktop entries and menu
|
||||
|
||||
Menu section
|
||||
|
||||
Licensed under GNU General Public License v2
|
||||
* (c) 2016, Luke Bonham
|
||||
* (c) 2014, Harvey Mittens
|
||||
|
||||
--]]
|
||||
|
||||
local Gio = require('lgi').Gio
|
||||
local awful_menu = require('awful.menu')
|
||||
local menu_gen = require('menubar.menu_gen')
|
||||
local menu_utils = require('menubar.utils')
|
||||
|
||||
local io, pairs, string, table, os = io, pairs, string, table, os
|
||||
|
||||
-- Expecting a wm_name of awesome omits too many applications and tools
|
||||
menu_utils.wm_name = ''
|
||||
|
||||
-- Menu
|
||||
-- freedesktop.menu
|
||||
local menu = {}
|
||||
|
||||
-- Check if a path is a directory.
|
||||
-- @tparam string path The directory path
|
||||
-- @treturn boolean True if path exists and is a directory
|
||||
function menu.is_dir(path)
|
||||
return Gio.File.new_for_path(path):query_file_type({}) == 'DIRECTORY'
|
||||
end
|
||||
|
||||
-- Remove non existent paths in order to avoid issues
|
||||
local existent_paths = {}
|
||||
for k, v in pairs(menu_gen.all_menu_dirs) do
|
||||
if menu.is_dir(v) then
|
||||
table.insert(existent_paths, v)
|
||||
end
|
||||
end
|
||||
menu_gen.all_menu_dirs = existent_paths
|
||||
|
||||
-- Determines whether an table includes a certain element
|
||||
-- @param tab a given table
|
||||
-- @param val the element to search for
|
||||
-- @return true if the given string is found within the search table; otherwise, false if not
|
||||
function menu.has_value(tab, val)
|
||||
for index, value in pairs(tab) do
|
||||
if val:find(value) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Use MenuBar parsing utils to build a menu for Awesome
|
||||
-- @return awful.menu
|
||||
function menu.build(args)
|
||||
local args = args or {}
|
||||
local before = args.before or {}
|
||||
local after = args.after or {}
|
||||
local skip_items = args.skip_items or {}
|
||||
local sub_menu = args.sub_menu or false
|
||||
|
||||
local result = {}
|
||||
local _menu = awful_menu({ items = before })
|
||||
|
||||
menu_gen.generate(function(entries)
|
||||
-- Add category icons
|
||||
for k, v in pairs(menu_gen.all_categories) do
|
||||
table.insert(result, { k, {}, v.icon })
|
||||
end
|
||||
|
||||
-- Get items table
|
||||
for k, v in pairs(entries) do
|
||||
for _, cat in pairs(result) do
|
||||
if cat[1] == v.category then
|
||||
if not menu.has_value(skip_items, v.name) then
|
||||
table.insert(cat[2], { v.name, v.cmdline, v.icon })
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Cleanup things a bit
|
||||
for i = #result, 1, -1 do
|
||||
local v = result[i]
|
||||
if #v[2] == 0 then
|
||||
-- Remove unused categories
|
||||
table.remove(result, i)
|
||||
else
|
||||
--Sort entries alphabetically (by name)
|
||||
table.sort(v[2], function(a, b)
|
||||
return string.byte(a[1]) < string.byte(b[1])
|
||||
end)
|
||||
-- Replace category name with nice name
|
||||
v[1] = menu_gen.all_categories[v[1]].name
|
||||
end
|
||||
end
|
||||
|
||||
-- Sort categories alphabetically also
|
||||
table.sort(result, function(a, b)
|
||||
return string.byte(a[1]) < string.byte(b[1])
|
||||
end)
|
||||
|
||||
-- Add menu item to hold the generated menu
|
||||
if sub_menu then
|
||||
result = { { sub_menu, result } }
|
||||
end
|
||||
|
||||
-- Add items to menu
|
||||
for _, v in pairs(result) do
|
||||
_menu:add(v)
|
||||
end
|
||||
for _, v in pairs(after) do
|
||||
_menu:add(v)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Hold the menu in the module
|
||||
menu.menu = _menu
|
||||
|
||||
return _menu
|
||||
end
|
||||
|
||||
return menu
|
||||
Reference in New Issue
Block a user