1//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || aix || zos
 2// +build darwin dragonfly freebsd linux netbsd openbsd solaris aix zos
 3
 4package uv
 5
 6import (
 7	"context"
 8	"os"
 9	"os/signal"
10	"sync"
11	"syscall"
12
13	"github.com/charmbracelet/x/term"
14	"github.com/charmbracelet/x/termios"
15)
16
17func (l *WinChReceiver) receiveEvents(ctx context.Context, f term.File, evch chan<- Event) error {
18	sig := make(chan os.Signal, 1)
19	signal.Notify(sig, syscall.SIGWINCH)
20
21	defer signal.Stop(sig)
22
23	sendWinSize := func(w, h int) {
24		select {
25		case <-ctx.Done():
26		case evch <- WindowSizeEvent{w, h}:
27		}
28	}
29
30	sendPixelSize := func(w, h int) {
31		select {
32		case <-ctx.Done():
33		case evch <- WindowPixelSizeEvent{w, h}:
34		}
35	}
36
37	// Listen for window size changes.
38	var wg sync.WaitGroup
39	for {
40		select {
41		case <-ctx.Done():
42			return nil
43		case <-sig:
44			winsize, err := termios.GetWinsize(int(f.Fd()))
45			if err != nil {
46				return err
47			}
48
49			wg.Add(1)
50			go func() {
51				defer wg.Done()
52				sendWinSize(int(winsize.Col), int(winsize.Row))
53			}()
54
55			wg.Add(1)
56			go func() {
57				defer wg.Done()
58				sendPixelSize(int(winsize.Xpixel), int(winsize.Ypixel))
59			}()
60
61			// Wait for all goroutines to finish before continuing.
62			wg.Wait()
63		}
64	}
65}