@@ -14,6 +14,7 @@ use color_eyre::{Result, eyre::WrapErr};
14
14
use comp:: create_privileged_socket;
15
15
use cosmic_notifications_util:: { DAEMON_NOTIFICATIONS_FD , PANEL_NOTIFICATIONS_FD } ;
16
16
use futures_util:: StreamExt ;
17
+ use futures_util:: stream:: FuturesUnordered ;
17
18
#[ cfg( feature = "autostart" ) ]
18
19
use itertools:: Itertools ;
19
20
use launch_pad:: { ProcessManager , process:: Process } ;
@@ -32,6 +33,7 @@ use std::{
32
33
} ;
33
34
#[ cfg( feature = "systemd" ) ]
34
35
use systemd:: { get_systemd_env, is_systemd_used, spawn_scope} ;
36
+ use tokio:: sync:: mpsc:: UnboundedSender ;
35
37
use tokio:: {
36
38
net:: UnixStream ,
37
39
sync:: {
@@ -338,93 +340,7 @@ async fn start(
338
340
) ;
339
341
drop ( guard) ;
340
342
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 ;
428
344
429
345
#[ cfg( feature = "autostart" ) ]
430
346
if !* is_systemd_used ( ) {
@@ -576,6 +492,34 @@ async fn start(
576
492
Ok ( status)
577
493
}
578
494
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
+
579
523
async fn start_component (
580
524
cmd : impl Into < Cow < ' static , str > > ,
581
525
span : tracing:: Span ,
0 commit comments