Skip to content

Commit

Permalink
When using quit menu item ask each window to close instead of forcing…
Browse files Browse the repository at this point in the history
… exit

Fixes fyne-io#2355
  • Loading branch information
andydotxyz committed Aug 6, 2021
1 parent d633b99 commit c885793
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 16 deletions.
2 changes: 1 addition & 1 deletion internal/driver/glfw/canvas.go
Expand Up @@ -217,7 +217,7 @@ func (c *glCanvas) buildMenu(w *window, m *fyne.MainMenu) {
if hasNativeMenu() {
setupNativeMenu(w, m)
} else {
c.setMenuOverlay(buildMenuOverlay(m, c))
c.setMenuOverlay(buildMenuOverlay(m, w))
}
}

Expand Down
6 changes: 3 additions & 3 deletions internal/driver/glfw/driver_test.go
Expand Up @@ -16,7 +16,7 @@ import (
)

func Test_gLDriver_AbsolutePositionForObject(t *testing.T) {
w := createWindow("Test")
w := createWindow("Test").(*window)

cr1c1 := widget.NewLabel("row 1 col 1")
cr1c2 := widget.NewLabel("row 1 col 2")
Expand All @@ -40,7 +40,7 @@ func Test_gLDriver_AbsolutePositionForObject(t *testing.T) {
// We want to test the handling of the canvas' Fyne menu here.
// We work around w.SetMainMenu because on MacOS the main menu is a native menu.
c := w.Canvas().(*glCanvas)
movl := buildMenuOverlay(mm, c)
movl := buildMenuOverlay(mm, w)
c.Lock()
c.setMenuOverlay(movl)
c.Unlock()
Expand All @@ -54,7 +54,7 @@ func Test_gLDriver_AbsolutePositionForObject(t *testing.T) {
ovl := widget.NewModalPopUp(ovlContent, c)
ovl.Show()

repaintWindow(w.(*window))
repaintWindow(w)
// accessing the menu bar's actual CanvasObjects isn't straight forward
// 0 is the shadow
// 1 is the menu bar’s underlay
Expand Down
16 changes: 11 additions & 5 deletions internal/driver/glfw/menu.go
Expand Up @@ -4,17 +4,17 @@ import (
"fyne.io/fyne/v2"
)

func buildMenuOverlay(menus *fyne.MainMenu, c fyne.Canvas) fyne.CanvasObject {
func buildMenuOverlay(menus *fyne.MainMenu, w *window) fyne.CanvasObject {
if len(menus.Items) == 0 {
fyne.LogError("Main menu must have at least one child menu", nil)
return nil
}

menus = addMissingQuit(menus)
return NewMenuBar(menus, c)
menus = addMissingQuit(menus, w)
return NewMenuBar(menus, w.canvas)
}

func addMissingQuit(menus *fyne.MainMenu) *fyne.MainMenu {
func addMissingQuit(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]
Expand All @@ -30,7 +30,13 @@ func addMissingQuit(menus *fyne.MainMenu) *fyne.MainMenu {
for _, item := range menus.Items[0].Items {
if item.IsQuit && item.Action == nil {
item.Action = func() {
fyne.CurrentApp().Quit()
for _, win := range w.driver.AllWindows() {
if glWin, ok := win.(*window); ok {
glWin.closed(glWin.view())
} else {
win.Close() // for test windows
}
}
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions internal/driver/glfw/menu_test.go
Expand Up @@ -14,14 +14,14 @@ import (

func Test_Menu_Empty(t *testing.T) {
w := createWindow("Menu Test").(*window)
bar := buildMenuOverlay(fyne.NewMainMenu(), w.canvas)
bar := buildMenuOverlay(fyne.NewMainMenu(), w)
assert.Nil(t, bar) // no bar but does not crash
}

func Test_Menu_AddsQuit(t *testing.T) {
w := createWindow("Menu Test").(*window)
mainMenu := fyne.NewMainMenu(fyne.NewMenu("File"))
bar := buildMenuOverlay(mainMenu, w.canvas)
bar := buildMenuOverlay(mainMenu, w)
assert.NotNil(t, bar)
assert.Equal(t, 1, len(mainMenu.Items))
assert.Equal(t, 2, len(mainMenu.Items[0].Items)) // separator+quit inserted
Expand All @@ -32,15 +32,15 @@ func Test_Menu_LeaveQuit(t *testing.T) {
w := createWindow("Menu Test").(*window)
quitFunc := func() {}
mainMenu := fyne.NewMainMenu(fyne.NewMenu("File", fyne.NewMenuItem("Quit", quitFunc)))
bar := buildMenuOverlay(mainMenu, w.canvas)
bar := buildMenuOverlay(mainMenu, w)
assert.NotNil(t, bar)
assert.Equal(t, 1, len(mainMenu.Items[0].Items)) // no separator added
assert.Equal(t, reflect.ValueOf(quitFunc).Pointer(), reflect.ValueOf(mainMenu.Items[0].Items[0].Action).Pointer())
}
func Test_Menu_LeaveQuit_AddAction(t *testing.T) {
w := createWindow("Menu Test").(*window)
mainMenu := fyne.NewMainMenu(fyne.NewMenu("File", fyne.NewMenuItem("Quit", nil)))
bar := buildMenuOverlay(mainMenu, w.canvas)
bar := buildMenuOverlay(mainMenu, w)
assert.NotNil(t, bar)
assert.Equal(t, 1, len(mainMenu.Items[0].Items)) // no separator added
assert.NotNil(t, mainMenu.Items[0].Items[0].Action) // quit action was added
Expand All @@ -54,7 +54,7 @@ func Test_Menu_CustomQuit(t *testing.T) {
quitItem.IsQuit = true

mainMenu := fyne.NewMainMenu(fyne.NewMenu("File", quitItem))
bar := buildMenuOverlay(mainMenu, w.canvas)
bar := buildMenuOverlay(mainMenu, w)

assert.NotNil(t, bar)
assert.Equal(t, 1, len(mainMenu.Items[0].Items)) // no separator added
Expand All @@ -66,7 +66,7 @@ func Test_Menu_CustomQuit_NoAction(t *testing.T) {
quitItem := fyne.NewMenuItem("Beenden", nil)
quitItem.IsQuit = true
mainMenu := fyne.NewMainMenu(fyne.NewMenu("File", quitItem))
bar := buildMenuOverlay(mainMenu, w.canvas)
bar := buildMenuOverlay(mainMenu, w)

assert.NotNil(t, bar)
assert.Equal(t, 1, len(mainMenu.Items[0].Items)) // no separator added
Expand Down
2 changes: 1 addition & 1 deletion internal/driver/glfw/window_test.go
Expand Up @@ -82,7 +82,7 @@ func TestWindow_ToggleMainMenuByKeyboard(t *testing.T) {
w := createWindow("Test").(*window)
c := w.Canvas().(*glCanvas)
m := fyne.NewMainMenu(fyne.NewMenu("File"), fyne.NewMenu("Edit"), fyne.NewMenu("Help"))
menuBar := buildMenuOverlay(m, c).(*MenuBar)
menuBar := buildMenuOverlay(m, w).(*MenuBar)
c.Lock()
c.setMenuOverlay(menuBar)
c.Unlock()
Expand Down

0 comments on commit c885793

Please sign in to comment.