2021-11-29 19:57:00 +11:00

247 lines
6.1 KiB
Lua

local awful = require('awful')
local gears = require('gears')
local beautiful = require('beautiful')
local apps = require('configuration.apps')
local menubar = require('menubar')
local awful_menu = awful.menu
local menu_gen = menubar.menu_gen
local menu_utils = menubar.utils
local icon_theme = require('menubar.icon_theme')
local hotkeys_popup = require('awful.hotkeys_popup').widget
local terminal = apps.default.terminal
local web_browser = apps.default.web_browser
local file_manager = apps.default.file_manager
local text_editor = apps.default.text_editor
local editor_cmd = terminal .. ' -e ' .. (os.getenv('EDITOR') or 'nano')
--[[
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 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 table
local menu = {}
-- Determines if a path points to a directory, by checking if it can be read
-- (which is `nil` also for empty files) and if its size is not 0.
-- @author blueyed
-- @param path the path to check
menu.is_dir = function(path)
local f = io.open(path)
return f and not f:read(0) and f:seek('end') ~= 0 and f:close()
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
menu.has_value = function(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
menu.build = function(args)
local args = args or {}
local icon_size = args.icon_size
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)
-- Set icon size
if icon_size then
for _,v in pairs(menu_gen.all_categories) do
v.icon = icon_theme():find_icon_path(v.icon_name, icon_size)
end
end
-- Hold the menu in the module
menu.menu = _menu
return _menu
end
-- Create a launcher widget and a main menu
awesome_menu = {
{
'Hotkeys',
function()
hotkeys_popup.show_help(nil, awful.screen.focused())
end,
menubar.utils.lookup_icon('keyboard')
},
{
'Edit config',
editor_cmd .. ' ' .. awesome.conffile,
menubar.utils.lookup_icon('accessories-text-editor')
},
{
'Restart',
awesome.restart,
menubar.utils.lookup_icon('system-restart')
},
{
'Quit',
function() awesome.quit() end,
menubar.utils.lookup_icon('system-log-out')
}
}
local default_app_menu = {
{
'Terminal',
terminal,
menubar.utils.lookup_icon('utilities-terminal')
},
{
'Web browser',
web_browser,
menubar.utils.lookup_icon('webbrowser-app')
},
{
'File Manager',
file_manager,
menubar.utils.lookup_icon('system-file-manager')
},
{
'Text Editor',
text_editor,
menubar.utils.lookup_icon('accessories-text-editor')
}
}
-- Screenshot menu
local screenshot_menu = {
{
'Full',
function()
gears.timer.start_new(
0.1,
function()
awful.spawn.easy_async_with_shell(apps.utils.full_screenshot)
end
)
end,
menubar.utils.lookup_icon('accessories-screenshot')
},
{
'Area',
function()
gears.timer.start_new(
0.1,
function()
awful.spawn.easy_async_with_shell(apps.utils.area_screenshot)
end,
menubar.utils.lookup_icon('accessories-screenshot')
)
end,
menubar.utils.lookup_icon('accessories-screenshot')
}
}
local tools_menu = {
{
'Awesome',
awesome_menu,
beautiful.awesome_icon
},
{
'Take a Screenshot',
screenshot_menu,
menubar.utils.lookup_icon('accessories-screenshot')
},
{
'End Session',
function()
awesome.emit_signal('module::exit_screen:show')
end,
menubar.utils.lookup_icon('system-shutdown')
}
}
mymainmenu = menu.build({
-- Not actually the size, but the quality of the icon
icon_size = 48,
before = default_app_menu,
after = tools_menu
})
mylauncher = awful.widget.launcher({image = beautiful.awesome_icon, menu = mymainmenu})