// Copyright 2013 @atotto. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build freebsd linux netbsd openbsd solaris dragonfly package clipboard import ( "errors" "os" "os/exec" ) const ( xsel = "xsel" xclip = "xclip" wlcopy = "wl-copy" wlpaste = "wl-paste" termuxClipboardGet = "termux-clipboard-get" termuxClipboardSet = "termux-clipboard-set" ) var ( Primary bool pasteCmdArgs []string copyCmdArgs []string xselPasteArgs = []string{xsel, "--output", "--clipboard"} xselCopyArgs = []string{xsel, "--input", "--clipboard"} xclipPasteArgs = []string{xclip, "-out", "-selection", "clipboard"} xclipCopyArgs = []string{xclip, "-in", "-selection", "clipboard"} wlpasteArgs = []string{wlpaste, "--no-newline"} wlcopyArgs = []string{wlcopy} termuxPasteArgs = []string{termuxClipboardGet} termuxCopyArgs = []string{termuxClipboardSet} missingCommands = errors.New("No clipboard utilities available. Please install xsel, xclip, wl-clipboard or Termux:API add-on for termux-clipboard-get/set.") ) func init() { if os.Getenv("WAYLAND_DISPLAY") != "" { pasteCmdArgs = wlpasteArgs; copyCmdArgs = wlcopyArgs; if _, err := exec.LookPath(wlcopy); err == nil { if _, err := exec.LookPath(wlpaste); err == nil { return } } } pasteCmdArgs = xclipPasteArgs copyCmdArgs = xclipCopyArgs if _, err := exec.LookPath(xclip); err == nil { return } pasteCmdArgs = xselPasteArgs copyCmdArgs = xselCopyArgs if _, err := exec.LookPath(xsel); err == nil { return } pasteCmdArgs = termuxPasteArgs copyCmdArgs = termuxCopyArgs if _, err := exec.LookPath(termuxClipboardSet); err == nil { if _, err := exec.LookPath(termuxClipboardGet); err == nil { return } } Unsupported = true } func getPasteCommand() *exec.Cmd { if Primary { pasteCmdArgs = pasteCmdArgs[:1] } return exec.Command(pasteCmdArgs[0], pasteCmdArgs[1:]...) } func getCopyCommand() *exec.Cmd { if Primary { copyCmdArgs = copyCmdArgs[:1] } return exec.Command(copyCmdArgs[0], copyCmdArgs[1:]...) } func readAll() (string, error) { if Unsupported { return "", missingCommands } pasteCmd := getPasteCommand() out, err := pasteCmd.Output() if err != nil { return "", err } return string(out), nil } func writeAll(text string) error { if Unsupported { return missingCommands } copyCmd := getCopyCommand() in, err := copyCmd.StdinPipe() if err != nil { return err } if err := copyCmd.Start(); err != nil { return err } if _, err := in.Write([]byte(text)); err != nil { return err } if err := in.Close(); err != nil { return err } return copyCmd.Wait() }