From 8f7fed1fff4768c3fd2bc04ca12903542db3df71 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 11 Feb 2023 16:41:22 +0000 Subject: [PATCH 01/29] Fall back to default font when measuring Fixes #3646 --- internal/painter/font.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/internal/painter/font.go b/internal/painter/font.go index 8afbda226d..5804140ecf 100644 --- a/internal/painter/font.go +++ b/internal/painter/font.go @@ -84,18 +84,33 @@ func CachedFontFace(style fyne.TextStyle, fontDP float32, texScale float32) (fon switch { case style.Monospace: measureFace = loadMeasureFont(theme.TextMonospaceFont()) + if measureFace == nil { + measureFace = loadMeasureFont(theme.DefaultTextMonospaceFont()) + } case style.Bold: if style.Italic { measureFace = loadMeasureFont(theme.TextBoldItalicFont()) + if measureFace == nil { + measureFace = loadMeasureFont(theme.DefaultTextBoldItalicFont()) + } } else { measureFace = loadMeasureFont(theme.TextBoldFont()) + if measureFace == nil { + measureFace = loadMeasureFont(theme.DefaultTextBoldFont()) + } } case style.Italic: measureFace = loadMeasureFont(theme.TextItalicFont()) + if measureFace == nil { + measureFace = loadMeasureFont(theme.DefaultTextItalicFont()) + } case style.Symbol: measureFace = loadMeasureFont(theme.DefaultSymbolFont()) default: measureFace = loadMeasureFont(theme.TextFont()) + if measureFace == nil { + measureFace = loadMeasureFont(theme.DefaultTextFont()) + } } comp.facesMutex.Lock() @@ -148,6 +163,7 @@ func loadMeasureFont(data fyne.Resource) gotext.Face { loaded, err := gotext.ParseTTF(bytes.NewReader(data.Content())) if err != nil { fyne.LogError("font load error", err) + return nil } return loaded From 78e418b980061f2f910588292ef3840738c72394 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Wed, 24 May 2023 15:32:33 +0100 Subject: [PATCH 02/29] Start a v2.3.5 release process --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcbe770323..e7eff5a895 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ This file lists the main changes with each version of the Fyne toolkit. More detailed release notes can be found on the [releases page](https://github.com/fyne-io/fyne/releases). +## 2.3.5 - In Progress + +* panic with unsuported font (#3646) + + ## 2.3.4 - 3 May 2023 ### Fixed From 9a70186dc0207c8820c98b1f98341dfa743b129c Mon Sep 17 00:00:00 2001 From: Roffe <5434736+roffe@users.noreply.github.com> Date: Fri, 5 May 2023 01:27:13 +0200 Subject: [PATCH 03/29] Close manifest after writing it so it can be removed later in code --- cmd/fyne/internal/commands/package-windows.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/fyne/internal/commands/package-windows.go b/cmd/fyne/internal/commands/package-windows.go index 84a5651bad..47983a126e 100644 --- a/cmd/fyne/internal/commands/package-windows.go +++ b/cmd/fyne/internal/commands/package-windows.go @@ -63,6 +63,7 @@ func (p *Packager) packageWindows() error { CombinedVersion: p.combinedVersion(), } err := templates.ManifestWindows.Execute(manifestFile, tplData) + manifestFile.Close() if err != nil { return fmt.Errorf("failed to write manifest template: %w", err) } From 339078d51dcc50f90873b57048c0685358169775 Mon Sep 17 00:00:00 2001 From: Roffe <5434736+roffe@users.noreply.github.com> Date: Fri, 5 May 2023 07:57:59 +0200 Subject: [PATCH 04/29] Update package-windows.go --- cmd/fyne/internal/commands/package-windows.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/fyne/internal/commands/package-windows.go b/cmd/fyne/internal/commands/package-windows.go index 47983a126e..be48db82ee 100644 --- a/cmd/fyne/internal/commands/package-windows.go +++ b/cmd/fyne/internal/commands/package-windows.go @@ -63,10 +63,10 @@ func (p *Packager) packageWindows() error { CombinedVersion: p.combinedVersion(), } err := templates.ManifestWindows.Execute(manifestFile, tplData) - manifestFile.Close() if err != nil { return fmt.Errorf("failed to write manifest template: %w", err) } + manifestFile.Close() } // launch rsrc to generate the object file From fe1189453cd46405881aee95f2d68ecbac009e9f Mon Sep 17 00:00:00 2001 From: Imran Iqbal Date: Mon, 8 May 2023 13:11:11 -0400 Subject: [PATCH 05/29] Guard for nil when closing windows Fixes: https://github.com/fyne-io/fyne/issues/3870 --- internal/driver/glfw/window_desktop.go | 4 +++- internal/driver/glfw/window_test.go | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/internal/driver/glfw/window_desktop.go b/internal/driver/glfw/window_desktop.go index 4be8d1ab27..1d21f8be22 100644 --- a/internal/driver/glfw/window_desktop.go +++ b/internal/driver/glfw/window_desktop.go @@ -317,7 +317,9 @@ func (w *window) refresh(_ *glfw.Window) { } func (w *window) closed(viewport *glfw.Window) { - viewport.SetShouldClose(false) // reset the closed flag until we check the veto in processClosed + if viewport != nil { + viewport.SetShouldClose(false) // reset the closed flag until we check the veto in processClosed + } w.processClosed() } diff --git a/internal/driver/glfw/window_test.go b/internal/driver/glfw/window_test.go index 479f9e6234..dcadaa0835 100644 --- a/internal/driver/glfw/window_test.go +++ b/internal/driver/glfw/window_test.go @@ -1700,6 +1700,12 @@ func TestWindow_CloseInterception(t *testing.T) { assert.True(t, onClosed) // Close is called if the interceptor is not set. } +func TestWindow_ClosedBeforeShow(t *testing.T) { + w := createWindow("Test").(*window) + // viewport will be nil if window is closed before show + assert.NotPanics(t, func() { w.closed(nil) }) +} + func TestWindow_SetContent_Twice(t *testing.T) { w := createWindow("Test").(*window) From a00090cfa16637ce4b24e96a927fcbfb8842a8ef Mon Sep 17 00:00:00 2001 From: Jan Bezdidcek Date: Sun, 7 May 2023 16:23:55 +0200 Subject: [PATCH 06/29] Add desktop systray quit menu item only if it's not already present --- internal/driver/glfw/driver_desktop.go | 29 ++++++++++++++++++++------ internal/driver/glfw/menu.go | 4 ++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/internal/driver/glfw/driver_desktop.go b/internal/driver/glfw/driver_desktop.go index 21923618f8..862dcc0709 100644 --- a/internal/driver/glfw/driver_desktop.go +++ b/internal/driver/glfw/driver_desktop.go @@ -121,12 +121,7 @@ func (d *gLDriver) refreshSystray(m *fyne.Menu) { systray.ResetMenu() d.refreshSystrayMenu(m, nil) - systray.AddSeparator() - quit := systray.AddMenuItem("Quit", "Quit application") - go func() { - <-quit.ClickedCh - d.Quit() - }() + addMissingQuitForMenu(m, d) } func (d *gLDriver) refreshSystrayMenu(m *fyne.Menu, parent *systray.MenuItem) { @@ -165,3 +160,25 @@ func (d *gLDriver) SetSystemTrayIcon(resource fyne.Resource) { func (d *gLDriver) SystemTrayMenu() *fyne.Menu { return d.systrayMenu } + +func addMissingQuitForMenu(menu *fyne.Menu, d *gLDriver) { + var lastItem *fyne.MenuItem + if len(menu.Items) > 0 { + lastItem = menu.Items[len(menu.Items)-1] + if lastItem.Label == "Quit" { + lastItem.IsQuit = true + } + } + if lastItem == nil || !lastItem.IsQuit { // make sure the menu always has a quit option + quitItem := fyne.NewMenuItem("Quit", nil) + quitItem.IsQuit = true + menu.Items = append(menu.Items, fyne.NewMenuItemSeparator(), quitItem) + } + for _, item := range menu.Items { + if item.IsQuit && item.Action == nil { + item.Action = func() { + d.Quit() + } + } + } +} diff --git a/internal/driver/glfw/menu.go b/internal/driver/glfw/menu.go index dd0a93a789..f469451750 100644 --- a/internal/driver/glfw/menu.go +++ b/internal/driver/glfw/menu.go @@ -10,11 +10,11 @@ func buildMenuOverlay(menus *fyne.MainMenu, w *window) fyne.CanvasObject { return nil } - menus = addMissingQuit(menus, w) + menus = addMissingQuitForMainMenu(menus, w) return NewMenuBar(menus, w.canvas) } -func addMissingQuit(menus *fyne.MainMenu, w *window) *fyne.MainMenu { +func addMissingQuitForMainMenu(menus *fyne.MainMenu, w *window) *fyne.MainMenu { var lastItem *fyne.MenuItem if len(menus.Items[0].Items) > 0 { lastItem = menus.Items[0].Items[len(menus.Items[0].Items)-1] From f9c9e8244dc6d1aa08a3eb02ca4f269afe3eb68e Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Wed, 17 May 2023 08:21:28 +0100 Subject: [PATCH 07/29] Fix missing scaling option for images on arm linux devices Fixes #3891 --- internal/painter/gl/gl_es.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/painter/gl/gl_es.go b/internal/painter/gl/gl_es.go index 98d62f436e..9ba564eb49 100644 --- a/internal/painter/gl/gl_es.go +++ b/internal/painter/gl/gl_es.go @@ -67,7 +67,7 @@ type ( Uniform int32 ) -var textureFilterToGL = []int32{gl.LINEAR, gl.NEAREST} +var textureFilterToGL = []int32{gl.LINEAR, gl.NEAREST, gl.LINEAR} func (p *painter) Init() { p.ctx = &esContext{} From 44be8d573f98f1fefd6463d48a3164cccffef732 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Wed, 24 May 2023 15:51:47 +0100 Subject: [PATCH 08/29] All landed fixes appropriate for bugfix --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7eff5a895..6c786826d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,10 @@ More detailed release notes can be found on the [releases page](https://github.c ## 2.3.5 - In Progress -* panic with unsuported font (#3646) +* panic with unsupported font (#3646) +* Fix removing temporary manifest when building on Windows +* Panic when using autogenerated quit in menu if some windows have not been shown (#3870) +* Fastest scale mode is not working on Linux arm64 device (#3891) ## 2.3.4 - 3 May 2023 From b9e69456ff6874b91991e57bcf56145861303a70 Mon Sep 17 00:00:00 2001 From: Jacalz Date: Wed, 24 May 2023 20:55:17 +0200 Subject: [PATCH 09/29] Some better wording for the changelog --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c786826d4..6d6f8076be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,10 @@ More detailed release notes can be found on the [releases page](https://github.c ## 2.3.5 - In Progress -* panic with unsupported font (#3646) +* Fix panic with unsupported font (#3646) * Fix removing temporary manifest when building on Windows -* Panic when using autogenerated quit in menu if some windows have not been shown (#3870) -* Fastest scale mode is not working on Linux arm64 device (#3891) +* Fix panic when using autogenerated quit menu when having unshown windows (#3870) +* Fix `canvas.ImageScaleFastest` not working on arm64 (#3891) ## 2.3.4 - 3 May 2023 From b5462cb6642258fee5520b6c58fc8c5cc2238357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20Alz=C3=A9n?= Date: Thu, 25 May 2023 00:23:27 +0200 Subject: [PATCH 10/29] Update CHANGELOG.md with updated wording --- CHANGELOG.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d6f8076be..e126cb3b21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,12 @@ More detailed release notes can be found on the [releases page](https://github.c ## 2.3.5 - In Progress -* Fix panic with unsupported font (#3646) -* Fix removing temporary manifest when building on Windows -* Fix panic when using autogenerated quit menu when having unshown windows (#3870) -* Fix `canvas.ImageScaleFastest` not working on arm64 (#3891) +### Fixed + +* Panic with unsupported font (#3646) +* Temporary manifest file not closed after building on Windows +* Panic when using autogenerated quit menu when having unshown windows (#3870) +* Using `canvas.ImageScaleFastest` not working on arm64 (#3891) ## 2.3.4 - 3 May 2023 From b4f9dfedbeaaf8f73667847bc4f8f80d266cba71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20Alz=C3=A9n?= Date: Thu, 25 May 2023 00:24:57 +0200 Subject: [PATCH 11/29] Update CHANGELOG.md with fix for incorrect word --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e126cb3b21..7b15e1c7cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ More detailed release notes can be found on the [releases page](https://github.c * Panic with unsupported font (#3646) * Temporary manifest file not closed after building on Windows -* Panic when using autogenerated quit menu when having unshown windows (#3870) +* Panic when using autogenerated quit menu and having unshown windows (#3870) * Using `canvas.ImageScaleFastest` not working on arm64 (#3891) From d4e02f7e0c9865ef08e698ed97bebdce5ac7d626 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Wed, 24 May 2023 23:04:05 +0100 Subject: [PATCH 12/29] Make the password accessory look and behave disabled when the entry is disabled (#3914) --- widget/entry_password.go | 8 ++++++++ widget/entry_test.go | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/widget/entry_password.go b/widget/entry_password.go index d88eb7a53a..501925667c 100644 --- a/widget/entry_password.go +++ b/widget/entry_password.go @@ -40,6 +40,10 @@ func (r *passwordRevealer) Cursor() desktop.Cursor { } func (r *passwordRevealer) Tapped(*fyne.PointEvent) { + if r.entry.Disabled() { + return + } + r.entry.setFieldsAndRefresh(func() { r.entry.Password = !r.entry.Password }) @@ -71,5 +75,9 @@ func (r *passwordRevealerRenderer) Refresh() { } else { r.icon.Resource = theme.VisibilityOffIcon() } + + if r.entry.disabled { + r.icon.Resource = theme.NewDisabledResource(r.icon.Resource) + } canvas.Refresh(r.icon) } diff --git a/widget/entry_test.go b/widget/entry_test.go index 8ea6955023..f68aaa7094 100644 --- a/widget/entry_test.go +++ b/widget/entry_test.go @@ -1694,6 +1694,19 @@ func TestPasswordEntry_ActionItemSizeAndPlacement(t *testing.T) { assert.Equal(t, fyne.NewPos(e.MinSize().Width-2*theme.Padding()-b.Size().Width, 2*theme.Padding()), b.Position()) } +func TestPasswordEntry_Disabled(t *testing.T) { + entry, window := setupPasswordTest(t) + defer teardownImageTest(window) + entry.Disable() + + test.Tap(entry.ActionItem.(fyne.Tappable)) + assert.True(t, entry.Password) + + entry.Enable() + test.Tap(entry.ActionItem.(fyne.Tappable)) + assert.False(t, entry.Password) +} + func TestPasswordEntry_NewlineIgnored(t *testing.T) { entry := widget.NewPasswordEntry() entry.SetText("test") From 185967c4713b50d47d3773c39993784053340a8b Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Wed, 24 May 2023 23:06:47 +0100 Subject: [PATCH 13/29] Fix disabled radio not looking disabled (#3913) --- widget/radio_group_internal_test.go | 2 +- widget/radio_item.go | 6 +++++- .../radio_group/layout_multiple_selected_disabled.xml | 2 +- .../layout_multiple_selected_horizontal_disabled.xml | 2 +- .../radio_group/layout_single_selected_disabled.xml | 2 +- .../layout_single_selected_horizontal_disabled.xml | 2 +- 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/widget/radio_group_internal_test.go b/widget/radio_group_internal_test.go index eb8770fd4a..ac5bffee72 100644 --- a/widget/radio_group_internal_test.go +++ b/widget/radio_group_internal_test.go @@ -70,7 +70,7 @@ func TestRadioGroup_DisableWhenSelected(t *testing.T) { assert.Equal(t, "primary_"+icon.Name(), render.icon.Resource.Name()) radio.Disable() - assert.Equal(t, fmt.Sprintf("background_%v", icon.Name()), render.icon.Resource.Name()) + assert.Equal(t, fmt.Sprintf("disabled_%v", icon.Name()), render.icon.Resource.Name()) } func TestRadioGroup_DisableWhenNotSelected(t *testing.T) { diff --git a/widget/radio_item.go b/widget/radio_item.go index 611ea18b6f..915c9cdfc9 100644 --- a/widget/radio_item.go +++ b/widget/radio_item.go @@ -205,7 +205,11 @@ func (r *radioItemRenderer) update() { out.ColorName = theme.ColorNameForeground } if r.item.Disabled() { - in.ColorName = theme.ColorNameBackground + if r.item.Selected { + in.ColorName = theme.ColorNameDisabled + } else { + in.ColorName = theme.ColorNameBackground + } out.ColorName = theme.ColorNameDisabled } r.icon.Resource = in diff --git a/widget/testdata/radio_group/layout_multiple_selected_disabled.xml b/widget/testdata/radio_group/layout_multiple_selected_disabled.xml index 14c7f43950..cc0905f405 100644 --- a/widget/testdata/radio_group/layout_multiple_selected_disabled.xml +++ b/widget/testdata/radio_group/layout_multiple_selected_disabled.xml @@ -4,7 +4,7 @@ - + Foo diff --git a/widget/testdata/radio_group/layout_multiple_selected_horizontal_disabled.xml b/widget/testdata/radio_group/layout_multiple_selected_horizontal_disabled.xml index 379351e431..28a6728356 100644 --- a/widget/testdata/radio_group/layout_multiple_selected_horizontal_disabled.xml +++ b/widget/testdata/radio_group/layout_multiple_selected_horizontal_disabled.xml @@ -4,7 +4,7 @@ - + Foo diff --git a/widget/testdata/radio_group/layout_single_selected_disabled.xml b/widget/testdata/radio_group/layout_single_selected_disabled.xml index 48de7eddbe..a17de0ab5b 100644 --- a/widget/testdata/radio_group/layout_single_selected_disabled.xml +++ b/widget/testdata/radio_group/layout_single_selected_disabled.xml @@ -4,7 +4,7 @@ - + Test diff --git a/widget/testdata/radio_group/layout_single_selected_horizontal_disabled.xml b/widget/testdata/radio_group/layout_single_selected_horizontal_disabled.xml index 48de7eddbe..a17de0ab5b 100644 --- a/widget/testdata/radio_group/layout_single_selected_horizontal_disabled.xml +++ b/widget/testdata/radio_group/layout_single_selected_horizontal_disabled.xml @@ -4,7 +4,7 @@ - + Test From a608613afd5bbe341ca3b272621933f5dbf12ad4 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Thu, 25 May 2023 08:47:49 +0100 Subject: [PATCH 14/29] More fixes merged :) --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b15e1c7cb..ff776b3028 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ More detailed release notes can be found on the [releases page](https://github.c * Temporary manifest file not closed after building on Windows * Panic when using autogenerated quit menu and having unshown windows (#3870) * Using `canvas.ImageScaleFastest` not working on arm64 (#3891) +* Disabled password Entry should also disable the ActionItem (#3908) +* Disabled RadioGroup does not display status (#3882) ## 2.3.4 - 3 May 2023 From e5198dec0e95da652131215c38e0dd29ac8f3294 Mon Sep 17 00:00:00 2001 From: Charalampos Mitsakis Date: Fri, 26 May 2023 22:16:21 +0000 Subject: [PATCH 15/29] fix: Table offset should not be negative (#3049) fixes #2857 --- widget/table.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/widget/table.go b/widget/table.go index dde9efc512..3453062e60 100644 --- a/widget/table.go +++ b/widget/table.go @@ -222,6 +222,9 @@ func (t *Table) ScrollToBottom() { rows, _ := t.Length() cellY, cellHeight := t.findY(rows - 1) y := cellY + cellHeight - t.scroll.Size().Height + if y <= 0 { + return + } t.scroll.Offset.Y = y t.offset.Y = y @@ -265,6 +268,9 @@ func (t *Table) ScrollToTrailing() { _, cols := t.Length() cellX, cellWidth := t.findX(cols - 1) scrollX := cellX + cellWidth - t.scroll.Size().Width + if scrollX <= 0 { + return + } t.scroll.Offset.X = scrollX t.offset.X = scrollX From 25aede088a54dca3f081439238ba13ad4278d7e8 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 26 May 2023 23:18:37 +0100 Subject: [PATCH 16/29] Make sure we have sufficient space for the bar as well if content is tiny (#3898) Fixes #3885 --- container/tabs.go | 22 +++++++++++++++++-- .../apptabs/desktop/tab_location_bottom.xml | 14 ++++++------ .../apptabs/desktop/tab_location_leading.xml | 14 ++++++------ .../apptabs/desktop/tab_location_top.xml | 14 ++++++------ .../apptabs/desktop/tab_location_trailing.xml | 14 ++++++------ .../apptabs/mobile/tab_location_bottom.xml | 20 ++++++++--------- .../apptabs/mobile/tab_location_top.xml | 20 ++++++++--------- .../doctabs/desktop/tab_location_bottom.xml | 20 ++++++++--------- .../doctabs/desktop/tab_location_leading.xml | 20 ++++++++--------- .../doctabs/desktop/tab_location_top.xml | 20 ++++++++--------- .../doctabs/desktop/tab_location_trailing.xml | 20 ++++++++--------- .../doctabs/mobile/tab_location_bottom.xml | 20 ++++++++--------- .../doctabs/mobile/tab_location_top.xml | 20 ++++++++--------- 13 files changed, 128 insertions(+), 110 deletions(-) diff --git a/container/tabs.go b/container/tabs.go index 49377edcac..0ec2610dab 100644 --- a/container/tabs.go +++ b/container/tabs.go @@ -365,7 +365,23 @@ func (r *baseTabsRenderer) layout(t baseTabs, size fyne.Size) { } func (r *baseTabsRenderer) minSize(t baseTabs) fyne.Size { + pad := theme.Padding() + buttonPad := pad barMin := r.bar.MinSize() + tabsMin := r.bar.Objects[0].MinSize() + accessory := r.bar.Objects[1] + accessoryMin := accessory.MinSize() + if scroll, ok := r.bar.Objects[0].(*Scroll); ok && len(scroll.Content.(*fyne.Container).Objects) == 0 { + tabsMin = fyne.Size{} // scroller forces 32 where we don't need any space + buttonPad = 0 + } else if group, ok := r.bar.Objects[0].(*fyne.Container); ok && len(group.Objects) > 0 { + tabsMin = group.Objects[0].MinSize() + buttonPad = 0 + } + if !accessory.Visible() || accessoryMin.Width == 0 { + buttonPad = 0 + accessoryMin = fyne.Size{} + } contentMin := fyne.NewSize(0, 0) for _, content := range t.items() { @@ -374,9 +390,11 @@ func (r *baseTabsRenderer) minSize(t baseTabs) fyne.Size { switch t.tabLocation() { case TabLocationLeading, TabLocationTrailing: - return fyne.NewSize(barMin.Width+contentMin.Width+theme.Padding(), contentMin.Height) + return fyne.NewSize(barMin.Width+contentMin.Width+pad, + fyne.Max(contentMin.Height, accessoryMin.Height+buttonPad+tabsMin.Height)) default: - return fyne.NewSize(contentMin.Width, barMin.Height+contentMin.Height+theme.Padding()) + return fyne.NewSize(fyne.Max(contentMin.Width, accessoryMin.Width+buttonPad+tabsMin.Width), + barMin.Height+contentMin.Height+pad) } } diff --git a/container/testdata/apptabs/desktop/tab_location_bottom.xml b/container/testdata/apptabs/desktop/tab_location_bottom.xml index 04fd3a3cef..0489a64917 100644 --- a/container/testdata/apptabs/desktop/tab_location_bottom.xml +++ b/container/testdata/apptabs/desktop/tab_location_bottom.xml @@ -1,21 +1,21 @@ - + - - - + + + Test1 - + - + - + Text 1 diff --git a/container/testdata/apptabs/desktop/tab_location_leading.xml b/container/testdata/apptabs/desktop/tab_location_leading.xml index 1a2de7fb8a..e8a2736535 100644 --- a/container/testdata/apptabs/desktop/tab_location_leading.xml +++ b/container/testdata/apptabs/desktop/tab_location_leading.xml @@ -1,21 +1,21 @@ - + - - - + + + Test1 - + - + - + Text 1 diff --git a/container/testdata/apptabs/desktop/tab_location_top.xml b/container/testdata/apptabs/desktop/tab_location_top.xml index ec5ca20290..c116129dd4 100644 --- a/container/testdata/apptabs/desktop/tab_location_top.xml +++ b/container/testdata/apptabs/desktop/tab_location_top.xml @@ -1,21 +1,21 @@ - + - - - + + + Test1 - + - + - + Text 1 diff --git a/container/testdata/apptabs/desktop/tab_location_trailing.xml b/container/testdata/apptabs/desktop/tab_location_trailing.xml index 273f7238d9..6dd3bd61fd 100644 --- a/container/testdata/apptabs/desktop/tab_location_trailing.xml +++ b/container/testdata/apptabs/desktop/tab_location_trailing.xml @@ -1,21 +1,21 @@ - + - - - + + + Test1 - + - + - + Text 1 diff --git a/container/testdata/apptabs/mobile/tab_location_bottom.xml b/container/testdata/apptabs/mobile/tab_location_bottom.xml index 887daffd9b..6108a8d05c 100644 --- a/container/testdata/apptabs/mobile/tab_location_bottom.xml +++ b/container/testdata/apptabs/mobile/tab_location_bottom.xml @@ -1,21 +1,21 @@ - + - - - - - Test1 + + + + + Test1 - + - - - + + + Text 1 diff --git a/container/testdata/apptabs/mobile/tab_location_top.xml b/container/testdata/apptabs/mobile/tab_location_top.xml index 899a28e368..98e9ce422c 100644 --- a/container/testdata/apptabs/mobile/tab_location_top.xml +++ b/container/testdata/apptabs/mobile/tab_location_top.xml @@ -1,21 +1,21 @@ - + - - - - - Test1 + + + + + Test1 - + - - - + + + Text 1 diff --git a/container/testdata/doctabs/desktop/tab_location_bottom.xml b/container/testdata/doctabs/desktop/tab_location_bottom.xml index 0e84dc90de..06035bd8d1 100644 --- a/container/testdata/doctabs/desktop/tab_location_bottom.xml +++ b/container/testdata/doctabs/desktop/tab_location_bottom.xml @@ -1,8 +1,8 @@ - + - - - + + + Test1 @@ -14,16 +14,16 @@ Test3 - + - + - + @@ -31,9 +31,9 @@ - - - + + + Text 1 diff --git a/container/testdata/doctabs/desktop/tab_location_leading.xml b/container/testdata/doctabs/desktop/tab_location_leading.xml index 04d966d20b..785d7f0ad6 100644 --- a/container/testdata/doctabs/desktop/tab_location_leading.xml +++ b/container/testdata/doctabs/desktop/tab_location_leading.xml @@ -1,8 +1,8 @@ - + - - - + + + Test1 @@ -14,16 +14,16 @@ Test3 - + - + - + @@ -31,9 +31,9 @@ - - - + + + Text 1 diff --git a/container/testdata/doctabs/desktop/tab_location_top.xml b/container/testdata/doctabs/desktop/tab_location_top.xml index 0d4ef77450..ca0cb17a95 100644 --- a/container/testdata/doctabs/desktop/tab_location_top.xml +++ b/container/testdata/doctabs/desktop/tab_location_top.xml @@ -1,8 +1,8 @@ - + - - - + + + Test1 @@ -14,16 +14,16 @@ Test3 - + - + - + @@ -31,9 +31,9 @@ - - - + + + Text 1 diff --git a/container/testdata/doctabs/desktop/tab_location_trailing.xml b/container/testdata/doctabs/desktop/tab_location_trailing.xml index 6dffc9a823..4a60f55f4e 100644 --- a/container/testdata/doctabs/desktop/tab_location_trailing.xml +++ b/container/testdata/doctabs/desktop/tab_location_trailing.xml @@ -1,8 +1,8 @@ - + - - - + + + Test1 @@ -14,16 +14,16 @@ Test3 - + - + - + @@ -31,9 +31,9 @@ - - - + + + Text 1 diff --git a/container/testdata/doctabs/mobile/tab_location_bottom.xml b/container/testdata/doctabs/mobile/tab_location_bottom.xml index a6edccacfa..7d62591676 100644 --- a/container/testdata/doctabs/mobile/tab_location_bottom.xml +++ b/container/testdata/doctabs/mobile/tab_location_bottom.xml @@ -1,8 +1,8 @@ - + - - - + + + Test1 @@ -23,16 +23,16 @@ - + - + - + @@ -40,9 +40,9 @@ - - - + + + Text 1 diff --git a/container/testdata/doctabs/mobile/tab_location_top.xml b/container/testdata/doctabs/mobile/tab_location_top.xml index 9fb6b80179..51608743ed 100644 --- a/container/testdata/doctabs/mobile/tab_location_top.xml +++ b/container/testdata/doctabs/mobile/tab_location_top.xml @@ -1,8 +1,8 @@ - + - - - + + + Test1 @@ -23,16 +23,16 @@ - + - + - + @@ -40,9 +40,9 @@ - - - + + + Text 1 From ccc2f93d1b3f48116c946d39561d97aad1d8604d Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 26 May 2023 23:21:01 +0100 Subject: [PATCH 17/29] More fixes --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff776b3028..12717bfd56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ More detailed release notes can be found on the [releases page](https://github.c * Using `canvas.ImageScaleFastest` not working on arm64 (#3891) * Disabled password Entry should also disable the ActionItem (#3908) * Disabled RadioGroup does not display status (#3882) +* Negative TableCellID Row (#2857) +* Make sure we have sufficient space for the bar as well if content is tiny (#3898) ## 2.3.4 - 3 May 2023 From 67d5cbad8f1505906f7908c39aa8026e0732d574 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 26 May 2023 14:38:39 -0700 Subject: [PATCH 18/29] Fix image.Image leak --- internal/painter/image.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/internal/painter/image.go b/internal/painter/image.go index 4e82fe07ed..4ab588558f 100644 --- a/internal/painter/image.go +++ b/internal/painter/image.go @@ -29,6 +29,11 @@ func GetAspect(img *canvas.Image) float32 { aspect = aspects[img.Resource.Name()] } else if img.File != "" { aspect = aspects[img.File] + } else if img.Image != nil { + // HOTFIX until Fyne 2.4 proper fix: + // we are not storing the aspect ratio in the map for the image.Image case + size := img.Image.Bounds().Size() + return float32(size.X) / float32(size.Y) } if aspect == 0 { @@ -132,7 +137,9 @@ func paintImage(img *canvas.Image, width, height int, wantOrigSize bool, wantOri case img.Image != nil: origSize := img.Image.Bounds().Size() origW, origH = origSize.X, origSize.Y - if checkSize(origSize.X, origSize.Y) { + // HOTFIX until Fyne 2.4: don't store aspect ratio in map, as checkSize(x, y) does. + // Doing so leaks a reference to the image.Image data + if !wantOrigSize || (wantOrigW == origW && wantOrigH == origH) { dst = scaleImage(img.Image, width, height, img.ScaleMode) } default: From 6180f3c7f9cdb8050b41eacd1330771edb39306a Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Mon, 29 May 2023 22:06:33 +0100 Subject: [PATCH 19/29] Copy minimise crash fix to software driver Fixes #3877 --- internal/driver/mobile/driver.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/driver/mobile/driver.go b/internal/driver/mobile/driver.go index 9602d683f0..0d48c41461 100644 --- a/internal/driver/mobile/driver.go +++ b/internal/driver/mobile/driver.go @@ -288,6 +288,10 @@ func (d *mobileDriver) paintWindow(window fyne.Window, size fyne.Size) { inner := clips.Push(pos, obj.Size()) c.Painter().StartClipping(inner.Rect()) } + + if size.Width <= 0 || size.Height <= 0 { // iconifying on Windows can do bad things + return + } c.Painter().Paint(obj, pos, size) } afterDraw := func(node *common.RenderCacheNode) { From d7d68de2413b6e0bc51ef025b01e0554f00c6543 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sun, 28 May 2023 21:44:36 +0100 Subject: [PATCH 20/29] Wrap rich text on non-inline rather than on context change Fixes #2911 --- widget/richtext.go | 15 ++++++++++----- widget/richtext_objects.go | 14 ++++---------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/widget/richtext.go b/widget/richtext.go index ad0b0709e2..4025763a73 100644 --- a/widget/richtext.go +++ b/widget/richtext.go @@ -352,14 +352,16 @@ func (t *RichText) updateRowBounds() { maxWidth := t.size.Width - 2*innerPadding + 2*t.inset.Width wrapWidth := maxWidth + var currentBound *rowBoundary var iterateSegments func(segList []RichTextSegment) iterateSegments = func(segList []RichTextSegment) { - var currentBound *rowBoundary for _, seg := range segList { if parent, ok := seg.(RichTextBlock); ok { - iterateSegments(parent.Segments()) - if !seg.Inline() { + segs := parent.Segments() + iterateSegments(segs) + if len(segs) > 0 && !segs[len(segs)-1].Inline() { wrapWidth = maxWidth + currentBound = nil } continue } @@ -464,7 +466,8 @@ func (r *textRenderer) Layout(size fyne.Size) { innerPadding := theme.InnerPadding() lineSpacing := theme.LineSpacing() - left := innerPadding - r.obj.inset.Width + xInset := innerPadding - r.obj.inset.Width + left := xInset yPos := innerPadding - r.obj.inset.Height lineWidth := size.Width - left*2 var rowItems []fyne.CanvasObject @@ -483,12 +486,14 @@ func (r *textRenderer) Layout(size fyne.Size) { if len(rowItems) != 0 { width, _ := r.layoutRow(rowItems, rowAlign, left, yPos, lineWidth) left += width + rowItems = nil } height := obj.MinSize().Height obj.Move(fyne.NewPos(left, yPos)) obj.Resize(fyne.NewSize(lineWidth, height)) - yPos += height + lineSpacing + yPos += height + left = xInset continue } rowItems = append(rowItems, obj) diff --git a/widget/richtext_objects.go b/widget/richtext_objects.go index 7ed107d849..b285c24836 100644 --- a/widget/richtext_objects.go +++ b/widget/richtext_objects.go @@ -226,16 +226,10 @@ func (l *ListSegment) Segments() []RichTextSegment { txt = strconv.Itoa(i+1) + "." } bullet := &TextSegment{Text: txt + " ", Style: RichTextStyleStrong} - if para, ok := in.(*ParagraphSegment); ok { - seg := &ParagraphSegment{Texts: []RichTextSegment{bullet}} - seg.Texts = append(seg.Texts, para.Texts...) - out[i] = seg - } else { - out[i] = &ParagraphSegment{Texts: []RichTextSegment{ - bullet, - in, - }} - } + out[i] = &ParagraphSegment{Texts: []RichTextSegment{ + bullet, + in, + }} } return out } From 7070dade3f2647e79981d7a91266ce2bafff41af Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Wed, 31 May 2023 21:43:43 +0100 Subject: [PATCH 21/29] Prep for rc-1 --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12717bfd56..bae26719e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ This file lists the main changes with each version of the Fyne toolkit. More detailed release notes can be found on the [releases page](https://github.com/fyne-io/fyne/releases). -## 2.3.5 - In Progress +## 2.3.5 - 5 June 2023 ### Fixed @@ -15,6 +15,10 @@ More detailed release notes can be found on the [releases page](https://github.c * Disabled RadioGroup does not display status (#3882) * Negative TableCellID Row (#2857) * Make sure we have sufficient space for the bar as well if content is tiny (#3898) +* Leak in image painter when replacing image.Image source regularly +* Links in Markdown/Rich Text lists breaks formatting (#2911) +* Crash when reducing window to taskbar with popup opened (#3877) +* RichText vertical scroll will truncate long content with horizontal lines (#3929) ## 2.3.4 - 3 May 2023 From 10c72e1f072efa89812dfb2fe1bc740019265d9d Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 2 Jun 2023 20:18:05 +0100 Subject: [PATCH 22/29] Improving the focused coloured buttons Fixes #3462 --- widget/button.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/widget/button.go b/widget/button.go index 04b7ff1664..5f7e5204fa 100644 --- a/widget/button.go +++ b/widget/button.go @@ -231,7 +231,16 @@ func (b *Button) buttonColor() color.Color { } return theme.DisabledButtonColor() case b.focused: - return blendColor(theme.ButtonColor(), theme.FocusColor()) + bg := theme.ButtonColor() + if b.Importance == HighImportance { + bg = theme.PrimaryColor() + } else if b.Importance == DangerImportance { + bg = theme.ErrorColor() + } else if b.Importance == WarningImportance { + bg = theme.WarningColor() + } + + return blendColor(bg, theme.FocusColor()) case b.hovered: bg := theme.ButtonColor() if b.Importance == HighImportance { @@ -356,7 +365,11 @@ func (r *buttonRenderer) applyTheme() { case r.button.disabled: r.label.Segments[0].(*TextSegment).Style.ColorName = theme.ColorNameDisabled case r.button.Importance == HighImportance || r.button.Importance == DangerImportance || r.button.Importance == WarningImportance: - r.label.Segments[0].(*TextSegment).Style.ColorName = theme.ColorNameBackground + if r.button.focused { + r.label.Segments[0].(*TextSegment).Style.ColorName = theme.ColorNameForeground + } else { + r.label.Segments[0].(*TextSegment).Style.ColorName = theme.ColorNameBackground + } } r.label.Refresh() if r.icon != nil && r.icon.Resource != nil { From f2a05ec1e1cbb4e99454e931271cbdcc51626d6e Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 2 Jun 2023 20:18:48 +0100 Subject: [PATCH 23/29] Make light theme separator visible in menu Fixes #3814 --- theme/theme.go | 2 +- widget/testdata/table/col_size.png | Bin 2462 -> 2468 bytes widget/testdata/table/filled.png | Bin 695 -> 693 bytes widget/testdata/table/row_size.png | Bin 3177 -> 3192 bytes widget/testdata/tree/refresh_initial.png | Bin 2336 -> 2330 bytes widget/testdata/tree/refresh_replaced.png | Bin 2766 -> 2764 bytes 6 files changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/theme.go b/theme/theme.go index cabffeda32..c94f67d153 100644 --- a/theme/theme.go +++ b/theme/theme.go @@ -760,7 +760,7 @@ func lightPaletColorNamed(name fyne.ThemeColorName) color.Color { case ColorNameScrollBar: return color.NRGBA{A: 0x99} case ColorNameSeparator: - return color.NRGBA{R: 0xf5, G: 0xf5, B: 0xf5, A: 0xff} + return color.NRGBA{R: 0xe3, G: 0xe3, B: 0xe3, A: 0xff} case ColorNameShadow: return color.NRGBA{A: 0x33} case ColorNameSuccess: diff --git a/widget/testdata/table/col_size.png b/widget/testdata/table/col_size.png index 840df6c948afdebadb34ff4c50aba6243a710981..09ec90ebbf49d8d0dad16af3a147f8435f55060e 100644 GIT binary patch literal 2468 zcmZ{m4K&m1AHa!N?y$Kok=jb$jf{$7nD=N3CBi~jv#`{zm(>~@qDx(g2siU`HLj*K zCFXi9VtFePHZKWH+!^L2|KGj;d(ZiwbNm0!d4A9Np7Z;i@AEyM&-Zzr8z(SM@^b2O z5)u;fF3$EIz)bsdfVKheQElY~35gxyF7~!wG50^``@4Pbuiox1OTrDQ>iYh=Pbtd( z9zR@`~-tc?1VLP$Ry^!?G&yve#v*Sgy zj(@(E_}^du4tiU01j1*5K;Ei5QC2bHLoGBeAoEpm-wYa-feoFQyLDoxy1Iw1@`HBP z8ABL~46-tAK42X10(8~#+TMDkit@Pr#Ij&GHa6B6+n}MLai??2!NEaKPcKldy~>ev zB;UOdbx{2$!%m~KPYLVG0v3w}+FLL!FJnicaGLqf?(SpHqIJ-}ayVN(3@3$TyUNq5 z%E~;DvV+=BZ3P8;*u(kx`ISAm{YpE~z)CCX>W1+(+B!O_Dk}O}$EsLEgs0uz-HVHh zPo6xP>dgL5;OXi4k2&yO-LuOhvVbokVs@dUi3JOJ3BW=TrY9W_VxAk z@bEyInwFK7LD7mZR7GXw@#Dw4Iy&%?k&zJ*ZB|{O(c$6YadFQ*$_Y5!r`g%2KJVCA z@#N%r3`U{*C=xlI#V#spI***1oFt3?n3^46*5-!{b#xrddHrX$N>Vtm{_U%Dr}?Po35bPbCHNH4x-x;uaF(keWfRQ zWp}D!mj?-lHXbt=Qf#J|er{=AUYTxPz;W?kTIJ2+t^3zNK zU}3D2qvKNC=F^MAmPaS2rxn5AC6Q<^4Rv*`_#NQ($F4kCS=le6^=Sq(&4*POJZ6&I+|Jz0EGotBbIP*BmJYSNy2r85p`D&kE~ zG&;fC)y>U~H|OK!)$exOMA<7hFSnd(n;)sW%0Ym>yPam40nuq& z6U}LwrN4A2aB4JjfWT#JukVzW41!3f*nTVEPuJ;@4Xj_-@B2umPRFKCXeh`wFaz1c z;>gwIB~8b{{Bj;i^x~QFu3c%7M&f1Kg;e;4R~u)HrnB_XI!ULyNmBo>Q{h|tJaAq( zt4fi1(vqmCa}mJKXAB#|bozyf#Z!Znn=IlVHIz|pZ$tS`^F~>t=g5E+wTQ!;0>;$E zS=glp403BD{+?*_(XSv=Nz}r*w>N36u1_~aAhd3H^V_rD-6E^CY?9(?OqJC zIerbA7&5ewE<-t`Hku;@{T}zax&rR_%iCabnbtpgCd+EHTjY1!7%)mpwO=q;!-A&D zVB?1mA2#Ks**w}=Kq5o?`UwHY5ww~XCb9*=3ncUGK<1vWw`(O$m)yacw2Y9p?~@~M n)A{=@^IvOIwzf-1Y;6VVfqS@xUG>22OTxtgWB(iaT*7|2rV{v2RF-uzinYzY9^?QUv-v)cGLQQXs(7eq#`I03SJ*7=5w-RL&8* zWO1>oe%s;%iEknU!|*7e+b1l|W!8E8@{;=jYsK$|F_1iyJVUPWp+ zW0Y+?K3JTd>(cvyA^Mh`U@fsWRXe|6gYq&q*pDSWrYA&a16p?T0X<$GjSSYm zz+ym%(r@yI?&|Mp`6MeNvjyD$iah1Fe1)!)!rWj`Q(K%=kq`$*N0O1NJAm)6cP}tMNkZ_dK9A5J-|c7E%R(#Nk8Dkd$vLNer>Cb8celf?UX@26+N!J7&zw1h>|NX-YB8jv`Ns^#YC}x=|yEo-| z$QKqCw64E}3diA<(I0#oYHKx%2b7MX`f>9Cp=dPP!6DnBB7!w(iou+iZ^wQ?SzBBC z`T2!}a3&`eV3XTh+@YbNB=Hm7ot>T-493T&`ZuRgeL7F_SmgOgSBFB&2A_%Q9DYXm~harXThU867VzB^Am; zTH|bO{d?-->-&3^m6ffntY%U{$R@w3?zV95aHX>u_|kDaPwJf%6%~0-E-EVWY$+=% ztFEqYZVnzQw-wkcs}L(DCiedQ`;(_m;WIN6gZ1?EcEgTZJdRIJF5wSZTW}6Blm~az zxKW{TT{PP1gAa6bZ;m%$Vj=fXm#nPzllP^mys35XAqVgzFfb5eACt8CW8RVEvcrpn zni`FkPZr?d)o*yKXJYsQHy`cs9)j8hMN!x!n@Qt^%NBPnHm$z?WH|_?prKLI-kuL( zaaQMK^aA4B^D;8t_4m`WZhLwvX=!B~M}qC!!p5B*2mSkk)H1E_g<%9le6#2>aRSr$?o$AaU#oRnU~rT(a$gM zGqJ*-Kc%aCJi=Qut5sEcx-aMGc9$rs*Fy`VaOB7Z3kz`xiO@ZzM=J_&VK=xl1I2}f zu$L}@ckWa;HmW{c*=1BpfQu*Hi@yl>Afaj0l0E{>U&k(C{uy`7_tVM(VE2qO~{6XWA%;Ekm(F&1UTTXQ2-a!_bf zI9I!(B=8D&8EjH1{J_Ycm+CovZ`hk}9!RlSEYxG9JkCDzQ{8nMFO{lXNZsnayfh#Z ziL+jI4h}rNA-z#c?2^Rs8doT?jI5PtGT+r<>AuOe4MJ7zxCMRfm95tNJEQ;4r*}CE zuS5a)!s(qW@)eqS=UTJU+qzfYu?Kc$irv1Vw}Y)){g9WZqY&6G{Bmt0*W>lX=NuO` z&hNv_TjS?;T)ZOm6pnQ?>dOVGGn1Qw*{3&G0Wbx(zBf_?i&exrAwYohXIYm3;@lL` zF?4zGJApIPgTdq?+yn~lm%HgNu6b2L z?q{-}xBJwjI*uxBERHUoNck$Xdj^CUWWLX1!eOUg^ZDHU6cQx4Z$y4Uzmf#Q-b4V#a19BIJ8$Xc1a}6n6vM7)tZ`EP~KXYoyIssBvXva z18<;FDt$?~JZf}FX4Y6Zh0&oWmBMJdW9+Z3Pr>R)OH&hEL0<3%hl*?Y7e|Sh-(X-q zIHyQ>|M3{ajopXegXhvCL5(@eri-vpjf8pgdBVX_C0swY)D$Pb=JDzb{yuJ%yYG`3liMks7 EH$v^I*#H0l diff --git a/widget/testdata/table/filled.png b/widget/testdata/table/filled.png index a259b549c43325d9c4952d8a978ff5ea4d6fbe24..5683f037802a26eb9977da48e957bd20140fef76 100644 GIT binary patch delta 421 zcmV;W0b2gI1+@i`Bw2h(L_t(|ob22&Zku2jfZ@8zmMi2uxk}EGbA~HqFcwg$RXY^k zPMEmjd4?#8EIx);e;D}uv@FXv*z*0WZ-B=o4w5)X;vk8GwyYd5>*M3YtVf%*F2Tu@ zAp$91q^I?tj@*GW>-bsIG>t!9uh&06$8lVL(#b&*2kEjtl!jsWqMP9e^E{8^c)Q)k z-+ul6`uh6UCpVrsUS3}AeSgC+95BVKO`bW}!N$pPxm@lvZ2d3HtjC$PzOs{(paCC| zkP96)-cC2m+vn^+93&fWr(@&ItmK)49oTp?E3fS2k%1tSAOQ*;jknXy^7c795C_S| z+v(VNGb?%KUc z%-Xap%QQ{%Jiouc|NE0p4w5)Xmm|NWoBxZGgCq`;I7s3kiG%bb00960fWwTQ$5J18 P00000NkvXXu0mjf>p#<1 delta 416 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 Hu0mjf0bu$L delta 3056 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 literal 2336 zcmeHJ`#0NZ9(L-ic52XV71Kc+twjteb~@t{Q4_behqjnzkfa)yj<|%l-?ClXT2)eY zNy%VlOkG2eu>=wKTM>$6gGdQdLqrmdxF!4De_(ch-E;OmpZD{=?|FZCpY!=V&vV|~ zyFQ*;=dYYsQ&ZFO_JZFB*5!ZCb7z2D{568Drgl!~4ZrE1^1}`<)~hj0eN=+QRysQ+ zI?^1w94QvoL-&a{|7dA*_Zoje^C`+;p>aU}{)K0=d3}bnd8X&I2J6hDOfI`U-O%KK z+#9QI|~NBs)$`6uT@juzMRT%@wKW0)KFrnwh-X zSgl3>o}2c67X^ZsM1q)cu#=R2`}Xb95sZhYr}`6D)56D*kzh;9adt@DWrwI@3KVP3ue-o@v32A>ub6g(ST z)p1eu2_*Auwnz0Wwf878CT4mofjvK8Tv{4<5F8kI#n>2yL_*W$QJI-g;k@D1KhJ)W zGw4%m4}nnY>c%$W%`WDW&{?TbQIubQ-QVAuLn4t+T>A`YEiE%EE5`XA0QME!*UKv_ zE-)Bj9^-jKbbP1G>zY(5)yC)CrmK|4q|(xX)s~O)(_wvdRCF{$zKGQxC1|7y^1tc@ zt``;-vY5<1m%Y^qk_>;G4>diVBMJ zRrn5M;?=8HBvjgXI4v7NQ5vMJN|u2n0fwB}oQK_+byuC5;K|lahHfhg6CL_TmM+yP)?Af#Vw&S5~t*xzexEG|lZU0JFRkJb56YZgbGh99{(hM1gjQ3txtarV*^7%u*?4k!yi-vJ zzb1B3Bv&ex>YyfI(COUmkH$Nzx$ps@47%5+-rn9GG5v$X-t~g);DUDsvYBsmpr`wD z?4-?hu1Zx(B5^nzGMNlfzR{D9Ni2-CN9+A+?GCOLjk}s$cX5fKaVOrs#YRR_5Rmq8 z)`nTpcwu3oL?Y?wai(&xP_Usk;eeOSR30_*VwlIf-3*j?Vq#)u=A~`;!-pm?7_+{9 z>p5dB7`O8$M<^7kuCCs}&pM9o;B6ipr>CV+4%kd2O;}|plCfYAD=RB7SbCTNQ!1+4 zo82vRyM&eLyPbjp9oPx(@negNxd>2%CZtnJmHt*Lh?w9LRGFcnLyI;R7M-ilK0ouM zZ=1@@+Ff?Q+zAL+z_Xy7nVAcpYN(Q?D&P8IH-$m~=XS?R+I9^&#%=`AWu|o89DvV1 z)TA6!nws*7M3{8!YQ29X4%gD$ynEg64aRh|Iv9mgZjxguA}4Xr96)znT?9bs7{*67 zErO+y-Ji$V*%FD6!NL0}&LjuL`g&+qmU3^eB@rJI5)v0TyQr;^O{39PaVcqON4I)= zmx~4WzV-JCHzt<9Z?eH1W{(Quas~^P#CYPszyRPVB2l!}lt?5hDY@LSbUF$mOioVz zA}&SIgi_CLz+VKC6u?q9ANc_pV3Vv{+?y_4_uiJ7-P`3z%0Cp7NL3E_8YYt~g5JwY5I%1g(!)8Xg`7ln&`t ztO50vtrz(QHcFuKe`1I(M<22QFF%p7svHv=e*E#hWE8|YIRjD+*`8in^1Alu1s&+8 zeKIO?s#0aCmlquq(-qvj?+G7F=syN;Ad5JSiAoqIF2M^?XBw!j1w>}oO@+{& z^|D^p{vuD(G(~^kFRXs|S@(YZwH{7SADTDMIj3~zSkmdV0tX~9Pxb(ST$3RRD}Rn< zg3o{Jt+&i(^COQulBe;gW5{+|re)G*Y*VotUHGlnn|B)j{&Ye3qckbM_wl?O}0wd@|$1n`L-EOs7 z=gpf}QBjddB%XctS*O!kUteEVR@Twc(cj;%l=As}+qZ8Ig+kX~f4yNC+qZ8Y92}hN zu_K=@d!|ez5>~5qA}jop6)RTw{eHtR^zQrf&p(ewqq}zPvRM8aRW%d}OCjpT6$8>vWMyspjV9P$)DsG<5p(>87Tp%xX8>a6`^`Fx6dNlqQpD zY;5eMmtOLCJeU5d%jMd+bAM+%9?#3jB9TZ*NlE6R&1O?dC6mcWBvM>loV`4mOy=bk zA;jfHSyxy0%rnoJOs0;Gj+`!akrs=ky}f<$;>8mm*}Qr4{C0A)%uiNDK$7ac=+()HEY)7>B_EpM0W}N~Kb3*RFl= z!3XpB0X`<(6-JrqGC&%QDy8gpdmiV=Z0U457!2Aj%3eM`J{}AP%gV|!XF@0#R~}`i zOOwg;FBOUDX+lvdrSzvi6p1{VXp}(SaekAK10@$XUqz>c<~{y!YOF^Sg#rCM5AHf`Dz zkH=4*JlWmdJ!8g~wp@RKp;?CTf27c+RO#p4;?!6%P+q;9FE&= zyKR4x-jXSxkdG;Igu`KdW&i&E{;saBnwpx1hK7R&5ANHyPbu~L@4xr-^t|@kYxC#N zzxwK{Km72+?(XiKEqwd!x3O4k*|KF0hhxW%9l!qit5T}3udkz{!)CKBS+XP=jh2*@ z3=R&qx3?D+6*V_EpEz+sU-DQf_43Ov_w|4E)z{ZM9FES;POd)uPYQgdGz`P*^~Pc` zx7+>w_uoJL^wX(S>b>{g+pu9nOG}GVs;a7L_wL>I+;fjoYIJn;si&S=v}lo1YSE%a z&p-eC0}niqy|w%9yD#&z)9G}%TniU2?CI%QzkYr8b=MCbJh*b@%Ju8lE2VC{@y376 zn>QanetgD^83O|Yot>Qv7cNvvRaaO48|P1jp}?c`cs#Ga{(AJHj*gC+nwp`ZAziBe zt&eClnoK7D_~Q?~ufOJ+YxENv8XBxt>zOlWvTu))OeUR9=kV}wC=@abBNB;>jEszq zjy5+p=e+3R#fuLdIG`UE7Z>|{KAV$h1`K~o75E-x#flZLyzpN_v(;4`H*Yu2oF>(=exzkm7iKl!UqNd-PrX0)}n&7M7b-@bjbX3bi@eEHjNzdbTCqLhlo zVn6-#Q)aafKKLMc(fFw=JrBd;DytlV^lHQ3aU|P(S zfBoY#n>TLU_}p{Pty;C}(MKPB^UXIOfBf;{;^KHb-q_gK(9ocis;sOmE-ruGuwjGQ zY<4&t+qP}XK0#iyX3fCBz@|-`EEY>+W8)on+@Y6m*|KHNo;{m4Z!Re*F`Lc1cI~?T z_S-|DP-kbS?z^h0>ctmdEH5vA;)y5r?Ai0_r=Ob5=KJrz-|co!-uofi^!*jvSS)53 z#>|;B^`YJmKm5?$-Mx43-m!nNv2ZwCSy`F$A*B`!2CY`>rALI(XfzxSS5#DF{>Ny1 zd^`{cSglrlz?u;V1nhQu_W2WXOqZGRQY9rNbLPysbor$>lFF8S?3k_eqU~$?`H@E+$gs&$7E{Yaqs%Xl$5T^N)7siP*#p635)`G!<2io(xM3LYzWZ)XO-)Nn zODGiT?d?5x?ws9jzxn2y>+0(CGk^Vl|IwpI&!0a(ckbNQ)>h`!0wd@`$1n`L-EOs7 z=gpf}QBjddB%XctS*O!kS65e7R@UC$-q+Wsl=As}J9g{{g+kX~f4yNCJ9g|C7#NuB zu_K=@d!|ez5>~5qB2V}`D_5@c`~8Mt=)?EtpMM^WMtAStZL$0{$l0@Jzkl=2JI&3_ z-QC^GmMz=5b*oaUwYBxtS6@AN@ZghAK6wSN2$?Q#ru2Hf+qP}{`RAXrH=0bQ%-1fL zYumPMr%#`r_{h$jIdk20*XbgaQcX=wp-^aWaPZ8TGmVXnnWx=w!wos(!Bls7QJPGq z(b3VDUV6#n@r?gdm&>(l*MF{fJf4@4MIw=sl9J3ro6V+_N+y$$NTj&9ID30Cnas;8 zLWs+YvbMJNnP;9cnN02N?KxfQA}tn6TU*g?@4pYN)xuA2DEL5|D5(5bDhZEI`G?lPTD=eY3Z6ZYxE_#Qfgpe;K-39YuB#L%PT?%)0M4|aq85mojZ4?QmLY%B7IcNOOYRc z{BeJO{|hg?pdWts-FN%;?F)y)@pydMvSp7w_SnpsGt=pGPfyP$pM0W}N~Kck)~$Q+ z!3XpB20kX;6-JrqGC&%QDy8gpdmiV=Z0U457!2Aj$=*ITHWmy9%gV|!S3)QlR~}`i zOOwg;4;6{&X+lvdrS!W$6p1{VXp}(Saeb4J10@%4ei<bzDlXQ@3l^uIz<2kx|G?mc8-D8^?|v z(_fdDm)~;BEe}2PkY2m+e-{h}ola-o$CgT^e*E#rd+)tB?|Uu)g&d_)s=2v&^XAR* zc>L6L^c~IC1RQu|y)# z*x1<8(xR8CcDvnmb#;diA08bYz4qE`*Q{BSeUAa9)ZpOY*I$1g_I<>#MK68W|axJ9qA#ci!o6IQ)M9kt0U}fj~`7&AN5#G7GjJK79C>Uw&~o9Jk$e z+a!PeNTz^7KBvqP4u|#1{(XIYot>Qv7cQ)?uRnC?(Ek1Vl~TX|{(Egvkb!?)jl8;ix3FJJC(ICk#b`RlL0Dy4dRd)wRFZ8qD|rAwpHXh})Q zz`#ITTU$|4QBzaX$&)AblE+G^mtTIlx3_<{uCC7EaCCHZu=?=dDe#%nFbuEP8;ix< zZuj@!fB*E;Pp49;_uhMNAj-#fuj| z|NQe0Jn%sF-tN2azRcH7r_<$fEn2jwySsbCh7H;4t{*ydXw|A!8#ZiEO5J$ljaz@V zY&mh_#Ecm;`uqDkIyx3DTBMY!uCD$kuAd4+fk)}_cwT?~_2?z-?d=N}E*u;j)TR1- zKBZJN8cimXfBf->KGt7z%{BTP>+9>SR_ocbXR~jQl1wI@PUq0jP$(2K3?mYW3=a>F zjEpojHRZhMk|j$H9z3WY78e)$d_I4h%~n}isf$!fWp3$*@e2G1vU26hS6+E#&z?ON zi$&i9O5f(kZnx`m&5DYOhaY~ptgK8&nSByzv)S}vSNrqNKeun+{>2wxSS*&Bni~Dd z61}(V`~B#Rwk&tubysa|Z7dcmEiKJFXZ#0KkWt_>r8aBUto7^HA2@Je#fpCwRaI3c zlc}+>F=wtid-iNR9uEWp<>lr2xUVl<48zb*IC}JGWo2dNetRE%^pU{Or;Dh8P2M!!quwa2cztl`7QzR16Q{$IkeyQ(LT2@xp z*x2~~`|k&XL8a92@Ngs&x%JjtKl|)6m&=t-r&Fnv*XxZ$A`J}<7K^2)rze$4#pCgw zo}NkiNlXFLVy67-AD`L0Y15|Xo_lWf>eY`v`skZ)zWMm$j~5pg$K!wThK7dv`g)~Q zWo2b?aq-5D8_j03!{OMzeS7u=^4hg)`}_MhZ{BRNSQ;7{?zrO)y?yJ}t$X+G-Lhp% zNlA&>Y~HX(kJ!dyF~cxs&YXX#PxXHI;fJoSu6_IVjgF3n!{N%x%A7YTwO}x4wOYrY5k{lY za5!91QIYu{qp`8EKp Date: Tue, 2 May 2023 11:23:20 -0600 Subject: [PATCH 24/29] Add ability to specify custom metadata when doing a release as forgotten. --- cmd/fyne/internal/commands/release.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/fyne/internal/commands/release.go b/cmd/fyne/internal/commands/release.go index 1544d6038d..1723ffddbc 100644 --- a/cmd/fyne/internal/commands/release.go +++ b/cmd/fyne/internal/commands/release.go @@ -121,6 +121,11 @@ func Release() *cli.Command { Value: "", Destination: &r.icon, }, + &cli.GenericFlag{ + Name: "metadata", + Usage: "Specify custom metadata key value pair that you do not want to store in your FyneApp.toml (key=value)", + Value: &r.customMetadata, + }, }, Action: r.releaseAction, } From efbb4954e973b858ac8c13211c8cdb7beb42917d Mon Sep 17 00:00:00 2001 From: Jacalz Date: Fri, 2 Jun 2023 20:33:37 +0200 Subject: [PATCH 25/29] Fix horizontal MinSize calculation for CheckGroup Fixes #3005 --- widget/check_group.go | 16 +++++++++------- widget/check_group_test.go | 4 ++-- .../check_group/layout_multiple_horizontal.xml | 12 ++++++------ .../layout_multiple_horizontal_disabled.xml | 12 ++++++------ .../layout_multiple_selected_horizontal.xml | 8 ++++---- ...out_multiple_selected_horizontal_disabled.xml | 8 ++++---- .../disabled_append_none_selected.xml | 10 +++++----- 7 files changed, 36 insertions(+), 34 deletions(-) diff --git a/widget/check_group.go b/widget/check_group.go index d468e1fde0..ad1f28e5b2 100644 --- a/widget/check_group.go +++ b/widget/check_group.go @@ -217,13 +217,15 @@ func (r *checkGroupRenderer) MinSize() fyne.Size { height := float32(0) for _, item := range r.items { itemMin := item.MinSize() - if r.checks.Horizontal { - height = fyne.Max(height, itemMin.Height) - width += itemMin.Width - } else { - width = fyne.Max(width, itemMin.Width) - height += itemMin.Height - } + + width = fyne.Max(width, itemMin.Width) + height = fyne.Max(height, itemMin.Height) + } + + if r.checks.Horizontal { + width = width * float32(len(r.items)) + } else { + height = height * float32(len(r.items)) } return fyne.NewSize(width, height) diff --git a/widget/check_group_test.go b/widget/check_group_test.go index e8efc9a457..8605ccb806 100644 --- a/widget/check_group_test.go +++ b/widget/check_group_test.go @@ -116,12 +116,12 @@ func TestCheckGroup_Layout(t *testing.T) { }, "multiple_horizontal": { horizontal: true, - options: []string{"Foo", "Bar"}, + options: []string{"Foo", "Barley"}, }, "multiple_horizontal_disabled": { disabled: true, horizontal: true, - options: []string{"Foo", "Bar"}, + options: []string{"Foo", "Barley"}, }, "multiple_selected": { options: []string{"Foo", "Bar"}, diff --git a/widget/testdata/check_group/layout_multiple_horizontal.xml b/widget/testdata/check_group/layout_multiple_horizontal.xml index f9ffc07fdf..2bfd74f2a6 100644 --- a/widget/testdata/check_group/layout_multiple_horizontal.xml +++ b/widget/testdata/check_group/layout_multiple_horizontal.xml @@ -1,17 +1,17 @@ - + - - + + - Foo + Foo - + - Bar + Barley diff --git a/widget/testdata/check_group/layout_multiple_horizontal_disabled.xml b/widget/testdata/check_group/layout_multiple_horizontal_disabled.xml index e332b2a4ee..e88a895960 100644 --- a/widget/testdata/check_group/layout_multiple_horizontal_disabled.xml +++ b/widget/testdata/check_group/layout_multiple_horizontal_disabled.xml @@ -1,17 +1,17 @@ - + - - + + - Foo + Foo - + - Bar + Barley diff --git a/widget/testdata/check_group/layout_multiple_selected_horizontal.xml b/widget/testdata/check_group/layout_multiple_selected_horizontal.xml index 48954a9dcb..f1ec2b0716 100644 --- a/widget/testdata/check_group/layout_multiple_selected_horizontal.xml +++ b/widget/testdata/check_group/layout_multiple_selected_horizontal.xml @@ -1,17 +1,17 @@ - + - Foo + Foo - + - Bar + Bar diff --git a/widget/testdata/check_group/layout_multiple_selected_horizontal_disabled.xml b/widget/testdata/check_group/layout_multiple_selected_horizontal_disabled.xml index a71193af03..879d0fd6eb 100644 --- a/widget/testdata/check_group/layout_multiple_selected_horizontal_disabled.xml +++ b/widget/testdata/check_group/layout_multiple_selected_horizontal_disabled.xml @@ -1,17 +1,17 @@ - + - Foo + Foo - + - Bar + Bar diff --git a/widget/testdata/radio_group/disabled_append_none_selected.xml b/widget/testdata/radio_group/disabled_append_none_selected.xml index 7eb932e459..dcadd4ab27 100644 --- a/widget/testdata/radio_group/disabled_append_none_selected.xml +++ b/widget/testdata/radio_group/disabled_append_none_selected.xml @@ -4,21 +4,21 @@ - + Option A - + Option B - - - Option C + + + Option C From 992446547a945477b0a298412eddf677e24b194c Mon Sep 17 00:00:00 2001 From: Jacalz Date: Fri, 2 Jun 2023 20:38:14 +0200 Subject: [PATCH 26/29] Remove incorrect test markup for RadioGroup that slipped in --- .../radio_group/disabled_append_none_selected.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/widget/testdata/radio_group/disabled_append_none_selected.xml b/widget/testdata/radio_group/disabled_append_none_selected.xml index dcadd4ab27..7eb932e459 100644 --- a/widget/testdata/radio_group/disabled_append_none_selected.xml +++ b/widget/testdata/radio_group/disabled_append_none_selected.xml @@ -4,21 +4,21 @@ - + Option A - + Option B - - - Option C + + + Option C From b27c1549c39f3a8a67baa2eea3258a285ef0ab7e Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 2 Jun 2023 20:32:39 +0100 Subject: [PATCH 27/29] Two more fixes ready to release --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bae26719e5..3925212675 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ This file lists the main changes with each version of the Fyne toolkit. More detailed release notes can be found on the [releases page](https://github.com/fyne-io/fyne/releases). -## 2.3.5 - 5 June 2023 +## 2.3.5 - 6 June 2023 ### Fixed @@ -19,6 +19,8 @@ More detailed release notes can be found on the [releases page](https://github.c * Links in Markdown/Rich Text lists breaks formatting (#2911) * Crash when reducing window to taskbar with popup opened (#3877) * RichText vertical scroll will truncate long content with horizontal lines (#3929) +* Custom metadata would not apply with `fyne release` command +* Horizontal CheckGroup overlap when having long text (#3005) ## 2.3.4 - 3 May 2023 From 5005d1d6ead47c83c0487dd941ac7ba11a39e4db Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 2 Jun 2023 21:05:23 +0100 Subject: [PATCH 28/29] Update CHANGELOG for release --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3925212675..d22207b4e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ More detailed release notes can be found on the [releases page](https://github.c * RichText vertical scroll will truncate long content with horizontal lines (#3929) * Custom metadata would not apply with `fyne release` command * Horizontal CheckGroup overlap when having long text (#3005) +* Fix focused colour of coloured buttons (#3462) +* Menu separator not visible with light theme (#3814) ## 2.3.4 - 3 May 2023 From 5ee6eba1a5a2eaa05b147d3d175149845e7220fe Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 3 Jun 2023 10:12:07 +0100 Subject: [PATCH 29/29] Update systray library for fixes --- go.mod | 2 +- go.sum | 4 ++-- vendor/fyne.io/systray/systray_menu_unix.go | 4 ++-- vendor/fyne.io/systray/systray_unix.go | 20 ++++++++------------ vendor/modules.txt | 2 +- 5 files changed, 14 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index c3ddeb2c3f..a08249c6bd 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module fyne.io/fyne/v2 go 1.14 require ( - fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6 + fyne.io/systray v1.10.1-0.20230602210930-b6a2d6ca2a7b github.com/BurntSushi/toml v1.1.0 github.com/fredbi/uri v0.1.0 github.com/fsnotify/fsnotify v1.5.4 diff --git a/go.sum b/go.sum index 98a6c0a22d..13f533a899 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6 h1:lHt8dm97Uy9ggtnt9N6XOlsp76wXmRAh3SjReWm1e2Q= -fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= +fyne.io/systray v1.10.1-0.20230602210930-b6a2d6ca2a7b h1:MP1cUnIdF1cxrMhK9iw9H0JP3zopyD1zi84BqU6WTsE= +fyne.io/systray v1.10.1-0.20230602210930-b6a2d6ca2a7b/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= diff --git a/vendor/fyne.io/systray/systray_menu_unix.go b/vendor/fyne.io/systray/systray_menu_unix.go index 1c23a1ab7f..2d6ed207dc 100644 --- a/vendor/fyne.io/systray/systray_menu_unix.go +++ b/vendor/fyne.io/systray/systray_menu_unix.go @@ -319,7 +319,7 @@ func refresh() { dbusErr := instance.menuProps.Set("com.canonical.dbusmenu", "Version", dbus.MakeVariant(instance.menuVersion)) if dbusErr != nil { - log.Printf("systray error: failed to update menu version: %s\n", dbusErr) + log.Printf("systray error: failed to update menu version: %v\n", dbusErr) return } err := menu.Emit(instance.conn, &menu.Dbusmenu_LayoutUpdatedSignal{ @@ -329,7 +329,7 @@ func refresh() { }, }) if err != nil { - log.Printf("systray error: failed to emit layout updated signal: %s\n", err) + log.Printf("systray error: failed to emit layout updated signal: %v\n", err) } } diff --git a/vendor/fyne.io/systray/systray_unix.go b/vendor/fyne.io/systray/systray_unix.go index cd6ecb9bc2..842633ce3e 100644 --- a/vendor/fyne.io/systray/systray_unix.go +++ b/vendor/fyne.io/systray/systray_unix.go @@ -60,12 +60,8 @@ func SetIcon(iconBytes []byte) { return } - dbusErr := props.Set("org.kde.StatusNotifierItem", "IconPixmap", - dbus.MakeVariant([]PX{convertToPixels(iconBytes)})) - if dbusErr != nil { - log.Printf("systray error: failed to set IconPixmap prop: %s\n", dbusErr) - return - } + props.SetMust("org.kde.StatusNotifierItem", "IconPixmap", + []PX{convertToPixels(iconBytes)}) if conn == nil { return } @@ -164,18 +160,18 @@ func quit() { func nativeStart() { systrayReady() - conn, _ := dbus.ConnectSessionBus() - if conn == nil { - log.Printf("systray error: failed to connect to DBus") + conn, err := dbus.SessionBus() + if err != nil { + log.Printf("systray error: failed to connect to DBus: %v\n", err) return } - err := notifier.ExportStatusNotifierItem(conn, path, ¬ifier.UnimplementedStatusNotifierItem{}) + err = notifier.ExportStatusNotifierItem(conn, path, ¬ifier.UnimplementedStatusNotifierItem{}) if err != nil { - log.Printf("systray error: failed to export status notifier item: %s\n", err) + log.Printf("systray error: failed to export status notifier item: %v\n", err) } err = menu.ExportDbusmenu(conn, menuPath, instance) if err != nil { - log.Printf("systray error: failed to export status notifier item: %s\n", err) + log.Printf("systray error: failed to export status notifier menu: %v\n", err) return } diff --git a/vendor/modules.txt b/vendor/modules.txt index b2dab53c50..6bd50e7309 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,4 +1,4 @@ -# fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6 +# fyne.io/systray v1.10.1-0.20230602210930-b6a2d6ca2a7b ## explicit fyne.io/systray fyne.io/systray/internal/generated/menu