Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
4c310187b7 |
|
@ -3,7 +3,7 @@
|
||||||
A tiny library to access the MacOS clipboard (a.k.a. NSPasteboard).
|
A tiny library to access the MacOS clipboard (a.k.a. NSPasteboard).
|
||||||
|
|
||||||
```go
|
```go
|
||||||
go get git.wow.st/63l06ri5/clip
|
go get git.wow.st/gmp/clip
|
||||||
```
|
```
|
||||||
|
|
||||||
## API:
|
## API:
|
||||||
|
@ -20,3 +20,4 @@ func Set(string) bool
|
||||||
// Get retrieves the string currently on the pasteboard.
|
// Get retrieves the string currently on the pasteboard.
|
||||||
func Get() string
|
func Get() string
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
45
main.go
45
main.go
|
@ -1,18 +1,11 @@
|
||||||
package clip
|
package clip
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"git.wow.st/gmp/clip/ns"
|
||||||
|
|
||||||
"git.wow.st/63l06ri5/clip/ns"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var pb *ns.NSPasteboard
|
var pb *ns.NSPasteboard
|
||||||
|
|
||||||
const (
|
|
||||||
uriPrefix = "file://"
|
|
||||||
uriPrefixLength = len(uriPrefix)
|
|
||||||
)
|
|
||||||
|
|
||||||
func Clear() {
|
func Clear() {
|
||||||
if pb == nil {
|
if pb == nil {
|
||||||
pb = ns.NSPasteboardGeneralPasteboard()
|
pb = ns.NSPasteboardGeneralPasteboard()
|
||||||
|
@ -39,39 +32,3 @@ func Get() string {
|
||||||
return ret.String()
|
return ret.String()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func PasteFileList(filePaths []string) {
|
|
||||||
if pb == nil {
|
|
||||||
pb = ns.NSPasteboardGeneralPasteboard()
|
|
||||||
}
|
|
||||||
pb.ClearContents()
|
|
||||||
pb.PasteFileList(filePaths)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetFileList() []string {
|
|
||||||
if pb == nil {
|
|
||||||
pb = ns.NSPasteboardGeneralPasteboard()
|
|
||||||
}
|
|
||||||
ret := pb.GetFileList()
|
|
||||||
result := make([]string, 0)
|
|
||||||
if ret.Ptr() == nil {
|
|
||||||
return result
|
|
||||||
} else {
|
|
||||||
filesStr := ret.String()
|
|
||||||
arr := strings.Split(filesStr, ns.FilesDelimeter)
|
|
||||||
for _, item := range arr {
|
|
||||||
if strings.HasPrefix(item, uriPrefix) {
|
|
||||||
result = append(result, item[uriPrefixLength:])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetImage(pathToStore string) bool {
|
|
||||||
if pb == nil {
|
|
||||||
pb = ns.NSPasteboardGeneralPasteboard()
|
|
||||||
}
|
|
||||||
|
|
||||||
return pb.GetImage(pathToStore)
|
|
||||||
}
|
|
||||||
|
|
152
ns/pasteboard.go
152
ns/pasteboard.go
|
@ -86,95 +86,18 @@ NSPasteboard_inst_GetString(void* o) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
NSPasteboard_inst_PasteFileList(void* o, void* string) {
|
|
||||||
@autoreleasepool {
|
|
||||||
NSArray *values = [(NSString*)string componentsSeparatedByString:@"\n"];
|
|
||||||
|
|
||||||
NSMutableArray *urls = [NSMutableArray arrayWithCapacity:values.count + 1];
|
|
||||||
for (NSString *value in values) {
|
|
||||||
id transformedValue = [NSURL fileURLWithPath:value isDirectory:NO];
|
|
||||||
[urls addObject:transformedValue];
|
|
||||||
}
|
|
||||||
|
|
||||||
NSString* pathPerLine = [values componentsJoinedByString:@"\n"];
|
|
||||||
|
|
||||||
NSPasteboard* pasteboard = (NSPasteboard*)o;
|
|
||||||
[pasteboard clearContents];
|
|
||||||
[pasteboard writeObjects:urls];
|
|
||||||
//Now add the pathsPerLine as a string
|
|
||||||
[pasteboard setString:pathPerLine forType:NSPasteboardTypeString];
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void* _Nullable
|
|
||||||
NSPasteboard_inst_GetFileList(void* o) {
|
|
||||||
NSString* _Nullable ret;
|
|
||||||
@autoreleasepool {
|
|
||||||
NSArray *classes = [NSArray arrayWithObject:[NSURL class]];
|
|
||||||
|
|
||||||
NSDictionary *options = [NSDictionary dictionaryWithObject:
|
|
||||||
[NSNumber numberWithBool:YES] forKey:NSPasteboardURLReadingFileURLsOnlyKey];
|
|
||||||
|
|
||||||
NSArray *fileURLs =
|
|
||||||
[(NSPasteboard*)o readObjectsForClasses:classes options:options];
|
|
||||||
|
|
||||||
NSMutableArray *paths = [NSMutableArray arrayWithCapacity:fileURLs.count];
|
|
||||||
for (NSURL *value in fileURLs) {
|
|
||||||
id transformedValue = value.absoluteString;
|
|
||||||
[paths addObject:transformedValue];
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = [paths componentsJoinedByString:@"\n"];
|
|
||||||
if (ret != nil && ret != o) { [ret retain]; }
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
NSPasteboard_inst_GetImage(void* o, void* filePath) {
|
|
||||||
BOOL ret;
|
|
||||||
@autoreleasepool {
|
|
||||||
|
|
||||||
NSData *data = [(NSPasteboard*)o dataForType:NSPasteboardTypeTIFF];
|
|
||||||
if (data != nil && data != o) {
|
|
||||||
// NSImage *img = [[NSImage alloc] initWithData:data];
|
|
||||||
//NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"image.tiff"];
|
|
||||||
[data writeToFile: (NSString*)filePath atomically: NO];
|
|
||||||
ret = true;
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
ret = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime"
|
|
||||||
"strings"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
"runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Id struct {
|
type Id struct {
|
||||||
ptr unsafe.Pointer
|
ptr unsafe.Pointer
|
||||||
}
|
}
|
||||||
|
func (o *Id) Ptr() unsafe.Pointer { if o == nil { return nil }; return o.ptr }
|
||||||
const FilesDelimeter = "\n"
|
|
||||||
|
|
||||||
func (o *Id) Ptr() unsafe.Pointer {
|
|
||||||
if o == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return o.ptr
|
|
||||||
}
|
|
||||||
|
|
||||||
type NSObject interface {
|
type NSObject interface {
|
||||||
Ptr() unsafe.Pointer
|
Ptr() unsafe.Pointer
|
||||||
|
@ -202,13 +125,7 @@ func (c *Char) Free() {
|
||||||
type BOOL C.uchar
|
type BOOL C.uchar
|
||||||
|
|
||||||
type NSString struct { Id }
|
type NSString struct { Id }
|
||||||
|
func (o *NSString) Ptr() unsafe.Pointer { if o == nil { return nil }; return o.ptr }
|
||||||
func (o *NSString) Ptr() unsafe.Pointer {
|
|
||||||
if o == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return o.ptr
|
|
||||||
}
|
|
||||||
func (o *Id) NSString() *NSString {
|
func (o *Id) NSString() *NSString {
|
||||||
return (*NSString)(unsafe.Pointer(o))
|
return (*NSString)(unsafe.Pointer(o))
|
||||||
}
|
}
|
||||||
|
@ -228,13 +145,7 @@ func (o *NSString) String() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
type NSPasteboard struct { Id }
|
type NSPasteboard struct { Id }
|
||||||
|
func (o *NSPasteboard) Ptr() unsafe.Pointer { if o == nil { return nil }; return o.ptr }
|
||||||
func (o *NSPasteboard) Ptr() unsafe.Pointer {
|
|
||||||
if o == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return o.ptr
|
|
||||||
}
|
|
||||||
func (o *Id) NSPasteboard() *NSPasteboard {
|
func (o *Id) NSPasteboard() *NSPasteboard {
|
||||||
return (*NSPasteboard)(unsafe.Pointer(o))
|
return (*NSPasteboard)(unsafe.Pointer(o))
|
||||||
}
|
}
|
||||||
|
@ -252,9 +163,7 @@ func (c *Char) String() string {
|
||||||
func NSStringWithUTF8String(nullTerminatedCString *Char) *NSString {
|
func NSStringWithUTF8String(nullTerminatedCString *Char) *NSString {
|
||||||
ret := &NSString{}
|
ret := &NSString{}
|
||||||
ret.ptr = unsafe.Pointer(C.NSString_StringWithUTF8String(unsafe.Pointer(nullTerminatedCString)))
|
ret.ptr = unsafe.Pointer(C.NSString_StringWithUTF8String(unsafe.Pointer(nullTerminatedCString)))
|
||||||
if ret.ptr == nil {
|
if ret.ptr == nil { return ret }
|
||||||
return ret
|
|
||||||
}
|
|
||||||
runtime.SetFinalizer(ret, func(o *NSString) {
|
runtime.SetFinalizer(ret, func(o *NSString) {
|
||||||
o.Release()
|
o.Release()
|
||||||
})
|
})
|
||||||
|
@ -271,9 +180,7 @@ func NSStringWithGoString(string string) *NSString {
|
||||||
func NSPasteboardGeneralPasteboard() *NSPasteboard {
|
func NSPasteboardGeneralPasteboard() *NSPasteboard {
|
||||||
ret := &NSPasteboard{}
|
ret := &NSPasteboard{}
|
||||||
ret.ptr = unsafe.Pointer(C.NSPasteboard_GeneralPasteboard())
|
ret.ptr = unsafe.Pointer(C.NSPasteboard_GeneralPasteboard())
|
||||||
if ret.ptr == nil {
|
if ret.ptr == nil { return ret }
|
||||||
return ret
|
|
||||||
}
|
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +191,7 @@ func (o *NSPasteboard) ClearContents() {
|
||||||
|
|
||||||
func (o *NSPasteboard) SetString(s string) bool {
|
func (o *NSPasteboard) SetString(s string) bool {
|
||||||
string := NSStringWithGoString(s)
|
string := NSStringWithGoString(s)
|
||||||
ret := (C.NSPasteboard_inst_SetString(o.Ptr(), string.Ptr())) != 0
|
ret := (C.NSPasteboard_inst_SetString(o.Ptr(), string.Ptr())) != false
|
||||||
runtime.KeepAlive(o)
|
runtime.KeepAlive(o)
|
||||||
runtime.KeepAlive(string)
|
runtime.KeepAlive(string)
|
||||||
return ret
|
return ret
|
||||||
|
@ -293,14 +200,8 @@ func (o *NSPasteboard) SetString(s string) bool {
|
||||||
func (o *NSPasteboard) GetString() *NSString {
|
func (o *NSPasteboard) GetString() *NSString {
|
||||||
ret := &NSString{}
|
ret := &NSString{}
|
||||||
ret.ptr = unsafe.Pointer(C.NSPasteboard_inst_GetString(o.Ptr()))
|
ret.ptr = unsafe.Pointer(C.NSPasteboard_inst_GetString(o.Ptr()))
|
||||||
if ret.ptr == nil {
|
if ret.ptr == nil { runtime.KeepAlive(o); return ret }
|
||||||
runtime.KeepAlive(o)
|
if ret.ptr == o.ptr { runtime.KeepAlive(o); return (*NSString)(unsafe.Pointer(o)) }
|
||||||
return ret
|
|
||||||
}
|
|
||||||
if ret.ptr == o.ptr {
|
|
||||||
runtime.KeepAlive(o)
|
|
||||||
return (*NSString)(unsafe.Pointer(o))
|
|
||||||
}
|
|
||||||
runtime.SetFinalizer(ret, func(o *NSString) {
|
runtime.SetFinalizer(ret, func(o *NSString) {
|
||||||
o.Release()
|
o.Release()
|
||||||
})
|
})
|
||||||
|
@ -308,38 +209,3 @@ func (o *NSPasteboard) GetString() *NSString {
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *NSPasteboard) PasteFileList(values []string) {
|
|
||||||
inString := strings.Join(values, FilesDelimeter)
|
|
||||||
str := NSStringWithGoString(inString)
|
|
||||||
C.NSPasteboard_inst_PasteFileList(o.Ptr(), str.Ptr())
|
|
||||||
runtime.KeepAlive(o)
|
|
||||||
runtime.KeepAlive(str)
|
|
||||||
return
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *NSPasteboard) GetFileList() *NSString {
|
|
||||||
ret := &NSString{}
|
|
||||||
ret.ptr = unsafe.Pointer(C.NSPasteboard_inst_GetFileList(o.Ptr()))
|
|
||||||
if ret.ptr == nil {
|
|
||||||
runtime.KeepAlive(o)
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
if ret.ptr == o.ptr {
|
|
||||||
runtime.KeepAlive(o)
|
|
||||||
return (*NSString)(unsafe.Pointer(o))
|
|
||||||
}
|
|
||||||
runtime.SetFinalizer(ret, func(o *NSString) {
|
|
||||||
o.Release()
|
|
||||||
})
|
|
||||||
runtime.KeepAlive(o)
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *NSPasteboard) GetImage(filePath string) bool {
|
|
||||||
string := NSStringWithGoString(filePath)
|
|
||||||
ret := (C.NSPasteboard_inst_GetImage(o.Ptr(), string.Ptr())) != 0
|
|
||||||
runtime.KeepAlive(o)
|
|
||||||
runtime.KeepAlive(string)
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# binding generator for git.wow.st/gmp/nswrap
|
# binding generator for git.wow.st/gmp/nswrap
|
||||||
# original binding is in ns/main.go- and is not used.
|
# original binding is in ns/main.go- and is not used.
|
||||||
inputfiles:
|
inputfiles:
|
||||||
- /System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h
|
- /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h
|
||||||
classes:
|
classes:
|
||||||
- NSPasteboard
|
- NSPasteboard
|
||||||
- NSString
|
- NSString
|
||||||
|
|
Loading…
Reference in New Issue
Block a user