summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/atotto/clipboard/clipboard_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/atotto/clipboard/clipboard_unix.go')
-rw-r--r--vendor/github.com/atotto/clipboard/clipboard_unix.go129
1 files changed, 129 insertions, 0 deletions
diff --git a/vendor/github.com/atotto/clipboard/clipboard_unix.go b/vendor/github.com/atotto/clipboard/clipboard_unix.go
new file mode 100644
index 000000000..8f5e23c37
--- /dev/null
+++ b/vendor/github.com/atotto/clipboard/clipboard_unix.go
@@ -0,0 +1,129 @@
+// 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()
+}