| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- //go:build !js && !wasm && !test_web_driver
- // +build !js,!wasm,!test_web_driver
- package glfw
- import (
- "runtime"
- "time"
- "fyne.io/fyne/v2"
- "github.com/go-gl/glfw/v3.3/glfw"
- )
- // Declare conformity with Clipboard interface
- var _ fyne.Clipboard = (*clipboard)(nil)
- // clipboard represents the system clipboard
- type clipboard struct {
- window *glfw.Window
- }
- // Content returns the clipboard content
- func (c *clipboard) Content() string {
- // This retry logic is to work around the "Access Denied" error often thrown in windows PR#1679
- if runtime.GOOS != "windows" {
- return c.content()
- }
- for i := 3; i > 0; i-- {
- cb := c.content()
- if cb != "" {
- return cb
- }
- time.Sleep(50 * time.Millisecond)
- }
- //can't log retry as it would alos log errors for an empty clipboard
- return ""
- }
- func (c *clipboard) content() string {
- content := ""
- runOnMain(func() {
- content = glfw.GetClipboardString()
- })
- return content
- }
- // SetContent sets the clipboard content
- func (c *clipboard) SetContent(content string) {
- // This retry logic is to work around the "Access Denied" error often thrown in windows PR#1679
- if runtime.GOOS != "windows" {
- c.setContent(content)
- return
- }
- for i := 3; i > 0; i-- {
- c.setContent(content)
- if c.content() == content {
- return
- }
- time.Sleep(50 * time.Millisecond)
- }
- fyne.LogError("GLFW clipboard set failed", nil)
- }
- func (c *clipboard) setContent(content string) {
- runOnMain(func() {
- defer func() {
- if r := recover(); r != nil {
- fyne.LogError("GLFW clipboard error (details above)", nil)
- }
- }()
- glfw.SetClipboardString(content)
- })
- }
|