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}