From b0763beb4a61539477914144e670d522451a28d8 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Sun, 4 Jan 2026 13:41:26 +0900 Subject: [PATCH] fallback identicons --- Cargo.lock | 149 +++++++++++++++++++++-- dash-frontend/Cargo.toml | 1 + dash-frontend/src/util/desktop_finder.rs | 34 +++++- wlx-common/src/cache_dir.rs | 4 + 4 files changed, 175 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01f674b..e1a1253 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/dash-frontend/Cargo.toml b/dash-frontend/Cargo.toml index 1e9c778..3e75f67 100644 --- a/dash-frontend/Cargo.toml +++ b/dash-frontend/Cargo.toml @@ -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" diff --git a/dash-frontend/src/util/desktop_finder.rs b/dash-frontend/src/util/desktop_finder.rs index 2a20341..a7d9389 100644 --- a/dash-frontend/src/util/desktop_finder.rs +++ b/dash-frontend/src/util/desktop_finder.rs @@ -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::::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 ¶ms.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(¶ms, &icon_name)); + .and_then(|icon_name| Self::find_icon(¶ms, &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 { + 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; diff --git a/wlx-common/src/cache_dir.rs b/wlx-common/src/cache_dir.rs index 73b2713..9e6b335 100644 --- a/wlx-common/src/cache_dir.rs +++ b/wlx-common/src/cache_dir.rs @@ -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> { let mut path = get_cache_root();