@@ -45,13 +45,14 @@ use cosmic::widget::text::body;
45
45
use cosmic:: widget:: { button, icon, search_input, text_input, tooltip, Checkbox , Column } ;
46
46
use cosmic:: { cctk:: sctk, iced, Element , Theme } ;
47
47
use cosmic_app_list_config:: AppListConfig ;
48
- use freedesktop_desktop_entry:: PathSource ;
48
+ use freedesktop_desktop_entry:: { DesktopEntry , PathSource } ;
49
49
use itertools:: Itertools ;
50
50
use log:: error;
51
51
use once_cell:: sync:: Lazy ;
52
52
use serde:: { Deserialize , Serialize } ;
53
53
use std:: sync:: Arc ;
54
54
use switcheroo_control:: Gpu ;
55
+ use tokio:: io:: AsyncWriteExt ;
55
56
56
57
use crate :: app_group:: AppLibraryConfig ;
57
58
use crate :: fl;
@@ -284,6 +285,7 @@ enum Message {
284
285
GpuUpdate ( Option < Vec < Gpu > > ) ,
285
286
PinToAppTray ( usize ) ,
286
287
UnPinFromAppTray ( usize ) ,
288
+ DesktopShortcut ( usize ) ,
287
289
AppListConfig ( AppListConfig ) ,
288
290
}
289
291
@@ -730,6 +732,20 @@ impl cosmic::Application for CosmicAppLibrary {
730
732
. remove_pinned ( & pinned_id, & app_list_helper) ;
731
733
}
732
734
}
735
+ Message :: DesktopShortcut ( i) => {
736
+ if let Some ( entry) = self . entry_path_input . get ( i) {
737
+ let entry = Arc :: clone ( entry) ;
738
+ return Command :: perform (
739
+ async move {
740
+ if let Err ( e) = desktop_shortcut ( entry) . await {
741
+ error ! ( "Failed copying desktop entry to desktop: {e:?}" ) ;
742
+ }
743
+ cosmic:: app:: Message :: None
744
+ } ,
745
+ |x| x,
746
+ ) ;
747
+ }
748
+ }
733
749
Message :: AppListConfig ( config) => {
734
750
self . app_list_config = config;
735
751
}
@@ -849,6 +865,13 @@ impl cosmic::Application for CosmicAppLibrary {
849
865
list_column. push ( menu_divider ( spacing) . into ( ) ) ;
850
866
list_column. push ( pin_to_app_tray. into ( ) ) ;
851
867
868
+ // Desktop shortcut
869
+ list_column. push (
870
+ menu_button ( body ( fl ! ( "add-desktop-shortcut" ) ) )
871
+ . on_press ( Message :: DesktopShortcut ( * i) )
872
+ . into ( ) ,
873
+ ) ;
874
+
852
875
if self . cur_group > 0 {
853
876
list_column. push ( menu_divider ( spacing) . into ( ) ) ;
854
877
list_column. push (
@@ -1437,3 +1460,15 @@ fn menu_divider<'a>(spacing: &Spacing) -> Container<'a, Message, cosmic::Theme,
1437
1460
. padding ( [ spacing. space_none , spacing. space_xxs ] )
1438
1461
. width ( Length :: Fill )
1439
1462
}
1463
+
1464
+ /// Copy application desktop entry to the user's desktop
1465
+ async fn desktop_shortcut ( entry : Arc < DesktopEntryData > ) -> tokio:: io:: Result < u64 > {
1466
+ let source = entry
1467
+ . path
1468
+ . as_deref ( )
1469
+ . ok_or ( tokio:: io:: Error :: other ( "Desktop entry doesn't have a path" ) ) ?;
1470
+ let dest = dirs:: desktop_dir ( )
1471
+ . ok_or ( tokio:: io:: Error :: other ( "User doesn't have a desktop dir" ) ) ?
1472
+ . join ( format ! ( "{}.desktop" , & * entry. name) ) ;
1473
+ tokio:: fs:: copy ( source, dest) . await
1474
+ }
0 commit comments