Fix icon loading for third-party apps with file:// URL scheme
- Add file:// URL handling to AssetFilesInterface in kernel.cpp - Update home.lua to use file:// prefix for absolute filesystem paths - Add file:// URL handling to desktop file interface for consistency This fixes RmlUi stripping the leading slash from absolute paths when resolving img src URLs relative to the document base. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -121,9 +121,14 @@ function renderThirdPartyApps()
|
||||
else
|
||||
icon_path = app.icon
|
||||
end
|
||||
-- Use file:// prefix for absolute paths to prevent RmlUi URL resolution
|
||||
local src_path = icon_path
|
||||
if icon_path:sub(1, 1) == "/" then
|
||||
src_path = "file://" .. icon_path
|
||||
end
|
||||
-- Use img tag for actual icon
|
||||
icon_html = '<img src="' .. icon_path .. '" style="width: 48px; height: 48px;"/>'
|
||||
print("[Home] Loading icon: " .. icon_path)
|
||||
icon_html = '<img src="' .. src_path .. '" style="width: 48px; height: 48px;"/>'
|
||||
print("[Home] Loading icon: " .. src_path)
|
||||
else
|
||||
-- Fallback to initial letter
|
||||
icon_html = '<span style="font-size: 28px; color: #000000;">' .. initial .. '</span>'
|
||||
|
||||
@@ -66,9 +66,17 @@ public:
|
||||
return instance;
|
||||
}
|
||||
|
||||
// Check if path is a filesystem path (starts with /)
|
||||
// Check if path is a filesystem path (starts with / or file://)
|
||||
static bool IsFilesystemPath(const Rml::String& path) {
|
||||
return !path.empty() && path[0] == '/';
|
||||
return !path.empty() && (path[0] == '/' || path.rfind("file://", 0) == 0);
|
||||
}
|
||||
|
||||
// Get the actual filesystem path, stripping file:// prefix if present
|
||||
static Rml::String GetFilesystemPath(const Rml::String& path) {
|
||||
if (path.rfind("file://", 0) == 0) {
|
||||
return path.substr(7); // Strip "file://"
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
Rml::FileHandle Open(const Rml::String &path) override
|
||||
@@ -77,7 +85,8 @@ public:
|
||||
|
||||
if (IsFilesystemPath(path)) {
|
||||
// Filesystem path
|
||||
auto* file = new std::ifstream(path, std::ios::binary);
|
||||
Rml::String fs_path = GetFilesystemPath(path);
|
||||
auto* file = new std::ifstream(fs_path, std::ios::binary);
|
||||
if (!file->is_open()) {
|
||||
delete file;
|
||||
delete wrapper;
|
||||
@@ -175,7 +184,8 @@ public:
|
||||
{
|
||||
if (IsFilesystemPath(path)) {
|
||||
// Load from filesystem
|
||||
std::ifstream file(path, std::ios::binary | std::ios::ate);
|
||||
Rml::String fs_path = GetFilesystemPath(path);
|
||||
std::ifstream file(fs_path, std::ios::binary | std::ios::ate);
|
||||
if (!file.is_open()) return false;
|
||||
|
||||
size_t size = file.tellg();
|
||||
|
||||
Reference in New Issue
Block a user