Skip to content
This repository was archived by the owner on Feb 25, 2026. It is now read-only.

Commit f18c2ce

Browse files
committed
fixed: exit on wl-paste watch issue
This patch makes the program exit when it can't launch wl-paste correctly. I noticed this can happen if your WAYLAND_DISPLAY changed for whatever reason. This allows the daemon manager to properly retry to start the service, since it's mostly unrecoverable without too much hassle.
1 parent 224b106 commit f18c2ce

2 files changed

Lines changed: 41 additions & 33 deletions

File tree

cboard/tools.go

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"fmt"
88
"io"
99
"os/exec"
10-
"time"
1110
)
1211

1312
type toolsClipboardManager struct {
@@ -70,42 +69,51 @@ func (c *toolsClipboardManager) Watch(ctx context.Context) (<-chan []byte, <-cha
7069

7170
go func() {
7271

73-
for {
74-
cmd := exec.Command("wl-paste", "--no-newline", "-w", "echo")
72+
cmd := exec.Command("wl-paste", "--no-newline", "-w", "echo")
7573

76-
stdout, err := cmd.StdoutPipe()
77-
if err != nil {
78-
cherr <- fmt.Errorf("unable to bind stdout: %w", err)
79-
break
80-
}
81-
defer stdout.Close() //nolint
74+
stdout, err := cmd.StdoutPipe()
75+
if err != nil {
76+
cherr <- fmt.Errorf("unable to bind stdout: %w", err)
77+
return
78+
}
79+
defer stdout.Close() //nolint
8280

83-
if err := cmd.Start(); err != nil {
84-
cherr <- fmt.Errorf("unable to start command: %w", err)
85-
break
86-
}
81+
stderr, err := cmd.StderrPipe()
82+
if err != nil {
83+
cherr <- fmt.Errorf("unable to bind stderr: %w", err)
84+
return
85+
}
86+
defer stderr.Close() //nolint
87+
88+
buf := bytes.NewBuffer(nil)
89+
go func() {
90+
io.Copy(buf, stderr)
91+
}()
92+
93+
if err := cmd.Start(); err != nil {
94+
cherr <- fmt.Errorf("unable to start command: %w", err)
95+
return
96+
}
97+
98+
scan := bufio.NewScanner(stdout)
99+
100+
go func() {
101+
for scan.Scan() {
102+
data, err := c.Read()
103+
if err != nil {
104+
cherr <- fmt.Errorf("unable to scan stdout: %w", err)
105+
return
106+
}
87107

88-
scan := bufio.NewScanner(stdout)
89-
90-
go func() {
91-
for scan.Scan() {
92-
data, err := c.Read()
93-
if err != nil {
94-
cherr <- fmt.Errorf("unable to scan stdout: %w", err)
95-
return
96-
}
97-
98-
select {
99-
case chout <- data:
100-
case <-ctx.Done():
101-
default:
102-
}
108+
select {
109+
case chout <- data:
110+
case <-ctx.Done():
111+
default:
103112
}
104-
}()
105-
if err := cmd.Wait(); err != nil {
106-
cherr <- fmt.Errorf("error while listening wl-paste (restarting): %w", err)
107-
time.Sleep(1 * time.Second)
108113
}
114+
}()
115+
if err := cmd.Wait(); err != nil {
116+
cherr <- fmt.Errorf("error while listening wl-paste: %w", err)
109117
}
110118
}()
111119

client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ var listenCmd = &cobra.Command{
105105
for {
106106
select {
107107
case err := <-watchErrChan:
108-
log.Printf("error during watch: %s", err)
108+
return fmt.Errorf("error during watch: %w", err)
109109

110110
case data := <-watchChan:
111111
h := sha256.New().Sum(data)

0 commit comments

Comments
 (0)