From b1dfc94a9bcef1e939a08cffdfecacfb07bde644 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 4 Mar 2021 13:31:56 +0100 Subject: [PATCH] app/internal/window: use golang.org/x/window UTF-16 routines Less code, no functional change. Signed-off-by: Elias Naur --- app/internal/window/os_windows.go | 25 ++++++------------------- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 9 insertions(+), 22 deletions(-) diff --git a/app/internal/window/os_windows.go b/app/internal/window/os_windows.go index f5c8a441..16153e46 100644 --- a/app/internal/window/os_windows.go +++ b/app/internal/window/os_windows.go @@ -13,13 +13,13 @@ import ( "sync" "time" "unicode" - "unicode/utf16" "unsafe" syscall "golang.org/x/sys/windows" "gioui.org/app/internal/windows" "gioui.org/unit" + gowindows "golang.org/x/sys/windows" "gioui.org/f32" "gioui.org/io/clipboard" @@ -518,21 +518,7 @@ func (w *window) readClipboard() error { return err } defer windows.GlobalUnlock(mem) - // Look for terminating null character. - n := 0 - for { - ch := *(*uint16)(unsafe.Pointer(ptr + uintptr(n)*2)) - if ch == 0 { - break - } - n++ - } - var u16 []uint16 - hdr := (*reflect.SliceHeader)(unsafe.Pointer(&u16)) - hdr.Data = ptr - hdr.Cap = n - hdr.Len = n - content := string(utf16.Decode(u16)) + content := gowindows.UTF16PtrToString((*uint16)(unsafe.Pointer(ptr))) go func() { w.w.Event(clipboard.Event{Text: content}) }() @@ -544,9 +530,6 @@ func (w *window) WriteClipboard(s string) { } func (w *window) writeClipboard(s string) error { - u16 := utf16.Encode([]rune(s)) - // Data must be null terminated. - u16 = append(u16, 0) if err := windows.OpenClipboard(w.hwnd); err != nil { return err } @@ -554,6 +537,10 @@ func (w *window) writeClipboard(s string) error { if err := windows.EmptyClipboard(); err != nil { return err } + u16, err := gowindows.UTF16FromString(s) + if err != nil { + return err + } n := len(u16) * int(unsafe.Sizeof(u16[0])) mem, err := windows.GlobalAlloc(n) if err != nil { diff --git a/go.mod b/go.mod index 818067ac..9555d834 100644 --- a/go.mod +++ b/go.mod @@ -5,5 +5,5 @@ go 1.14 require ( golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3 golang.org/x/image v0.0.0-20200618115811-c13761719519 - golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 + golang.org/x/sys v0.0.0-20210304124612-50617c2ba197 ) diff --git a/go.sum b/go.sum index 56d17620..1522d9e3 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197 h1:7+SpRyhoo46QjKkYInQXpcfxx3TYFEYkn131lwGE9/0= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=