85 lines
2.3 KiB
Lua
85 lines
2.3 KiB
Lua
-- Libraries
|
|
local lgi = require("lgi")
|
|
local Gtk = lgi.require("Gtk", "3.0")
|
|
local Gio = lgi.Gio
|
|
local gears = require("gears")
|
|
local GLib = require("lgi").GLib
|
|
|
|
-- Get all .desktop files as gobjects
|
|
local app_info = Gio.AppInfo
|
|
local app_list = app_info.get_all()
|
|
|
|
-- Init a new Gtk theme from the users string
|
|
local gtk_theme = Gtk.IconTheme.new()
|
|
Gtk.IconTheme.set_custom_theme(gtk_theme, User_config.icon_theme)
|
|
|
|
---Gets the icon path from an AppInfo gicon.
|
|
---@param app Gio.AppInfo
|
|
---@return string path
|
|
function Get_gicon_path(app)
|
|
if not app then return "" end
|
|
local icon_info = gtk_theme:lookup_by_gicon(app, 64, 0)
|
|
if icon_info then
|
|
local path = icon_info:get_filename()
|
|
if path then
|
|
return path
|
|
end
|
|
end
|
|
return ""
|
|
end
|
|
|
|
---Takes a class and name string and tries to match it to an icon.
|
|
---@param class string
|
|
---@param name string
|
|
---@return string | nil icon_path
|
|
function Get_icon(class, name)
|
|
class = string.lower(class or "")
|
|
name = string.lower(name or "")
|
|
for _, app in ipairs(app_list) do
|
|
local desktop_app_info = Gio.DesktopAppInfo.new(app_info.get_id(app))
|
|
local icon_string = Gio.DesktopAppInfo.get_string(desktop_app_info, "Name")
|
|
if icon_string then
|
|
icon_string = string.lower(icon_string)
|
|
if icon_string:match(class) or class:match(icon_string) then
|
|
return Get_gicon_path(app_info.get_icon(app))
|
|
elseif (icon_string == name) or icon_string:match(name) or name:match(icon_string) then
|
|
return Get_gicon_path(app_info.get_icon(app))
|
|
end
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
---Will return every $XDG_DATA_DIRS
|
|
---@return table
|
|
local function get_paths()
|
|
local dirs = {}
|
|
|
|
local dir
|
|
for _, value in ipairs(GLib.get_system_data_dirs()) do
|
|
dir = GLib.build_filenamev({ value, "applications" })
|
|
if gears.filesystem.dir_readable(dir) then table.insert(dirs, dir) end
|
|
end
|
|
|
|
dir = GLib.build_filenamev({ GLib.get_user_data_dir(), "applications" })
|
|
if gears.filesystem.dir_readable(dir) then table.insert(dirs, dir) end
|
|
|
|
return dirs
|
|
end
|
|
|
|
---Returns every .desktop file into a table
|
|
---@param file string .desktop files
|
|
---@return string | nil path
|
|
function Get_desktop_values(file)
|
|
|
|
if not file or file == "" then
|
|
return
|
|
end
|
|
|
|
for _, dir in ipairs(get_paths()) do
|
|
if gears.filesystem.file_readable(dir .. "/" .. file, "r") then
|
|
return dir .. "/" .. file
|
|
end
|
|
end
|
|
end
|