diff --git a/app/internal/window/os_android.go b/app/internal/window/os_android.go index a0eae136..fbf8eb23 100644 --- a/app/internal/window/os_android.go +++ b/app/internal/window/os_android.go @@ -52,6 +52,7 @@ import ( "unsafe" "gioui.org/f32" + "gioui.org/io/clipboard" "gioui.org/io/key" "gioui.org/io/pointer" "gioui.org/io/system" @@ -647,7 +648,7 @@ func (w *window) ReadClipboard() { return } content := goString(env, C.jstring(c)) - w.callbacks.Event(system.ClipboardEvent{Text: content}) + w.callbacks.Event(clipboard.Event{Text: content}) }) } diff --git a/app/internal/window/os_ios.go b/app/internal/window/os_ios.go index daf581a9..c68d0e2a 100644 --- a/app/internal/window/os_ios.go +++ b/app/internal/window/os_ios.go @@ -38,6 +38,7 @@ import ( "unsafe" "gioui.org/f32" + "gioui.org/io/clipboard" "gioui.org/io/key" "gioui.org/io/pointer" "gioui.org/io/system" @@ -223,7 +224,7 @@ 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}) + w.w.Event(clipboard.Event{Text: content}) }) } diff --git a/app/internal/window/os_js.go b/app/internal/window/os_js.go index 74a7efee..4a812c01 100644 --- a/app/internal/window/os_js.go +++ b/app/internal/window/os_js.go @@ -12,6 +12,7 @@ import ( "unicode/utf8" "gioui.org/f32" + "gioui.org/io/clipboard" "gioui.org/io/key" "gioui.org/io/pointer" "gioui.org/io/system" @@ -59,7 +60,7 @@ func NewWindow(win Callbacks, opts *Options) error { }) w.clipboardCallback = w.funcOf(func(this js.Value, args []js.Value) interface{} { content := args[0].String() - win.Event(system.ClipboardEvent{Text: content}) + win.Event(clipboard.Event{Text: content}) return nil }) w.addEventListeners() diff --git a/app/internal/window/os_macos.go b/app/internal/window/os_macos.go index 2d2d153e..f6be2cd6 100644 --- a/app/internal/window/os_macos.go +++ b/app/internal/window/os_macos.go @@ -14,6 +14,7 @@ import ( "unsafe" "gioui.org/f32" + "gioui.org/io/clipboard" "gioui.org/io/key" "gioui.org/io/pointer" "gioui.org/io/system" @@ -108,7 +109,7 @@ func (w *window) contextView() C.CFTypeRef { func (w *window) ReadClipboard() { runOnMain(func() { content := nsstringToString(C.gio_readClipboard()) - w.w.Event(system.ClipboardEvent{Text: content}) + w.w.Event(clipboard.Event{Text: content}) }) } diff --git a/app/internal/window/os_wayland.go b/app/internal/window/os_wayland.go index 59d10717..eea5c000 100644 --- a/app/internal/window/os_wayland.go +++ b/app/internal/window/os_wayland.go @@ -22,6 +22,7 @@ import ( "gioui.org/app/internal/xkb" "gioui.org/f32" "gioui.org/internal/fling" + "gioui.org/io/clipboard" "gioui.org/io/key" "gioui.org/io/pointer" "gioui.org/io/system" @@ -1134,14 +1135,14 @@ func (w *window) process() { r, err := w.disp.readClipboard() // Send empty responses on unavailable clipboards or errors. if r == nil || err != nil { - w.w.Event(system.ClipboardEvent{}) + w.w.Event(clipboard.Event{}) return } // Don't let slow clipboard transfers block event loop. go func() { defer r.Close() data, _ := ioutil.ReadAll(r) - w.w.Event(system.ClipboardEvent{Text: string(data)}) + w.w.Event(clipboard.Event{Text: string(data)}) }() } if writeClipboard != nil { diff --git a/app/internal/window/os_windows.go b/app/internal/window/os_windows.go index 6351f332..938fa7b8 100644 --- a/app/internal/window/os_windows.go +++ b/app/internal/window/os_windows.go @@ -22,6 +22,7 @@ import ( "gioui.org/unit" "gioui.org/f32" + "gioui.org/io/clipboard" "gioui.org/io/key" "gioui.org/io/pointer" "gioui.org/io/system" @@ -513,7 +514,7 @@ func (w *window) readClipboard() error { hdr.Len = n content := string(utf16.Decode(u16)) go func() { - w.w.Event(system.ClipboardEvent{Text: content}) + w.w.Event(clipboard.Event{Text: content}) }() return nil } diff --git a/app/internal/window/os_x11.go b/app/internal/window/os_x11.go index a96c3157..c6e2762d 100644 --- a/app/internal/window/os_x11.go +++ b/app/internal/window/os_x11.go @@ -36,6 +36,7 @@ import ( "unsafe" "gioui.org/f32" + "gioui.org/io/clipboard" "gioui.org/io/key" "gioui.org/io/pointer" "gioui.org/io/system" @@ -434,7 +435,7 @@ func (h *x11EventHandler) handleEvents() bool { break } str := C.GoStringN((*C.char)(unsafe.Pointer(text.value)), C.int(text.nitems)) - w.w.Event(system.ClipboardEvent{Text: str}) + w.w.Event(clipboard.Event{Text: str}) case C.SelectionRequest: cevt := (*C.XSelectionRequestEvent)(unsafe.Pointer(xev)) if cevt.selection != w.atoms.clipboard || cevt.property == C.None { diff --git a/app/window.go b/app/window.go index 136350a7..bd5c5bb7 100644 --- a/app/window.go +++ b/app/window.go @@ -195,7 +195,7 @@ func (w *Window) Invalidate() { } // ReadClipboard initiates a read of the clipboard in the form -// of a system.ClipboardEvent. Multiple reads may be coalesced +// of a clipboard.Event. Multiple reads may be coalesced // to a single event. func (w *Window) ReadClipboard() { go w.driverDo(func() { diff --git a/io/clipboard/clipboard.go b/io/clipboard/clipboard.go new file mode 100644 index 00000000..5acd7685 --- /dev/null +++ b/io/clipboard/clipboard.go @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package clipboard + +// Event is generated when the clipboard content is requested. +type Event struct { + Text string +} + +func (Event) ImplementsEvent() {} diff --git a/io/system/system.go b/io/system/system.go index 4aa88d3b..f1279f9a 100644 --- a/io/system/system.go +++ b/io/system/system.go @@ -60,12 +60,6 @@ type DestroyEvent struct { Err error } -// ClipboardEvent is sent once for each request for the -// clipboard content. -type ClipboardEvent struct { - Text string -} - // Insets is the space taken up by // system decoration such as translucent // system bars and software keyboards. @@ -118,8 +112,7 @@ func (l Stage) String() string { } } -func (FrameEvent) ImplementsEvent() {} -func (StageEvent) ImplementsEvent() {} -func (*CommandEvent) ImplementsEvent() {} -func (DestroyEvent) ImplementsEvent() {} -func (ClipboardEvent) ImplementsEvent() {} +func (FrameEvent) ImplementsEvent() {} +func (StageEvent) ImplementsEvent() {} +func (*CommandEvent) ImplementsEvent() {} +func (DestroyEvent) ImplementsEvent() {}