1//go:build linux
2
3package tui
4
5import (
6 "fmt"
7 "os"
8)
9
10// ReadClipboardText reads plain text from a Wayland or X11 clipboard. The
11// small command-line clients are used to preserve zut's CGO-free build.
12func ReadClipboardText() (string, bool, error) {
13 var commands []clipboardTextCommand
14 if os.Getenv("WAYLAND_DISPLAY") != "" {
15 commands = append(commands, clipboardTextCommand{name: "wl-paste", args: []string{"--no-newline", "--type", "text"}})
16 }
17 if os.Getenv("DISPLAY") != "" {
18 commands = append(commands,
19 clipboardTextCommand{name: "xclip", args: []string{"-selection", "clipboard", "-out"}},
20 clipboardTextCommand{name: "xsel", args: []string{"--clipboard", "--output"}},
21 )
22 }
23 // Environment forwarding through multiplexers is not always reliable.
24 // Try every backend if no display variable made a preferred list.
25 if len(commands) == 0 {
26 commands = []clipboardTextCommand{
27 {name: "wl-paste", args: []string{"--no-newline", "--type", "text"}},
28 {name: "xclip", args: []string{"-selection", "clipboard", "-out"}},
29 {name: "xsel", args: []string{"--clipboard", "--output"}},
30 }
31 }
32 text, ok, err := readClipboardTextCommands(commands...)
33 if err == errClipboardCommandUnavailable {
34 return "", false, fmt.Errorf("text clipboard unavailable: install wl-clipboard, xclip, or xsel, or use the terminal paste shortcut")
35 }
36 if err != nil {
37 return "", false, fmt.Errorf("read text clipboard: %w", err)
38 }
39 return text, ok, nil
40}