From bb4a02babc7bb387514524c37a9b33e5d6a80e1b Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 17 May 2020 15:08:12 +0200 Subject: [PATCH] app/internal/window: [iOS] implement clipboard Updates gio#31 Signed-off-by: Elias Naur --- app/internal/window/os_ios.go | 22 ++++++++++++++++++++++ app/internal/window/os_ios.m | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/app/internal/window/os_ios.go b/app/internal/window/os_ios.go index 959efdce..0361e868 100644 --- a/app/internal/window/os_ios.go +++ b/app/internal/window/os_ios.go @@ -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 { diff --git a/app/internal/window/os_ios.m b/app/internal/window/os_ios.m index ba4412a8..b5295799 100644 --- a/app/internal/window/os_ios.m +++ b/app/internal/window/os_ios.m @@ -279,6 +279,24 @@ NSArray *_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)];