module clipboard #include #include #flag -framework Cocoa struct Clipboard { pb voidptr last_cb_serial i64 mut: foo int // TODO remove, for mut hack } fn new_clipboard() &Clipboard{ pb := voidptr(0) #pb = [NSPasteboard generalPasteboard]; cb := &Clipboard{ pb: pb } return cb } fn (cb &Clipboard) check_availability() bool { return cb.pb != C.NULL } fn (cb mut Clipboard) clear(){ cb.foo = 0 #[cb->pb clearContents]; } fn (cb mut Clipboard) free(){ cb.foo = 0 //nothing to free } fn (cb &Clipboard) has_ownership() bool { if cb.last_cb_serial == 0 {return false} #return [cb->pb changeCount] == cb->last_cb_serial; return false } fn C.OSAtomicCompareAndSwapLong() fn (cb mut Clipboard) set_text(text string) bool { cb.foo = 0 #NSString *ns_clip; ret := false #ns_clip = [[ NSString alloc ] initWithBytesNoCopy:text.str length:text.len encoding:NSUTF8StringEncoding freeWhenDone: false]; #[cb->pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; #ret = [cb->pb setString:ns_clip forType:NSStringPboardType]; #[ns_clip release]; mut serial := 0 #serial = [cb->pb changeCount]; C.OSAtomicCompareAndSwapLong(cb.last_cb_serial, serial, &cb.last_cb_serial) return ret } fn (cb mut Clipboard) get_text() string { cb.foo = 0 #NSString *ns_clip; utf8_clip := byteptr(0) #ns_clip = [cb->pb stringForType:NSStringPboardType]; //NSPasteboardTypeString #if (ns_clip == nil) { # return tos3(""); //in case clipboard is empty #} #utf8_clip = [ns_clip UTF8String]; return string(utf8_clip) }