fix(mime_app): track mime type app default by mime

This commit is contained in:
Michael Aaron Murphy 2026-06-11 17:54:12 +02:00
parent 6d4af69318
commit eda8291678
No known key found for this signature in database
GPG key ID: B2732D4240C9212C
3 changed files with 9 additions and 9 deletions

View file

@ -5940,7 +5940,7 @@ impl Application for App {
widget::button::custom( widget::button::custom(
widget::row::with_children([ widget::row::with_children([
icon(app.icon()).size(32).into(), icon(app.icon()).size(32).into(),
if app.is_default() && !displayed_default { if app.is_default(mime) && !displayed_default {
displayed_default = true; displayed_default = true;
widget::text::body(fl!( widget::text::body(fl!(
"default-app", "default-app",

View file

@ -11,7 +11,7 @@ use std::ffi::OsStr;
use std::os::unix::ffi::OsStrExt; use std::os::unix::ffi::OsStrExt;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
use std::sync::{Arc, atomic}; use std::sync::{Arc, RwLock, atomic};
use std::time::{self, Instant}; use std::time::{self, Instant};
use std::{fs, io, process}; use std::{fs, io, process};
@ -191,7 +191,7 @@ pub struct MimeApp {
pub exec: Option<String>, pub exec: Option<String>,
icon_name: Box<str>, icon_name: Box<str>,
icon: std::sync::OnceLock<widget::icon::Handle>, icon: std::sync::OnceLock<widget::icon::Handle>,
is_default: Arc<AtomicBool>, is_default: Arc<RwLock<FxHashSet<Box<str>>>>,
no_display: Arc<AtomicBool>, no_display: Arc<AtomicBool>,
} }
@ -206,8 +206,8 @@ impl MimeApp {
) )
} }
pub fn is_default(&self) -> bool { pub fn is_default(&self, mime: &Mime) -> bool {
self.is_default.load(atomic::Ordering::Relaxed) self.is_default.read().unwrap().contains(mime.essence_str())
} }
pub fn no_display(&self) -> bool { pub fn no_display(&self) -> bool {
@ -343,7 +343,7 @@ impl MimeAppCache {
exec: desktop_entry.exec().map(String::from), exec: desktop_entry.exec().map(String::from),
icon_name: desktop_entry.icon().unwrap_or_default().into(), icon_name: desktop_entry.icon().unwrap_or_default().into(),
icon: std::sync::OnceLock::new(), icon: std::sync::OnceLock::new(),
is_default: Arc::new(AtomicBool::new(false)), is_default: Arc::new(RwLock::default()),
no_display: Arc::new(AtomicBool::new(false)), no_display: Arc::new(AtomicBool::new(false)),
}); });
@ -414,7 +414,7 @@ impl MimeAppCache {
apps.retain(|app| { apps.retain(|app| {
let found = app.id.as_str() == default; let found = app.id.as_str() == default;
if found { if found {
app.is_default.store(true, atomic::Ordering::Relaxed); app.is_default.write().unwrap().insert(default.into());
cache.push(app.clone()); cache.push(app.clone());
} }

View file

@ -2378,7 +2378,7 @@ impl Item {
.iter() .iter()
.map(|app| Cow::Owned(app.name.clone())) .map(|app| Cow::Owned(app.name.clone()))
.collect::<Vec<Cow<'static, str>>>(), .collect::<Vec<Cow<'static, str>>>(),
mime_apps.iter().position(|x| x.is_default()), mime_apps.iter().position(|x| x.is_default(&self.mime)),
move |index| index, move |index| index,
) )
.icons(Cow::Owned(mime_app_cache.icons(&self.mime))), .icons(Cow::Owned(mime_app_cache.icons(&self.mime))),
@ -6462,7 +6462,7 @@ impl Tab {
.iter() .iter()
.map(|app| Cow::Owned(app.name.clone())) .map(|app| Cow::Owned(app.name.clone()))
.collect::<Vec<Cow<'static, str>>>(), .collect::<Vec<Cow<'static, str>>>(),
mime_apps.iter().position(|x| x.is_default()), mime_apps.iter().position(|x| x.is_default(&mime)),
move |index| (index, mime_closure.clone()), move |index| (index, mime_closure.clone()),
) )
.icons(Cow::Owned(mime_app_cache.icons(&mime))), .icons(Cow::Owned(mime_app_cache.icons(&mime))),