135 lines
3.5 KiB
Lua
135 lines
3.5 KiB
Lua
local Gio = require("lgi").Gio
|
|
local Gtk = require("lgi").Gtk
|
|
local gobject = require("gears.object")
|
|
local gtable = require("gears.table")
|
|
local helpers = require("helpers")
|
|
local setmetatable = setmetatable
|
|
local ipairs = ipairs
|
|
|
|
local icon_theme = { mt = {} }
|
|
|
|
function icon_theme:get_client_icon_path(client)
|
|
local function find_icon(class)
|
|
if self._private.client_icon_cache[class] ~= nil then
|
|
return self._private.client_icon_cache[class]
|
|
end
|
|
|
|
for _, app in ipairs(Gio.AppInfo.get_all()) do
|
|
local id = Gio.AppInfo.get_id(app)
|
|
if id:match(helpers.misc.case_insensitive_pattern(class)) then
|
|
self._private.client_icon_cache[class] = self:get_gicon_path(Gio.AppInfo.get_icon(app))
|
|
return self._private.client_icon_cache[class]
|
|
end
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
local class = client.class
|
|
if class == "jetbrains-studio" then
|
|
class = "android-studio"
|
|
end
|
|
|
|
local icon = self:get_icon_path("gnome-window-manager")
|
|
|
|
if class ~= nil then
|
|
class = class:gsub("[%-]", "%%%0")
|
|
icon = find_icon(class) or icon
|
|
|
|
class = client.class
|
|
class = class:gsub("[%-]", "")
|
|
icon = find_icon(class) or icon
|
|
|
|
class = client.class
|
|
class = class:gsub("[%-]", ".")
|
|
icon = find_icon(class) or icon
|
|
|
|
class = client.class
|
|
class = class:match("(.-)-") or class
|
|
class = class:match("(.-)%.") or class
|
|
class = class:match("(.-)%s+") or class
|
|
class = class:gsub("[%-]", "%%%0")
|
|
icon = find_icon(class) or icon
|
|
end
|
|
|
|
return icon
|
|
end
|
|
|
|
function icon_theme:choose_icon(icons_names)
|
|
local icon_info = Gtk.IconTheme.choose_icon(self.gtk_theme, icons_names, self.icon_size, 0);
|
|
if icon_info then
|
|
local icon_path = Gtk.IconInfo.get_filename(icon_info)
|
|
if icon_path then
|
|
return icon_path
|
|
end
|
|
end
|
|
|
|
return ""
|
|
end
|
|
|
|
|
|
function icon_theme:get_gicon_path(gicon)
|
|
if gicon == nil then
|
|
return ""
|
|
end
|
|
|
|
if self._private.icon_cache[gicon] ~= nil then
|
|
return self._private.icon_cache[gicon]
|
|
end
|
|
|
|
local icon_info = Gtk.IconTheme.lookup_by_gicon(self.gtk_theme, gicon, self.icon_size, 0);
|
|
if icon_info then
|
|
local icon_path = Gtk.IconInfo.get_filename(icon_info)
|
|
if icon_path then
|
|
self._private.icon_cache[gicon] = icon_path
|
|
return icon_path
|
|
end
|
|
end
|
|
|
|
return ""
|
|
end
|
|
|
|
function icon_theme:get_icon_path(icon_name)
|
|
if self._private.icon_cache[icon_name] ~= nil then
|
|
return self._private.icon_cache[icon_name]
|
|
end
|
|
|
|
local icon_info = Gtk.IconTheme.lookup_icon(self.gtk_theme, icon_name, self.icon_size, 0);
|
|
if icon_info then
|
|
local icon_path = Gtk.IconInfo.get_filename(icon_info)
|
|
if icon_path then
|
|
self._private.icon_cache[icon_name] = icon_path
|
|
return icon_path
|
|
end
|
|
end
|
|
|
|
return ""
|
|
end
|
|
|
|
local function new(theme_name, icon_size)
|
|
local ret = gobject{}
|
|
gtable.crush(ret, icon_theme, true)
|
|
|
|
ret._private = {}
|
|
ret._private.client_icon_cache = {}
|
|
ret._private.icon_cache = {}
|
|
|
|
ret.name = theme_name or nil
|
|
ret.icon_size = icon_size or 48
|
|
|
|
if theme_name then
|
|
ret.gtk_theme = Gtk.IconTheme.new()
|
|
Gtk.IconTheme.set_custom_theme(ret.gtk_theme, theme_name);
|
|
else
|
|
ret.gtk_theme = Gtk.IconTheme.get_default()
|
|
end
|
|
|
|
return ret
|
|
end
|
|
|
|
function icon_theme.mt:__call(...)
|
|
return new(...)
|
|
end
|
|
|
|
return setmetatable(icon_theme, icon_theme.mt)
|