123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- --[[
- 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 })
- 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
|