diff options
author | Andre Mueller <andre.mueller@cosateq.com> | 2023-04-24 13:32:10 +1000 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2023-04-24 13:33:27 +1000 |
commit | 07a22e69e768eb64c28bcbdabc95c24768d033a6 (patch) | |
tree | f17bb1eb3fc6484fc7f89c9484fe0fa1d71d2d76 | |
parent | 1efb565b22c17733acc8d39591cf3cdec54aa556 (diff) |
bump clipboard package for WSL support
-rw-r--r-- | go.mod | 2 | ||||
-rw-r--r-- | go.sum | 2 | ||||
-rw-r--r-- | vendor/github.com/atotto/clipboard/clipboard_plan9.go | 42 | ||||
-rw-r--r-- | vendor/github.com/atotto/clipboard/clipboard_unix.go | 32 | ||||
-rw-r--r-- | vendor/github.com/atotto/clipboard/clipboard_windows.go | 45 | ||||
-rw-r--r-- | vendor/modules.txt | 2 |
6 files changed, 109 insertions, 16 deletions
@@ -4,7 +4,7 @@ go 1.18 require ( github.com/OpenPeeDeeP/xdg v1.0.0 - github.com/atotto/clipboard v0.1.2 + github.com/atotto/clipboard v0.1.4 github.com/aybabtme/humanlog v0.4.1 github.com/cli/safeexec v1.0.0 github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 @@ -8,6 +8,8 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aybabtme/humanlog v0.4.1 h1:D8d9um55rrthJsP8IGSHBcti9lTb/XknmDAX6Zy8tek= github.com/aybabtme/humanlog v0.4.1/go.mod h1:B0bnQX4FTSU3oftPMTTPvENCy8LqixLDvYJA9TUCAGo= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= diff --git a/vendor/github.com/atotto/clipboard/clipboard_plan9.go b/vendor/github.com/atotto/clipboard/clipboard_plan9.go new file mode 100644 index 000000000..9d2fef4ef --- /dev/null +++ b/vendor/github.com/atotto/clipboard/clipboard_plan9.go @@ -0,0 +1,42 @@ +// 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 plan9 + +package clipboard + +import ( + "os" + "io/ioutil" +) + +func readAll() (string, error) { + f, err := os.Open("/dev/snarf") + if err != nil { + return "", err + } + defer f.Close() + + str, err := ioutil.ReadAll(f) + if err != nil { + return "", err + } + + return string(str), nil +} + +func writeAll(text string) error { + f, err := os.OpenFile("/dev/snarf", os.O_WRONLY, 0666) + if err != nil { + return err + } + defer f.Close() + + _, err = f.Write([]byte(text)) + if err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/atotto/clipboard/clipboard_unix.go b/vendor/github.com/atotto/clipboard/clipboard_unix.go index 8f5e23c37..d9f6a5610 100644 --- a/vendor/github.com/atotto/clipboard/clipboard_unix.go +++ b/vendor/github.com/atotto/clipboard/clipboard_unix.go @@ -15,14 +15,17 @@ import ( const ( xsel = "xsel" xclip = "xclip" - wlcopy = "wl-copy" - wlpaste = "wl-paste" + powershellExe = "powershell.exe" + clipExe = "clip.exe" + wlcopy = "wl-copy" + wlpaste = "wl-paste" termuxClipboardGet = "termux-clipboard-get" termuxClipboardSet = "termux-clipboard-set" ) var ( Primary bool + trimDos bool pasteCmdArgs []string copyCmdArgs []string @@ -33,8 +36,11 @@ var ( xclipPasteArgs = []string{xclip, "-out", "-selection", "clipboard"} xclipCopyArgs = []string{xclip, "-in", "-selection", "clipboard"} + powershellExePasteArgs = []string{powershellExe, "Get-Clipboard"} + clipExeCopyArgs = []string{clipExe} + wlpasteArgs = []string{wlpaste, "--no-newline"} - wlcopyArgs = []string{wlcopy} + wlcopyArgs = []string{wlcopy} termuxPasteArgs = []string{termuxClipboardGet} termuxCopyArgs = []string{termuxClipboardSet} @@ -44,8 +50,8 @@ var ( func init() { if os.Getenv("WAYLAND_DISPLAY") != "" { - pasteCmdArgs = wlpasteArgs; - copyCmdArgs = wlcopyArgs; + pasteCmdArgs = wlpasteArgs + copyCmdArgs = wlcopyArgs if _, err := exec.LookPath(wlcopy); err == nil { if _, err := exec.LookPath(wlpaste); err == nil { @@ -77,6 +83,16 @@ func init() { } } + pasteCmdArgs = powershellExePasteArgs + copyCmdArgs = clipExeCopyArgs + trimDos = true + + if _, err := exec.LookPath(clipExe); err == nil { + if _, err := exec.LookPath(powershellExe); err == nil { + return + } + } + Unsupported = true } @@ -103,7 +119,11 @@ func readAll() (string, error) { if err != nil { return "", err } - return string(out), nil + result := string(out) + if trimDos && len(result) > 1 { + result = result[:len(result)-2] + } + return result, nil } func writeAll(text string) error { diff --git a/vendor/github.com/atotto/clipboard/clipboard_windows.go b/vendor/github.com/atotto/clipboard/clipboard_windows.go index 4b4aedb66..253bb9322 100644 --- a/vendor/github.com/atotto/clipboard/clipboard_windows.go +++ b/vendor/github.com/atotto/clipboard/clipboard_windows.go @@ -7,6 +7,7 @@ package clipboard import ( + "runtime" "syscall" "time" "unsafe" @@ -18,12 +19,13 @@ const ( ) var ( - user32 = syscall.MustLoadDLL("user32") - openClipboard = user32.MustFindProc("OpenClipboard") - closeClipboard = user32.MustFindProc("CloseClipboard") - emptyClipboard = user32.MustFindProc("EmptyClipboard") - getClipboardData = user32.MustFindProc("GetClipboardData") - setClipboardData = user32.MustFindProc("SetClipboardData") + user32 = syscall.MustLoadDLL("user32") + isClipboardFormatAvailable = user32.MustFindProc("IsClipboardFormatAvailable") + openClipboard = user32.MustFindProc("OpenClipboard") + closeClipboard = user32.MustFindProc("CloseClipboard") + emptyClipboard = user32.MustFindProc("EmptyClipboard") + getClipboardData = user32.MustFindProc("GetClipboardData") + setClipboardData = user32.MustFindProc("SetClipboardData") kernel32 = syscall.NewLazyDLL("kernel32") globalAlloc = kernel32.NewProc("GlobalAlloc") @@ -50,19 +52,27 @@ func waitOpenClipboard() error { } func readAll() (string, error) { + // LockOSThread ensure that the whole method will keep executing on the same thread from begin to end (it actually locks the goroutine thread attribution). + // Otherwise if the goroutine switch thread during execution (which is a common practice), the OpenClipboard and CloseClipboard will happen on two different threads, and it will result in a clipboard deadlock. + runtime.LockOSThread() + defer runtime.UnlockOSThread() + if formatAvailable, _, err := isClipboardFormatAvailable.Call(cfUnicodetext); formatAvailable == 0 { + return "", err + } err := waitOpenClipboard() if err != nil { return "", err } - defer closeClipboard.Call() h, _, err := getClipboardData.Call(cfUnicodetext) if h == 0 { + _, _, _ = closeClipboard.Call() return "", err } l, _, err := globalLock.Call(h) if l == 0 { + _, _, _ = closeClipboard.Call() return "", err } @@ -70,21 +80,31 @@ func readAll() (string, error) { r, _, err := globalUnlock.Call(h) if r == 0 { + _, _, _ = closeClipboard.Call() return "", err } + closed, _, err := closeClipboard.Call() + if closed == 0 { + return "", err + } return text, nil } func writeAll(text string) error { + // LockOSThread ensure that the whole method will keep executing on the same thread from begin to end (it actually locks the goroutine thread attribution). + // Otherwise if the goroutine switch thread during execution (which is a common practice), the OpenClipboard and CloseClipboard will happen on two different threads, and it will result in a clipboard deadlock. + runtime.LockOSThread() + defer runtime.UnlockOSThread() + err := waitOpenClipboard() if err != nil { return err } - defer closeClipboard.Call() r, _, err := emptyClipboard.Call(0) if r == 0 { + _, _, _ = closeClipboard.Call() return err } @@ -94,6 +114,7 @@ func writeAll(text string) error { // been allocated using the function with the GMEM_MOVEABLE flag." h, _, err := globalAlloc.Call(gmemMoveable, uintptr(len(data)*int(unsafe.Sizeof(data[0])))) if h == 0 { + _, _, _ = closeClipboard.Call() return err } defer func() { @@ -104,25 +125,33 @@ func writeAll(text string) error { l, _, err := globalLock.Call(h) if l == 0 { + _, _, _ = closeClipboard.Call() return err } r, _, err = lstrcpy.Call(l, uintptr(unsafe.Pointer(&data[0]))) if r == 0 { + _, _, _ = closeClipboard.Call() return err } r, _, err = globalUnlock.Call(h) if r == 0 { if err.(syscall.Errno) != 0 { + _, _, _ = closeClipboard.Call() return err } } r, _, err = setClipboardData.Call(cfUnicodetext, h) if r == 0 { + _, _, _ = closeClipboard.Call() return err } h = 0 // suppress deferred cleanup + closed, _, err := closeClipboard.Call() + if closed == 0 { + return err + } return nil } diff --git a/vendor/modules.txt b/vendor/modules.txt index 06224918c..12028e79c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,7 +1,7 @@ # github.com/OpenPeeDeeP/xdg v1.0.0 ## explicit github.com/OpenPeeDeeP/xdg -# github.com/atotto/clipboard v0.1.2 +# github.com/atotto/clipboard v0.1.4 ## explicit github.com/atotto/clipboard # github.com/aybabtme/humanlog v0.4.1 |