fallback identicons

This commit is contained in:
galister
2026-01-04 13:41:26 +09:00
parent 3e4174994d
commit b0763beb4a
4 changed files with 175 additions and 13 deletions

149
Cargo.lock generated
View File

@@ -307,7 +307,7 @@ dependencies = [
"enumflags2",
"futures-channel",
"futures-util",
"rand",
"rand 0.9.2",
"serde",
"serde_repr",
"url",
@@ -1431,6 +1431,7 @@ dependencies = [
"glob",
"http-body-util",
"hyper",
"identicons-svg",
"keyvalues-parser",
"log",
"rust-embed",
@@ -2090,6 +2091,17 @@ dependencies = [
"windows-link 0.2.1",
]
[[package]]
name = "getrandom"
version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
dependencies = [
"cfg-if",
"libc",
"wasi 0.9.0+wasi-snapshot-preview1",
]
[[package]]
name = "getrandom"
version = "0.2.16"
@@ -2098,7 +2110,7 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [
"cfg-if",
"libc",
"wasi",
"wasi 0.11.1+wasi-snapshot-preview1",
]
[[package]]
@@ -2462,6 +2474,18 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "identicons-svg"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f913e1c362b7de59b3fddfe286f92470275aef99d33cf96dfd8ec6d1bfb5b6ae"
dependencies = [
"hex",
"rand 0.8.5",
"random_color",
"simple-xml-builder",
]
[[package]]
name = "idmap"
version = "0.2.22"
@@ -3097,7 +3121,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc"
dependencies = [
"libc",
"wasi",
"wasi 0.11.1+wasi-snapshot-preview1",
"windows-sys 0.61.2",
]
@@ -4224,14 +4248,59 @@ version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
dependencies = [
"getrandom 0.1.16",
"libc",
"rand_chacha 0.2.2",
"rand_core 0.5.1",
"rand_hc",
"rand_pcg",
]
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha 0.3.1",
"rand_core 0.6.4",
]
[[package]]
name = "rand"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha",
"rand_core",
"rand_chacha 0.9.0",
"rand_core 0.9.3",
]
[[package]]
name = "rand_chacha"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
dependencies = [
"ppv-lite86",
"rand_core 0.5.1",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core 0.6.4",
]
[[package]]
@@ -4241,7 +4310,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
"rand_core",
"rand_core 0.9.3",
]
[[package]]
name = "rand_core"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
dependencies = [
"getrandom 0.1.16",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom 0.2.16",
]
[[package]]
@@ -4253,6 +4340,33 @@ dependencies = [
"getrandom 0.3.4",
]
[[package]]
name = "rand_hc"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
dependencies = [
"rand_core 0.5.1",
]
[[package]]
name = "rand_pcg"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
dependencies = [
"rand_core 0.5.1",
]
[[package]]
name = "random_color"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5f34bd6526786b2ce5141fd37a4084b5da1ebae74595b5b0d05482a7cef7181"
dependencies = [
"rand 0.7.3",
]
[[package]]
name = "rangemap"
version = "1.7.1"
@@ -4286,8 +4400,8 @@ dependencies = [
"num-traits",
"paste",
"profiling",
"rand",
"rand_chacha",
"rand 0.9.2",
"rand_chacha 0.9.0",
"simd_helpers",
"thiserror 2.0.17",
"v_frame",
@@ -4903,6 +5017,15 @@ dependencies = [
"quote",
]
[[package]]
name = "simple-xml-builder"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a50cb1e76f89e3c076f7ae0a609c4b0033c26034f740eddbeb761b64b2f42980"
dependencies = [
"indexmap 1.9.3",
]
[[package]]
name = "simplecss"
version = "0.2.2"
@@ -4981,7 +5104,7 @@ dependencies = [
"indexmap 2.12.1",
"libc",
"profiling",
"rand",
"rand 0.9.2",
"rustix 1.1.3",
"scopeguard",
"sha2",
@@ -5815,7 +5938,7 @@ checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a"
dependencies = [
"getrandom 0.3.4",
"js-sys",
"rand",
"rand 0.9.2",
"serde_core",
"wasm-bindgen",
]
@@ -5940,6 +6063,12 @@ dependencies = [
"try-lock",
]
[[package]]
name = "wasi"
version = "0.9.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"

View File

@@ -27,3 +27,4 @@ smol-hyper = "0.1.1"
glob = "0.3.3"
walkdir = "2.5.0"
rust-ini = "0.21.3"
identicons-svg = "0.1.0"

View File

@@ -1,11 +1,11 @@
use std::{
collections::HashSet, ffi::OsStr, fmt::Debug, fs::exists, path::Path, rc::Rc, sync::Arc, thread::JoinHandle,
time::Instant,
collections::HashSet, ffi::OsStr, fmt::Debug, fs::exists, io::Write, path::Path, rc::Rc, sync::Arc, thread::JoinHandle, time::Instant
};
use ini::Ini;
use serde::{Deserialize, Serialize};
use walkdir::WalkDir;
use wlx_common::cache_dir;
struct DesktopEntryOwned {
exec_path: String,
@@ -108,6 +108,11 @@ impl DesktopFinder {
let mut known_files = HashSet::new();
let mut entries = Vec::<DesktopEntryOwned>::new();
let icons_folder = cache_dir::get_path("icons");
if !std::fs::exists(&icons_folder).unwrap_or(false) {
let _ = std::fs::create_dir(&icons_folder);
}
for path in &params.app_folders {
log::debug!("Searching desktop entries in path {}", path);
@@ -201,7 +206,8 @@ impl DesktopFinder {
let icon_path = section
.get("Icon")
.and_then(|icon_name| Self::find_icon(&params, &icon_name));
.and_then(|icon_name| Self::find_icon(&params, &icon_name))
.or_else(|| Self::create_icon(&file_name).ok());
if let Some(categories) = section.get("Categories") {
for cat in categories.split(";") {
@@ -258,6 +264,28 @@ impl DesktopFinder {
None
}
fn create_icon(desktop_entry_name: &str) -> anyhow::Result<String> {
let relative_path = format!("icons/{}.svg", desktop_entry_name);
let file_path = cache_dir::get_path(&relative_path).to_string_lossy().to_string();
if std::fs::exists(&file_path).unwrap_or(false) {
return Ok(file_path);
}
let svg = identicons_svg::generate(
identicons_svg::IdenticonOptions {
background: identicons_svg::Background {
r: 64,
color: "rgba(0.9,0.9,0.9,0.5)".into()
},
..Default::default()
}
);
std::fs::write(&file_path, svg)?;
Ok(file_path)
}
fn wait_for_entries(&mut self) {
let Some(bg_task) = self.bg_task.take() else {
return;

View File

@@ -17,6 +17,10 @@ fn get_cache_root() -> PathBuf {
CACHE_ROOT_PATH.clone()
}
pub fn get_path(data_path: &str) -> PathBuf {
get_cache_root().join(data_path)
}
// todo: mutex
pub async fn get_data(data_path: &str) -> Option<Vec<u8>> {
let mut path = get_cache_root();