From ed8fd870a914f05eed194f3f2421c0b0cbe4c0f5 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 17 Nov 2023 09:37:53 -0700 Subject: [PATCH] Use xdg_mime::SharedMimeInfo to find icon names for mime types --- Cargo.lock | 91 ++++++++++++++++++++++++++++++++++++++++++------ Cargo.toml | 2 ++ src/mime_icon.rs | 17 +++++++-- 3 files changed, 97 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fe519bc..aa0d220 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -64,7 +64,7 @@ source = "git+https://github.com/wash2/accesskit.git?tag=winit-0.28#db6f2587f663 dependencies = [ "accesskit", "accesskit_consumer", - "arrayvec", + "arrayvec 0.7.4", "once_cell", "paste", "windows", @@ -207,6 +207,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "arrayvec" version = "0.7.4" @@ -872,6 +878,7 @@ dependencies = [ "serde", "syntect", "two-face", + "xdg-mime", ] [[package]] @@ -1170,6 +1177,16 @@ dependencies = [ "dirs-sys 0.4.1", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + [[package]] name = "dirs-sys" version = "0.3.7" @@ -1193,6 +1210,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -1897,6 +1925,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "glow" version = "0.12.3" @@ -2553,7 +2587,7 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd85a5776cd9500c2e2059c8c76c3b01528566b7fcbaf8098b55a33fc298849b" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", ] [[package]] @@ -2568,6 +2602,19 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +[[package]] +name = "lexical-core" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" +dependencies = [ + "arrayvec 0.5.2", + "bitflags 1.3.2", + "cfg-if", + "ryu", + "static_assertions", +] + [[package]] name = "libc" version = "0.2.150" @@ -2745,7 +2792,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74df1ff0a0147282eb10699537a03baa7d31972b58984a1d44ce0624043fe8ad" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "euclid", "num-traits", ] @@ -3041,6 +3088,17 @@ dependencies = [ "libc", ] +[[package]] +name = "nom" +version = "5.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b" +dependencies = [ + "lexical-core", + "memchr", + "version_check", +] + [[package]] name = "nom" version = "7.1.3" @@ -4499,7 +4557,7 @@ name = "taffy" version = "0.3.11" source = "git+https://github.com/DioxusLabs/taffy#1876f72bee5e376023eaa518aa7b8a34c769bd1b" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "grid", "num-traits", "slotmap", @@ -4600,7 +4658,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.7.4", "bytemuck", "cfg-if", "png", @@ -4614,7 +4672,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7db11798945fa5c3e5490c794ccca7c6de86d3afdd54b4eb324109939c6f37bc" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.7.4", "bytemuck", "cfg-if", "log", @@ -5276,7 +5334,7 @@ version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "480c965c9306872eb6255fa55e4b4953be55a8b64d57e61d7ff840d3dcc051cd" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "cfg-if", "js-sys", "log", @@ -5300,7 +5358,7 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f478237b4bf0d5b70a39898a66fa67ca3a007d79f2520485b8b0c3dfc46f8c2" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "bit-vec", "bitflags 2.4.1", "codespan-reporting", @@ -5324,7 +5382,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ecb3258078e936deee14fd4e0febe1cfe9bbb5ffef165cb60218d2ee5eb4448" dependencies = [ "android_system_properties", - "arrayvec", + "arrayvec 0.7.4", "ash", "bit-set", "bitflags 2.4.1", @@ -5693,7 +5751,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" dependencies = [ - "nom", + "nom 7.1.3", ] [[package]] @@ -5712,6 +5770,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "xdg-mime" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87bf7b69bb50588d70a36e467be29d3df3e8c32580276d62eded9738c1a797aa" +dependencies = [ + "dirs-next", + "glob", + "mime", + "nom 5.1.3", + "unicase", +] + [[package]] name = "xml-rs" version = "0.8.19" diff --git a/Cargo.toml b/Cargo.toml index c593cfc..f92365b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,10 +11,12 @@ fontdb = "0.15.0" lazy_static = "1.4.0" log = "0.4.20" mime_guess = "2" +#TODO: this is using gtk for file dialogues rfd = { version = "0.12.0", optional = true } serde = { version = "1", features = ["serde_derive"] } syntect = "5.1.0" two-face = "0.3.0" +xdg-mime = "0.3.3" # Internationalization i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } i18n-embed-fl = "0.6.4" diff --git a/src/mime_icon.rs b/src/mime_icon.rs index 34cec50..f4b384a 100644 --- a/src/mime_icon.rs +++ b/src/mime_icon.rs @@ -3,11 +3,22 @@ use std::path::Path; pub const FALLBACK_MIME_ICON: &str = "text-x-generic"; +lazy_static::lazy_static! { + static ref SHARED_MIME_INFO: xdg_mime::SharedMimeInfo = xdg_mime::SharedMimeInfo::new(); +} + pub fn mime_icon>(path: P, size: u16) -> icon::Icon { let path = path.as_ref(); - for mime in mime_guess::from_path(path).iter() { - //TODO: correct some common issues (like application/x-sh not being found) - let icon_name = mime.essence_str().replace("/", "-"); + //TODO: SHARED_MIME_INFO.get_mime_types_from_file_name(path) + for mime_type in mime_guess::from_path(path) { + for icon_name in SHARED_MIME_INFO.lookup_icon_names(&mime_type) { + let named = icon::from_name(icon_name).size(size); + if named.clone().path().is_some() { + return named.icon(); + } + } + + let icon_name = mime_type.essence_str().replace("/", "-"); let named = icon::from_name(icon_name).size(size); if named.clone().path().is_some() { return named.icon();