app/internal/window: [iOS] implement clipboard

Updates gio#31

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-05-17 15:08:12 +02:00
parent 7b5a03e0ec
commit bb4a02babc
2 changed files with 40 additions and 0 deletions
+22
View File
@@ -17,6 +17,8 @@ __attribute__ ((visibility ("hidden"))) void gio_addLayerToView(CFTypeRef viewRe
__attribute__ ((visibility ("hidden"))) void gio_updateView(CFTypeRef viewRef, CFTypeRef layerRef);
__attribute__ ((visibility ("hidden"))) void gio_removeLayer(CFTypeRef layerRef);
__attribute__ ((visibility ("hidden"))) void gio_setAnimating(CFTypeRef viewRef, int anim);
__attribute__ ((visibility ("hidden"))) CFTypeRef gio_readClipboard(void);
__attribute__ ((visibility ("hidden"))) void gio_writeClipboard(unichar *chars, NSUInteger length);
*/
import "C"
@@ -26,6 +28,8 @@ import (
"runtime/debug"
"sync/atomic"
"time"
"unicode/utf16"
"unsafe"
"gioui.org/f32"
"gioui.org/io/key"
@@ -199,6 +203,24 @@ func onTouch(last C.int, view, touchRef C.CFTypeRef, phase C.NSInteger, x, y C.C
})
}
func (w *window) ReadClipboard() {
runOnMain(func() {
content := nsstringToString(C.gio_readClipboard())
w.w.Event(system.ClipboardEvent{Text: content})
})
}
func (w *window) WriteClipboard(s string) {
u16 := utf16.Encode([]rune(s))
runOnMain(func() {
var chars *C.unichar
if len(u16) > 0 {
chars = (*C.unichar)(unsafe.Pointer(&u16[0]))
}
C.gio_writeClipboard(chars, C.NSUInteger(len(u16)))
})
}
func (w *window) SetAnimating(anim bool) {
v := w.view
if v == 0 {
+18
View File
@@ -279,6 +279,24 @@ NSArray<UIKeyCommand *> *_keyCommands;
}
@end
void gio_writeClipboard(unichar *chars, NSUInteger length) {
@autoreleasepool {
NSString *s = [NSString string];
if (length > 0) {
s = [NSString stringWithCharacters:chars length:length];
}
UIPasteboard *p = UIPasteboard.generalPasteboard;
p.string = s;
}
}
CFTypeRef gio_readClipboard(void) {
@autoreleasepool {
UIPasteboard *p = UIPasteboard.generalPasteboard;
return (__bridge_retained CFTypeRef)p.string;
}
}
void gio_setAnimating(CFTypeRef viewRef, int anim) {
GioView *view = (__bridge GioView *)viewRef;
[view setAnimating:(anim ? YES : NO)];