@@ -14,6 +14,7 @@ use color_eyre::{Result, eyre::WrapErr};
1414use comp:: create_privileged_socket;
1515use cosmic_notifications_util:: { DAEMON_NOTIFICATIONS_FD , PANEL_NOTIFICATIONS_FD } ;
1616use futures_util:: StreamExt ;
17+ use futures_util:: stream:: FuturesUnordered ;
1718#[ cfg( feature = "autostart" ) ]
1819use itertools:: Itertools ;
1920use launch_pad:: { ProcessManager , process:: Process } ;
@@ -32,6 +33,7 @@ use std::{
3233} ;
3334#[ cfg( feature = "systemd" ) ]
3435use systemd:: { get_systemd_env, is_systemd_used, spawn_scope} ;
36+ use tokio:: sync:: mpsc:: UnboundedSender ;
3537use tokio:: {
3638 net:: UnixStream ,
3739 sync:: {
@@ -338,93 +340,7 @@ async fn start(
338340 ) ;
339341 drop ( guard) ;
340342
341- let span = info_span ! ( parent: None , "cosmic-app-library" ) ;
342- start_component (
343- "cosmic-app-library" ,
344- span,
345- & process_manager,
346- & env_vars,
347- & socket_tx,
348- Vec :: new ( ) ,
349- )
350- . await ;
351-
352- let span = info_span ! ( parent: None , "cosmic-launcher" ) ;
353- start_component (
354- "cosmic-launcher" ,
355- span,
356- & process_manager,
357- & env_vars,
358- & socket_tx,
359- Vec :: new ( ) ,
360- )
361- . await ;
362-
363- let span = info_span ! ( parent: None , "cosmic-workspaces" ) ;
364- start_component (
365- "cosmic-workspaces" ,
366- span,
367- & process_manager,
368- & env_vars,
369- & socket_tx,
370- Vec :: new ( ) ,
371- )
372- . await ;
373-
374- let span = info_span ! ( parent: None , "cosmic-osd" ) ;
375- start_component (
376- "cosmic-osd" ,
377- span,
378- & process_manager,
379- & env_vars,
380- & socket_tx,
381- Vec :: new ( ) ,
382- )
383- . await ;
384-
385- let span = info_span ! ( parent: None , "cosmic-bg" ) ;
386- start_component (
387- "cosmic-bg" ,
388- span,
389- & process_manager,
390- & env_vars,
391- & socket_tx,
392- Vec :: new ( ) ,
393- )
394- . await ;
395-
396- let span = info_span ! ( parent: None , "cosmic-greeter" ) ;
397- start_component (
398- "cosmic-greeter" ,
399- span,
400- & process_manager,
401- & env_vars,
402- & socket_tx,
403- Vec :: new ( ) ,
404- )
405- . await ;
406-
407- let span = info_span ! ( parent: None , "cosmic-files-applet" ) ;
408- start_component (
409- "cosmic-files-applet" ,
410- span,
411- & process_manager,
412- & env_vars,
413- & socket_tx,
414- Vec :: new ( ) ,
415- )
416- . await ;
417-
418- let span = info_span ! ( parent: None , "cosmic-idle" ) ;
419- start_component (
420- "cosmic-idle" ,
421- span,
422- & process_manager,
423- & env_vars,
424- & socket_tx,
425- Vec :: new ( ) ,
426- )
427- . await ;
343+ spawn_components ( & process_manager, & env_vars, & socket_tx) . await ;
428344
429345 #[ cfg( feature = "autostart" ) ]
430346 if !* is_systemd_used ( ) {
@@ -576,6 +492,34 @@ async fn start(
576492 Ok ( status)
577493}
578494
495+ /// Spawn desktop components concurrently with the process manager.
496+ async fn spawn_components (
497+ process_manager : & ProcessManager ,
498+ env_vars : & [ ( String , String ) ] ,
499+ socket_tx : & UnboundedSender < Vec < UnixStream > > ,
500+ ) {
501+ let components = [
502+ "cosmic-app-library" ,
503+ "cosmic-bg" ,
504+ "cosmic-files-applet" ,
505+ "cosmic-greeter" ,
506+ "cosmic-idle" ,
507+ "cosmic-launcher" ,
508+ "cosmic-osd" ,
509+ "cosmic-workspaces" ,
510+ ] ;
511+
512+ components
513+ . into_iter ( )
514+ . map ( |name| async move {
515+ let span = info_span ! ( parent: None , "{}" , name) ;
516+ start_component ( name, span, process_manager, env_vars, socket_tx, Vec :: new ( ) ) . await ;
517+ } )
518+ . collect :: < FuturesUnordered < _ > > ( )
519+ . collect :: < Vec < ( ) > > ( )
520+ . await ;
521+ }
522+
579523async fn start_component (
580524 cmd : impl Into < Cow < ' static , str > > ,
581525 span : tracing:: Span ,
0 commit comments