| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- //go:build linux
- package clipboard
- import (
- "bytes"
- designClipb "golang.design/x/clipboard"
- "log/slog"
- "os"
- "os/exec"
- )
- var wayland bool
- func Init() error {
- if _, ok := os.LookupEnv("WAYLAND_DISPLAY"); !ok {
- return designClipb.Init()
- }
- if _, err := exec.LookPath("wl-copy"); err != nil {
- return err
- }
- if _, err := exec.LookPath("wl-paste"); err != nil {
- return err
- }
- wayland = true
- return nil
- }
- func Read(t Format) []byte {
- if !wayland {
- return designClipb.Read(designClipb.Format(t))
- }
- // -n: Don't print a newline at the end
- // -t type: MIME type specifier
- cmd := exec.Command("wl-paste", "-nt", formatToType(t))
- outBuffer := bytes.Buffer{}
- cmd.Stdout = &outBuffer
- if err := cmd.Run(); err != nil {
- slog.Error("failed to read clipboard", "err", err)
- return nil
- }
- return outBuffer.Bytes()
- }
- func Write(t Format, buf []byte) <-chan struct{} {
- if !wayland {
- return designClipb.Write(designClipb.Format(t), buf)
- }
- // -t type: MIME type specifier
- cmd := exec.Command("wl-copy", "-t", formatToType(t))
- cmd.Stdin = bytes.NewReader(buf)
- if err := cmd.Run(); err != nil {
- slog.Error("failed to write to clipboard", "err", err)
- }
- return nil
- }
- func formatToType(t Format) string {
- switch t {
- case FmtImage:
- return "image"
- case FmtText:
- fallthrough
- default:
- return "text/plain;charset=utf-8"
- }
- }
|