247 lines
6.1 KiB
Lua
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})
|