Compare commits

...

1 Commits

Author SHA1 Message Date
Lea Anthony 43727fbec7 Improve clipboard handling on macOS 2024-02-01 08:33:41 +11:00
@@ -3,34 +3,55 @@
package darwin
import (
"os/exec"
"fmt"
)
/*
#cgo CFLAGS: -mmacosx-version-min=10.13 -x objective-c
#cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=10.13
#import <Cocoa/Cocoa.h>
#import <stdlib.h>
bool setClipboardText(const char* text) {
NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];
NSError *error = nil;
NSString *string = [NSString stringWithUTF8String:text];
[pasteBoard clearContents];
return [pasteBoard setString:string forType:NSPasteboardTypeString];
}
const char* getClipboardText() {
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
NSString *text = [pasteboard stringForType:NSPasteboardTypeString];
return [text UTF8String];
}
*/
import "C"
import (
"sync"
"unsafe"
)
var clipboardLock sync.RWMutex
func (f *Frontend) ClipboardGetText() (string, error) {
pasteCmd := exec.Command("pbpaste")
out, err := pasteCmd.Output()
if err != nil {
return "", err
}
return string(out), nil
clipboardLock.RLock()
defer clipboardLock.RUnlock()
clipboardText := C.getClipboardText()
result := C.GoString(clipboardText)
return result, nil
}
func (f *Frontend) ClipboardSetText(text string) error {
copyCmd := exec.Command("pbcopy")
in, err := copyCmd.StdinPipe()
if err != nil {
return err
clipboardLock.Lock()
defer clipboardLock.Unlock()
cText := C.CString(text)
success := C.setClipboardText(cText)
C.free(unsafe.Pointer(cText))
if !success {
return fmt.Errorf("unable to set clipboard text")
}
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()
return nil
}