From 524b45c7784d537d975031d344273818cd33b741 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 25 Jan 2025 19:38:14 +0000 Subject: [PATCH 1/3] Work harder to get the right line when we report a fyne.Do mistake --- internal/async/goroutine.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/internal/async/goroutine.go b/internal/async/goroutine.go index 1064cbebcf..5f6252e559 100644 --- a/internal/async/goroutine.go +++ b/internal/async/goroutine.go @@ -59,14 +59,21 @@ func EnsureMain(fn func()) { } func logStackTop(skip int) { - pc := make([]uintptr, 2) - count := runtime.Callers(2+skip, pc) + pc := make([]uintptr, 16) + _ = runtime.Callers(skip, pc) frames := runtime.CallersFrames(pc) frame, more := frames.Next() - if more && count > 1 { - nextFrame, _ := frames.Next() // skip an occasional driver call to itself - if !strings.Contains(nextFrame.File, "runtime") { // don't descend into Go - frame = nextFrame + + var nextFrame runtime.Frame + for more { + nextFrame, more = frames.Next() + if nextFrame.File == "" || strings.Contains(nextFrame.File, "runtime") { // don't descend into Go + break + } + + frame = nextFrame + if !strings.Contains(nextFrame.File, "/fyne/") { // skip library lines + break } } log.Printf(" From: %s:%d", frame.File, frame.Line) From 38b6a175c0196240b4f9da62cce956a2d922d1ec Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 25 Jan 2025 19:38:57 +0000 Subject: [PATCH 2/3] Move the goroutine check back into drivers through Canvas.Refresh() This avoids test runs hitting thread issues with BaseWidget.Refresh() --- internal/driver/common/canvas.go | 6 ++++-- widget/widget.go | 15 ++++++--------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/internal/driver/common/canvas.go b/internal/driver/common/canvas.go index 834c4a2e86..9e05c1b60f 100644 --- a/internal/driver/common/canvas.go +++ b/internal/driver/common/canvas.go @@ -314,8 +314,10 @@ func (c *Canvas) Painter() gl.Painter { // Refresh refreshes a canvas object. func (c *Canvas) Refresh(obj fyne.CanvasObject) { - c.refreshQueue.In(obj) - c.SetDirty() + async.EnsureMain(func() { + c.refreshQueue.In(obj) + c.SetDirty() + }) } // RemoveShortcut removes a shortcut from the canvas. diff --git a/widget/widget.go b/widget/widget.go index 986333f154..fb38511750 100644 --- a/widget/widget.go +++ b/widget/widget.go @@ -4,7 +4,6 @@ package widget // import "fyne.io/fyne/v2/widget" import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" - "fyne.io/fyne/v2/internal/async" "fyne.io/fyne/v2/internal/cache" internalWidget "fyne.io/fyne/v2/internal/widget" "fyne.io/fyne/v2/theme" @@ -112,16 +111,14 @@ func (w *BaseWidget) Hide() { // Refresh causes this widget to be redrawn in its current state func (w *BaseWidget) Refresh() { - async.EnsureMain(func() { - impl := w.super() - if impl == nil { - return - } + impl := w.super() + if impl == nil { + return + } - w.themeCache = nil + w.themeCache = nil - cache.Renderer(impl).Refresh() - }) + cache.Renderer(impl).Refresh() } // Theme returns a cached Theme instance for this widget (or its extending widget). From 06c6be3cb69a6115c0f523f28550360a5c1f5ee1 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 26 Jan 2025 21:15:42 +0000 Subject: [PATCH 3/3] Update internal/driver/common/canvas.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jacob Alzén --- internal/driver/common/canvas.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/internal/driver/common/canvas.go b/internal/driver/common/canvas.go index 9e05c1b60f..cbf75a6760 100644 --- a/internal/driver/common/canvas.go +++ b/internal/driver/common/canvas.go @@ -314,10 +314,8 @@ func (c *Canvas) Painter() gl.Painter { // Refresh refreshes a canvas object. func (c *Canvas) Refresh(obj fyne.CanvasObject) { - async.EnsureMain(func() { - c.refreshQueue.In(obj) - c.SetDirty() - }) + c.refreshQueue.In(obj) + async.EnsureMain(c.SetDirty) } // RemoveShortcut removes a shortcut from the canvas.