Skip to content

Wails3 alpha: Left clicking the systray crashes the app when systray is in flyout (Windows) #3270

Description

@tw1nk

Description

When the systray icon is hidden in the flyout thingy on windows and the systray doesn't have a window attached, the application crashes if you left click the app.

go

callstack:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x9586f4]

goroutine 1 [running, locked to thread]:
github.com/wailsapp/wails/v3/pkg/application.(*windowsSystemTray).openMenu(0xc0001d4340)
        C:/Users/calle/source/wails/v3/pkg/application/systemtray_windows.go:44 +0x34
github.com/wailsapp/wails/v3/pkg/application.InvokeSync.func1()
        C:/Users/calle/source/wails/v3/pkg/application/mainthread.go:28 +0x42
github.com/wailsapp/wails/v3/pkg/application.(*App).dispatchOnMainThread(0xc0000f3348, 0xc000126240)        
        C:/Users/calle/source/wails/v3/pkg/application/application.go:743 +0xcb
github.com/wailsapp/wails/v3/pkg/application.InvokeSync(0xc000126228)
        C:/Users/calle/source/wails/v3/pkg/application/mainthread.go:26 +0x94
github.com/wailsapp/wails/v3/pkg/application.(*SystemTray).OpenMenu(...)
        C:/Users/calle/source/wails/v3/pkg/application/systemtray.go:298
github.com/wailsapp/wails/v3/pkg/application.(*SystemTray).defaultClickHandler(0xc0000b6601?)
        C:/Users/calle/source/wails/v3/pkg/application/systemtray.go:269 +0x156
github.com/wailsapp/wails/v3/pkg/application.(*windowsSystemTray).wndProc(0xc0001d4340, 0x401, 0x3050498, 0x10202)
        C:/Users/calle/source/wails/v3/pkg/application/systemtray_windows.go:281 +0x6e
github.com/wailsapp/wails/v3/pkg/application.(*windowsApp).wndProc(0xc0002280e0, 0xe0584, 0x401, 0x3050498, 0x10202)
        C:/Users/calle/source/wails/v3/pkg/application/application_windows.go:281 +0x4fe
syscall.SyscallN(0x1c44fc61348?, {0xc000480000?, 0x0?, 0xc000480000?})
        C:/Program Files/Go/src/runtime/syscall_windows.go:544 +0x107
syscall.(*Proc).Call(0x472385?, {0xc000480000?, 0x9bccc0?, 0x2701?})
        C:/Program Files/Go/src/syscall/dll_windows.go:166 +0x1c
syscall.(*LazyProc).Call(0xf9eae0, {0xc000480000, 0x4, 0x4})
        C:/Program Files/Go/src/syscall/dll_windows.go:286 +0x4a
github.com/wailsapp/wails/v3/pkg/w32.GetMessage(...)
        C:/Users/calle/source/wails/v3/pkg/w32/user32.go:423
github.com/wailsapp/wails/v3/pkg/application.(*windowsApp).runMainLoop(0xc0002280e0)
        C:/Users/calle/source/wails/v3/pkg/application/mainthread_windows.go:62 +0x174
github.com/wailsapp/wails/v3/pkg/application.(*windowsApp).run(0xc0002280e0)
        C:/Users/calle/source/wails/v3/pkg/application/application_windows.go:189 +0xd2
github.com/wailsapp/wails/v3/pkg/application.(*App).Run(0xc0000f3348)
        C:/Users/calle/source/wails/v3/pkg/application/application.go:537 +0x3d3
main.main()
        C:/Users/calle/source/wails/v3/examples/systray/main.go:66 +0x516
[0221/195318.555:ERROR:window_impl.cc(120)] Failed to unregister class Chrome_WidgetWin_0. Error = 0        
exit status 2```

This is caused by double nil return here: 

```go
// in func(s *windowsSystemTray) bounds() (*Rect, error)
	flyoutOpen := !w32.RectInRect(bounds, &taskbarRect.Rc)
	flyoutOpen := !w32.RectInRect(bounds, &taskbarRect.Rc)
	if flyoutOpen {
		return nil, nil
	}

To Reproduce

Buidl and run the below code on windows, then move the icon in the sys tray to the flyout thingy and then left click the sys tray icon

package main

import (
	_ "embed"
	"log"

	"github.com/wailsapp/wails/v3/pkg/application"
	"github.com/wailsapp/wails/v3/pkg/icons"
)

func main() {
	app := application.New(application.Options{
		Name:        "Systray Demo",
		Description: "A demo of the Systray API",
		Assets:      application.AlphaAssets,
	})

	systemTray := app.NewSystemTray()

	window := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
		Width:         400,
		Height:        400,
		Frameless:     false,
		AlwaysOnTop:   true,
		Hidden:        true,
		DisableResize: true,
		ShouldClose: func(window *application.WebviewWindow) bool {
			window.Hide()
			return false
		},
		Windows: application.WindowsWindow{
			HiddenOnTaskbar: false,
		},
		KeyBindings: map[string]func(window *application.WebviewWindow){
			"F12": func(window *application.WebviewWindow) {
				systemTray.OpenMenu()
			},
		},
	})

	systemTray.SetIcon(icons.SystrayLight)
	systemTray.SetDarkModeIcon(icons.SystrayLight)

	myMenu := app.NewMenu()
	myMenu.Add("Wails").SetBitmap(icons.WailsLogoBlackTransparent).SetEnabled(false)

	myMenu.Add("Show Window").OnClick(func(ctx *application.Context) {
		window.Show()
	})

	myMenu.AddSeparator()
	myMenu.Add("Quit").OnClick(func(ctx *application.Context) {
		app.Quit()
	})

	systemTray.SetMenu(myMenu)

	err := app.Run()
	if err != nil {
		log.Fatal(err)
	}
}


### Expected behaviour

The application should open the systray menu and not crash

### Screenshots

_No response_

### Attempted Fixes

_No response_

### System Details

```shell
wails3 doctor


          Wails Doctor
                                


# Build Environment
Wails CLI      | v3.0.0-alpha.3
Go Version     | go1.22.0
Revision       | 12d12a33dec1d31f487b70f87bc31e80252f327c
Modified       | false
-buildmode     | exe
-compiler      | gc
CGO_ENABLED    | 0
DefaultGODEBUG | httplaxcontentlength=1,httpmuxgo121=1,tls10server=1,tlsrsakex=1,tlsunsafeekm=1
GOAMD64        | v1
GOARCH         | amd64
GOOS           | windows
vcs            | git
vcs.modified   | false
vcs.revision   | 12d12a33dec1d31f487b70f87bc31e80252f327c
vcs.time       | 2024-02-21T12:40:32Z

# System
Name              | Windows 10 Pro
Version           | 2009 (Build: 22631)
ID                | 23H2
Branding          | Windows 11 Pro
Platform          | windows
Architecture      | amd64
Go WebView2Loader | true
NSIS              | Not Installed
WebView2 Version  | 121.0.2277.128
CPU               | AMD Ryzen 7 3700X 8-Core Processor
GPU 1             | Microsoft Remote Display Adapter (Microsoft) - Driver: 10.0.22621.2861
GPU 2             | NVIDIA GeForce RTX 2070 SUPER (NVIDIA) - Driver: 31.0.15.3623
Memory            | 32GB

# Diagnosis
 SUCCESS  Your system is ready for Wails development!

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions