@@ -528,15 +528,15 @@ pub struct App {
528
528
529
529
impl App {
530
530
fn open_file ( & mut self , path : & PathBuf ) {
531
- let mut found_desktop_exec = false ;
532
531
let mime = mime_icon:: mime_for_path ( path) ;
533
532
if mime == "application/x-desktop" {
533
+ // Try opening desktop application
534
534
match freedesktop_entry_parser:: parse_entry ( path) {
535
535
Ok ( entry) => match entry. section ( "Desktop Entry" ) . attr ( "Exec" ) {
536
536
Some ( exec) => match mime_app:: exec_to_command ( exec, None ) {
537
537
Some ( mut command) => match spawn_detached ( & mut command) {
538
538
Ok ( ( ) ) => {
539
- found_desktop_exec = true ;
539
+ return ;
540
540
}
541
541
Err ( err) => {
542
542
log:: warn!( "failed to execute {:?}: {}" , path, err) ;
@@ -555,6 +555,7 @@ impl App {
555
555
}
556
556
}
557
557
} else if mime == "application/x-executable" || mime == "application/vnd.appimage" {
558
+ // Try opening executable
558
559
let mut command = std:: process:: Command :: new ( path) ;
559
560
match spawn_detached ( & mut command) {
560
561
Ok ( ( ) ) => { }
@@ -571,23 +572,44 @@ impl App {
571
572
}
572
573
} ,
573
574
}
574
- found_desktop_exec = true ;
575
+ return ;
575
576
}
576
- if !found_desktop_exec {
577
- match open:: that_detached ( path) {
577
+
578
+ // Try mime apps, which should be faster than xdg-open
579
+ for app in mime_app:: mime_apps ( & mime) {
580
+ let Some ( mut command) = app. command ( Some ( path. clone ( ) . into ( ) ) ) else {
581
+ continue ;
582
+ } ;
583
+ match spawn_detached ( & mut command) {
578
584
Ok ( ( ) ) => {
579
585
let _ = recently_used_xbel:: update_recently_used (
580
586
path,
581
587
App :: APP_ID . to_string ( ) ,
582
588
"cosmic-files" . to_string ( ) ,
583
589
None ,
584
590
) ;
591
+ return ;
585
592
}
586
593
Err ( err) => {
587
- log:: warn!( "failed to open {:?}: {}" , path, err) ;
594
+ log:: warn!( "failed to open {:?} with {:?}: {}" , path, app . id , err) ;
588
595
}
589
596
}
590
597
}
598
+
599
+ // Fall back to using open crate
600
+ match open:: that_detached ( path) {
601
+ Ok ( ( ) ) => {
602
+ let _ = recently_used_xbel:: update_recently_used (
603
+ path,
604
+ App :: APP_ID . to_string ( ) ,
605
+ "cosmic-files" . to_string ( ) ,
606
+ None ,
607
+ ) ;
608
+ }
609
+ Err ( err) => {
610
+ log:: warn!( "failed to open {:?}: {}" , path, err) ;
611
+ }
612
+ }
591
613
}
592
614
593
615
fn open_tab_entity (
0 commit comments