From afb1c6c397d839f52fa02e3c869822098c0f9be6 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sun, 1 Mar 2026 08:24:16 -0800 Subject: [PATCH] defensive nil checks around CanvasForObject --- ui/browsing/browsingpane.go | 2 +- ui/browsing/playlistpage.go | 4 +++- ui/widgets/auxcontrols.go | 4 +++- ui/widgets/focuslist.go | 7 ++++--- ui/widgets/gridview.go | 8 ++++++-- ui/widgets/gridviewitem.go | 10 +++++++--- ui/widgets/playercontrols.go | 4 +++- ui/widgets/searchentry.go | 4 +++- 8 files changed, 30 insertions(+), 13 deletions(-) diff --git a/ui/browsing/browsingpane.go b/ui/browsing/browsingpane.go index f7db871..ac5066f 100644 --- a/ui/browsing/browsingpane.go +++ b/ui/browsing/browsingpane.go @@ -152,7 +152,7 @@ func (b *BrowsingPane) doSetPage(p Page) bool { } // TODO: reset focus only if something inside the previous page had focus if c := fyne.CurrentApp().Driver().CanvasForObject(b); c != nil { - c.Focus(nil) + c.Unfocus() } b.curPage = p if np, ok := p.(CanShowNowPlaying); ok { diff --git a/ui/browsing/playlistpage.go b/ui/browsing/playlistpage.go index 31374e1..abb413f 100644 --- a/ui/browsing/playlistpage.go +++ b/ui/browsing/playlistpage.go @@ -392,7 +392,9 @@ func NewPlaylistPageHeader(page *PlaylistPage) *PlaylistPageHeader { } buttonRow.Objects[3] = searchEntry searchEntry.SetMinWidth(minW) - fyne.CurrentApp().Driver().CanvasForObject(a).Focus(searchEntry) + if c := fyne.CurrentApp().Driver().CanvasForObject(a); c != nil { + c.Focus(searchEntry) + } fyne.NewAnimation(myTheme.AnimationDurationShort, func(f float32) { w := (200-minW)*f + minW searchEntry.SetMinWidth(w) diff --git a/ui/widgets/auxcontrols.go b/ui/widgets/auxcontrols.go index 7968e26..40cf6a8 100644 --- a/ui/widgets/auxcontrols.go +++ b/ui/widgets/auxcontrols.go @@ -124,7 +124,9 @@ func NewVolumeSlider(width float32) *volumeSlider { func (v *volumeSlider) Tapped(e *fyne.PointEvent) { v.Slider.Tapped(e) - fyne.CurrentApp().Driver().CanvasForObject(v).Unfocus() + if c := fyne.CurrentApp().Driver().CanvasForObject(v); c != nil { + c.Unfocus() + } } func (v *volumeSlider) MinSize() fyne.Size { diff --git a/ui/widgets/focuslist.go b/ui/widgets/focuslist.go index f0507f8..badc8f1 100644 --- a/ui/widgets/focuslist.go +++ b/ui/widgets/focuslist.go @@ -67,7 +67,9 @@ func (g *FocusList) FocusNeighbor(curItem widget.ListItemID, up bool) { other := g.ItemForID(focusIdx) g.mutex.Unlock() if other != nil { - fyne.CurrentApp().Driver().CanvasForObject(g).Focus(other.(fyne.Focusable)) + if c := fyne.CurrentApp().Driver().CanvasForObject(g); c != nil { + c.Focus(other.(fyne.Focusable)) + } } } @@ -120,8 +122,7 @@ func (l *FocusListRowBase) SetItemID(id widget.ListItemID) { func (l *FocusListRowBase) EnsureUnfocused() { if l.Focused { - c := fyne.CurrentApp().Driver().CanvasForObject(l) - if c != nil { + if c := fyne.CurrentApp().Driver().CanvasForObject(l); c != nil { c.Unfocus() } } diff --git a/ui/widgets/gridview.go b/ui/widgets/gridview.go index 03142d4..1e509d8 100644 --- a/ui/widgets/gridview.go +++ b/ui/widgets/gridview.go @@ -286,7 +286,9 @@ func (g *GridView) Resize(size fyne.Size) { var _ fyne.Tappable = (*GridView)(nil) func (g *GridView) Tapped(*fyne.PointEvent) { - fyne.CurrentApp().Driver().CanvasForObject(g).Unfocus() + if c := fyne.CurrentApp().Driver().CanvasForObject(g); c != nil { + c.Unfocus() + } } func (g *GridView) createGridWrap() { @@ -343,7 +345,9 @@ func (g *GridView) createNewItemCard() fyne.CanvasObject { g.grid.ScrollTo(focusIndex) g.stateMutex.RLock() if item, ok := g.itemForIndex[focusIndex]; ok { - fyne.CurrentApp().Driver().CanvasForObject(g).Focus(item) + if c := fyne.CurrentApp().Driver().CanvasForObject(g); c != nil { + c.Focus(item) + } } g.stateMutex.RUnlock() } diff --git a/ui/widgets/gridviewitem.go b/ui/widgets/gridviewitem.go index 291b72a..1fc7fe6 100644 --- a/ui/widgets/gridviewitem.go +++ b/ui/widgets/gridviewitem.go @@ -513,8 +513,10 @@ func (g *GridViewItem) Update(model *GridViewItemModel) { g.secondaryText.Refresh() g.Cover.ResetPlayButton() if g.focused { - fyne.CurrentApp().Driver().CanvasForObject(g).Focus(nil) - g.FocusLost() + if c := fyne.CurrentApp().Driver().CanvasForObject(g); c != nil { + c.Unfocus() + g.FocusLost() + } } } @@ -589,7 +591,9 @@ func (g *GridViewItem) TypedRune(rune) { var _ fyne.Tappable = (*GridViewItem)(nil) func (g *GridViewItem) Tapped(*fyne.PointEvent) { - fyne.CurrentApp().Driver().CanvasForObject(g).Unfocus() + if c := fyne.CurrentApp().Driver().CanvasForObject(g); c != nil { + c.Unfocus() + } } func (g *GridViewItem) CreateRenderer() fyne.WidgetRenderer { diff --git a/ui/widgets/playercontrols.go b/ui/widgets/playercontrols.go index c6078be..6a30d81 100644 --- a/ui/widgets/playercontrols.go +++ b/ui/widgets/playercontrols.go @@ -50,7 +50,9 @@ func (t *TrackPosSlider) Tapped(e *fyne.PointEvent) { t.Slider.Tapped(e) // don't keep focus after being tapped - fyne.CurrentApp().Driver().CanvasForObject(t).Focus(nil) + if c := fyne.CurrentApp().Driver().CanvasForObject(t); c != nil { + c.Unfocus() + } } // override to increase the distance moved by keyboard control diff --git a/ui/widgets/searchentry.go b/ui/widgets/searchentry.go index 9908d7f..33e1470 100644 --- a/ui/widgets/searchentry.go +++ b/ui/widgets/searchentry.go @@ -50,7 +50,9 @@ func (sf *SearchEntry) Init() { func (s *SearchEntry) TypedKey(e *fyne.KeyEvent) { if e.Name == fyne.KeyEscape { s.SetText("") - fyne.CurrentApp().Driver().CanvasForObject(s).Unfocus() + if c := fyne.CurrentApp().Driver().CanvasForObject(s); c != nil { + c.Unfocus() + } return } s.Entry.TypedKey(e)