@@ -4,7 +4,7 @@ use serde::{Deserialize, Deserializer};
44use std:: {
55 cell:: LazyCell ,
66 collections:: BTreeMap ,
7- env ,
7+
88 ffi:: OsString ,
99 io,
1010 os:: unix:: ffi:: OsStringExt ,
@@ -88,11 +88,10 @@ impl DesktopFiles {
8888 . collect ( )
8989 }
9090
91- fn into_map ( self ) -> BTreeMap < PathBuf , String > {
91+ fn into_map ( self , host_home : Option < PathBuf > ) -> BTreeMap < PathBuf , String > {
9292 let mut desktop_files = self . system ;
9393 // Only include user desktop files if the container's home directory is different from the host's
9494 // This avoids showing duplicate entries when the container shares the host's home directory
95- let host_home = env:: var ( "HOME" ) . ok ( ) . map ( PathBuf :: from) ;
9695 if host_home. as_ref ( ) != Some ( & self . home_dir ) {
9796 desktop_files. extend ( self . user )
9897 }
@@ -471,15 +470,15 @@ impl DistroboxCommandRunnerResponse {
471470 ) -> Vec < ( Command , String ) > {
472471 let mut commands = Vec :: new ( ) ;
473472
474- // Get XDG_DATA_HOME
473+ // Get XDG_DATA_HOME (mocked via printenv)
475474 commands. push ( (
476- Command :: new_with_args ( "sh " , [ "-c" , "echo $ XDG_DATA_HOME"] ) ,
475+ Command :: new_with_args ( "printenv " , [ "XDG_DATA_HOME" ] ) ,
477476 String :: new ( ) ,
478477 ) ) ;
479478
480- // Get HOME if XDG_DATA_HOME is empty
479+ // Get HOME if XDG_DATA_HOME is empty (mocked via printenv)
481480 commands. push ( (
482- Command :: new_with_args ( "sh " , [ "-c" , "echo $ HOME"] ) ,
481+ Command :: new_with_args ( "printenv " , [ "HOME" ] ) ,
483482 "/home/me" . to_string ( ) ,
484483 ) ) ;
485484
@@ -659,19 +658,31 @@ impl Distrobox {
659658 }
660659
661660 async fn host_applications_path ( & self ) -> Result < PathBuf , Error > {
662- let mut cmd = Command :: new ( "sh" ) ;
663- cmd. args ( [ "-c" , "echo $XDG_DATA_HOME" ] ) ;
664- let xdg_data_home = self . cmd_output_string ( cmd) . await ?;
665-
666- let xdg_data_home = if xdg_data_home. trim ( ) . is_empty ( ) {
667- let mut cmd = Command :: new ( "sh" ) ;
668- cmd. args ( [ "-c" , "echo $HOME" ] ) ;
669- let home = self . cmd_output_string ( cmd) . await ?;
670- Path :: new ( home. trim ( ) ) . join ( ".local/share" )
661+ // Resolve XDG_DATA_HOME via runner (works in Flatpak via map_flatpak_spawn_host)
662+ let xdg_data_home_opt = match crate :: fakers:: resolve_host_env_via_runner ( & self . cmd_runner , "XDG_DATA_HOME" ) . await {
663+ Ok ( Some ( s) ) if !s. trim ( ) . is_empty ( ) => Some ( Path :: new ( s. trim ( ) ) . to_path_buf ( ) ) ,
664+ Ok ( _) => None ,
665+ Err ( e) => {
666+ tracing:: warn!( "failed to resolve XDG_DATA_HOME via CommandRunner: {e:?}" ) ;
667+ None
668+ }
669+ } ;
670+
671+ let apps_base = if let Some ( p) = xdg_data_home_opt {
672+ p
671673 } else {
672- Path :: new ( xdg_data_home. trim ( ) ) . to_path_buf ( )
674+ // Fallback to HOME
675+ match crate :: fakers:: resolve_host_env_via_runner ( & self . cmd_runner , "HOME" ) . await {
676+ Ok ( Some ( s) ) if !s. trim ( ) . is_empty ( ) => Path :: new ( s. trim ( ) ) . join ( ".local/share" ) ,
677+ Ok ( _) => return Err ( Error :: ResolveHostPath ( "XDG_DATA_HOME and HOME are not set on the host" . into ( ) ) ) ,
678+ Err ( e) => {
679+ tracing:: warn!( "failed to resolve HOME via CommandRunner: {e:?}" ) ;
680+ return Err ( Error :: ResolveHostPath ( "failed to resolve host HOME" . into ( ) ) ) ;
681+ }
682+ }
673683 } ;
674- let apps_path = xdg_data_home. join ( "applications" ) ;
684+
685+ let apps_path = apps_base. join ( "applications" ) ;
675686 Ok ( apps_path)
676687 }
677688 async fn get_exported_desktop_files ( & self ) -> Result < Vec < String > , Error > {
@@ -702,8 +713,18 @@ impl Distrobox {
702713 . map_err ( |e| Error :: ParseOutput ( format ! ( "{e:?}" ) ) ) ?;
703714 debug ! ( desktop_files = format_args!( "{desktop_files:#?}" ) ) ;
704715
716+ // Resolve host HOME via CommandRunner so this works inside Flatpak as well
717+ let host_home_opt = match crate :: fakers:: resolve_host_env_via_runner ( & self . cmd_runner , "HOME" ) . await {
718+ Ok ( Some ( s) ) => Some ( PathBuf :: from ( s) ) ,
719+ Ok ( None ) => None ,
720+ Err ( e) => {
721+ tracing:: warn!( "failed to resolve host HOME via CommandRunner: {e:?}" ) ;
722+ None
723+ }
724+ } ;
725+
705726 Ok ( desktop_files
706- . into_map ( )
727+ . into_map ( host_home_opt )
707728 . into_iter ( )
708729 . map ( |( path, content) | ( path. to_string_lossy ( ) . into_owned ( ) , content) )
709730 . collect :: < Vec < _ > > ( ) )
@@ -1182,8 +1203,9 @@ Categories=Utility;Network;";
11821203
11831204 let db = Distrobox :: new (
11841205 NullCommandRunnerBuilder :: new ( )
1185- . cmd ( & [ "sh" , "-c" , "echo $XDG_DATA_HOME" ] , "" )
1186- . cmd ( & [ "sh" , "-c" , "echo $HOME" ] , "/home/me" )
1206+ . cmd ( & [ "printenv" , "HOME" ] , "/home/me" )
1207+ . cmd ( & [ "printenv" , "XDG_DATA_HOME" ] , "" )
1208+ . cmd ( & [ "printenv" , "HOME" ] , "/home/me" )
11871209 . cmd (
11881210 & [ "ls" , "/home/me/.local/share/applications" ] ,
11891211 "ubuntu-vim.desktop\n " ,
@@ -1235,8 +1257,9 @@ Categories=Utility;Security;";
12351257
12361258 let db = Distrobox :: new (
12371259 NullCommandRunnerBuilder :: new ( )
1238- . cmd ( & [ "sh" , "-c" , "echo $XDG_DATA_HOME" ] , "" )
1239- . cmd ( & [ "sh" , "-c" , "echo $HOME" ] , "/home/me" )
1260+ . cmd ( & [ "printenv" , "HOME" ] , "/home/me" )
1261+ . cmd ( & [ "printenv" , "XDG_DATA_HOME" ] , "" )
1262+ . cmd ( & [ "printenv" , "HOME" ] , "/home/me" )
12401263 . cmd (
12411264 & [ "ls" , "/home/me/.local/share/applications" ] ,
12421265 "ubuntu-Proton Authenticator.desktop\n " ,
0 commit comments