github.com/cybriq/giocore@v0.0.7-0.20210703034601-cfb9cb5f3900/io/router/clipboard.go (about) 1 // SPDX-License-Identifier: Unlicense OR MIT 2 3 package router 4 5 import ( 6 "github.com/cybriq/giocore/internal/opconst" 7 "github.com/cybriq/giocore/internal/ops" 8 "github.com/cybriq/giocore/io/event" 9 ) 10 11 type clipboardQueue struct { 12 receivers map[event.Tag]struct{} 13 // request avoid read clipboard every frame while waiting. 14 requested bool 15 text *string 16 reader ops.Reader 17 } 18 19 // WriteClipboard returns the most recent text to be copied 20 // to the clipboard, if any. 21 func (q *clipboardQueue) WriteClipboard() (string, bool) { 22 if q.text == nil { 23 return "", false 24 } 25 text := *q.text 26 q.text = nil 27 return text, true 28 } 29 30 // ReadClipboard reports if any new handler is waiting 31 // to read the clipboard. 32 func (q *clipboardQueue) ReadClipboard() bool { 33 if len(q.receivers) <= 0 || q.requested { 34 return false 35 } 36 q.requested = true 37 return true 38 } 39 40 func (q *clipboardQueue) Push(e event.Event, events *handlerEvents) { 41 for r := range q.receivers { 42 events.Add(r, e) 43 delete(q.receivers, r) 44 } 45 } 46 47 func (q *clipboardQueue) ProcessWriteClipboard(d []byte, refs []interface{}) { 48 if opconst.OpType(d[0]) != opconst.TypeClipboardWrite { 49 panic("invalid op") 50 } 51 q.text = refs[0].(*string) 52 } 53 54 func (q *clipboardQueue) ProcessReadClipboard(d []byte, refs []interface{}) { 55 if opconst.OpType(d[0]) != opconst.TypeClipboardRead { 56 panic("invalid op") 57 } 58 if q.receivers == nil { 59 q.receivers = make(map[event.Tag]struct{}) 60 } 61 tag := refs[0].(event.Tag) 62 if _, ok := q.receivers[tag]; !ok { 63 q.receivers[tag] = struct{}{} 64 q.requested = false 65 } 66 }