@@ -471,60 +471,12 @@ func (p *Program) eventLoop(model Model, cmds chan Cmd) (Model, error) {
471
471
p .exec (msg .cmd , msg .fn )
472
472
473
473
case BatchMsg :
474
- for _ , cmd := range msg {
475
- if cmd == nil {
476
- continue
477
- }
478
- select {
479
- case <- p .ctx .Done ():
480
- return model , nil
481
- case cmds <- cmd :
482
- }
483
- }
474
+ go p .execBatchMsg (msg )
484
475
continue
485
476
486
477
case sequenceMsg :
487
- go func () {
488
- // Execute commands one at a time, in order.
489
- for _ , cmd := range msg {
490
- if cmd == nil {
491
- continue
492
- }
493
-
494
- msg := cmd ()
495
- switch msg := msg .(type ) {
496
- case BatchMsg :
497
- var wg sync.WaitGroup
498
- for _ , cmd := range msg {
499
- if cmd == nil {
500
- continue
501
- }
502
- wg .Add (1 )
503
- cmd := cmd
504
- go func () {
505
- defer wg .Done ()
506
- p .Send (cmd ())
507
- }()
508
- }
509
- wg .Wait ()
510
- case sequenceMsg :
511
- for _ , cmd := range msg {
512
- if cmd == nil {
513
- continue
514
- }
515
- p .Send (cmd ())
516
- }
517
- default :
518
- p .Send (msg )
519
- }
520
- }
521
- }()
522
-
523
- case setWindowTitleMsg :
524
- p .SetWindowTitle (string (msg ))
525
-
526
- case windowSizeMsg :
527
- go p .checkResize ()
478
+ go p .execSequenceMsg (msg )
479
+ continue
528
480
}
529
481
530
482
// Process internal messages for the renderer.
@@ -546,6 +498,74 @@ func (p *Program) eventLoop(model Model, cmds chan Cmd) (Model, error) {
546
498
}
547
499
}
548
500
501
+ func (p * Program ) execSequenceMsg (msg sequenceMsg ) {
502
+ if ! p .startupOptions .has (withoutCatchPanics ) {
503
+ defer func () {
504
+ if r := recover (); r != nil {
505
+ p .recoverFromGoPanic (r )
506
+ }
507
+ }()
508
+ }
509
+
510
+ // Execute commands one at a time, in order.
511
+ for _ , cmd := range msg {
512
+ if cmd == nil {
513
+ continue
514
+ }
515
+ msg := cmd ()
516
+ switch msg := msg .(type ) {
517
+ case BatchMsg :
518
+ p .execBatchMsg (msg )
519
+ case sequenceMsg :
520
+ p .execSequenceMsg (msg )
521
+ default :
522
+ p .Send (msg )
523
+ }
524
+ }
525
+ }
526
+
527
+ func (p * Program ) execBatchMsg (msg BatchMsg ) {
528
+ if ! p .startupOptions .has (withoutCatchPanics ) {
529
+ defer func () {
530
+ if r := recover (); r != nil {
531
+ p .recoverFromGoPanic (r )
532
+ }
533
+ }()
534
+ }
535
+
536
+ // Execute commands one at a time.
537
+ var wg sync.WaitGroup
538
+ for _ , cmd := range msg {
539
+ if cmd == nil {
540
+ continue
541
+ }
542
+ wg .Add (1 )
543
+ go func () {
544
+ defer wg .Done ()
545
+
546
+ if ! p .startupOptions .has (withoutCatchPanics ) {
547
+ defer func () {
548
+ if r := recover (); r != nil {
549
+ p .recoverFromGoPanic (r )
550
+ }
551
+ }()
552
+ }
553
+
554
+ msg := cmd ()
555
+ switch msg := msg .(type ) {
556
+ case BatchMsg :
557
+ p .execBatchMsg (msg )
558
+ case sequenceMsg :
559
+ p .execSequenceMsg (msg )
560
+ default :
561
+ p .Send (msg )
562
+ }
563
+ }()
564
+ }
565
+
566
+ wg .Wait () // wait for all commands from batch msg to finish
567
+ }
568
+
549
569
// Run initializes the program and runs its event loops, blocking until it gets
550
570
// terminated by either [Program.Quit], [Program.Kill], or its signal handler.
551
571
// Returns the final model.
0 commit comments