//go:build windows package platform import ( "context" "golang.design/x/clipboard" ) // windowsClipboard is the Windows Source backed by golang.design/x/clipboard // (pure syscall, no cgo): it watches the clipboard for local copies via // GetClipboardSequenceNumber polling and writes plain text back. type windowsClipboard struct { ready bool } // NewClipboardSource returns the platform clipboard Source (Windows). If the // clipboard can't be initialised it degrades to an inert source so the rest of // the sync wiring still runs. func NewClipboardSource() Source { return &windowsClipboard{ready: clipboard.Init() == nil} } func (c *windowsClipboard) Watch(ctx context.Context) <-chan ClipboardEvent { out := make(chan ClipboardEvent) go func() { defer close(out) if !c.ready { <-ctx.Done() return } changes := clipboard.Watch(ctx, clipboard.FmtText) for { select { case <-ctx.Done(): return case data, ok := <-changes: if !ok { return } if data.Format != clipboard.FmtText || len(data.Bytes) == 0 { continue } // golang.design/x/clipboard surfaces only the text — the Windows // privacy formats (ExcludeClipboardContentFromMonitorProcessing / // CanUploadToCloudClipboard) aren't exposed, so Sensitive stays // false and the server's 5-min TTL is the backstop. A raw // EnumClipboardFormats check is a possible follow-up. select { case out <- ClipboardEvent{Text: string(data.Bytes)}: case <-ctx.Done(): return } } } }() return out } func (c *windowsClipboard) Write(text string) error { if !c.ready { return nil } clipboard.Write(clipboard.FmtText, []byte(text)) return nil }