2022-08-31 12:20:58 +00:00
-- This file is part of Reno desktop.
--
-- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
--
-- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see <https://www.gnu.org/licenses/>.
2022-07-23 19:10:02 +00:00
-- Asynchronous XDG data aggregator
local menu_utils = require ( " menubar.utils " )
local menu_gen = require ( " menubar.menu_gen " )
local gears = require ( " gears " )
2023-01-16 12:47:51 +00:00
local json = require ( " dkjson " )
2023-05-27 14:57:46 +00:00
local lib = require ( " xdg_data " )
2022-07-23 19:10:02 +00:00
menu_utils.wm_name = " "
-- Directories to scan for .desktop files
2023-05-06 08:56:25 +00:00
local desktop_dirs = { os.getenv ( " HOME " ) .. " /Desktop " }
2022-07-23 19:10:02 +00:00
local desktop_dirs_complete = 0
2023-01-16 12:47:51 +00:00
local _ = ( ( table.concat ( gears.filesystem . get_xdg_data_dirs ( ) , " : " ) or
" /usr/share:/usr/local/share " ) .. " : " .. os.getenv ( " HOME " ) .. " /.local/share " ) : gsub ( " [^:]* " , function ( path )
2022-07-23 19:10:02 +00:00
if gears.filesystem . dir_readable ( path .. " /applications " ) then
table.insert ( desktop_dirs , path .. " /applications " )
end
end )
2023-01-16 12:47:51 +00:00
-- Global xdg data struct
2023-05-27 14:57:46 +00:00
_G.xdg = lib.init_xdg_struct ( )
2023-01-16 12:47:51 +00:00
-- Load cached applications
2023-05-27 14:57:46 +00:00
local cache = lib.load_xdg_cache ( )
2023-01-16 12:47:51 +00:00
-- Add missing category entries as defined by awesome
2023-05-27 14:57:46 +00:00
lib.add_categories ( xdg , menu_gen.all_categories )
2022-07-23 19:10:02 +00:00
-- Asynchronous scanning process
2023-05-27 14:57:46 +00:00
lib.async_process_dirs ( xdg , desktop_dirs , cache , function ( v )
-- Count completed directory
desktop_dirs_complete = desktop_dirs_complete + 1
-- Call a global signal
awesome.emit_signal ( " xdg::dir_finished " , v )
end )
2023-01-16 12:47:51 +00:00
local count = function ( t )
local n = 0
for _ , _ in pairs ( t ) do
n = n + 1
end
return n
2022-07-23 19:10:02 +00:00
end
2023-01-16 12:47:51 +00:00
2022-07-23 19:10:02 +00:00
awesome.connect_signal ( " xdg::dir_finished " , function ( dir )
2023-01-16 12:47:51 +00:00
-- We only send the all_finished signal when all directories finished processing
2022-07-23 19:10:02 +00:00
if desktop_dirs_complete == # desktop_dirs then
-- Clean up empty categories
for k , v in pairs ( xdg.categories ) do
2023-01-16 12:47:51 +00:00
if count ( v.apps ) == 0 then
2022-07-23 19:10:02 +00:00
xdg.categories [ k ] = nil
end
end
2023-01-16 12:47:51 +00:00
-- Save the cache if it doesn't exist yet
io.open ( gears.filesystem . get_xdg_cache_home ( ) .. " .reno_xdg_cache.json " , " w " ) : write ( json.encode ( xdg ) ) : close ( )
-- Finally, call the all_finished signal
awesome.emit_signal ( " xdg::all_finished " )
2022-07-23 19:10:02 +00:00
end
end )
2023-01-19 15:23:50 +00:00
-- Before exiting, save all xdg cache
awesome.connect_signal ( " exit " , function ( )
io.open ( gears.filesystem . get_xdg_cache_home ( ) .. " .reno_xdg_cache.json " , " w " ) : write ( json.encode ( xdg ) ) : close ( )
end )